/*! * Copyright 2019-2020 XGBoost contributors */ #include #include #include #include #include #include "../helpers.h" #include "../../../src/common/io.h" TEST(c_api, XGDMatrixCreateFromMatDT) { std::vector col0 = {0, -1, 3}; std::vector col1 = {-4.0f, 2.0f, 0.0f}; const char *col0_type = "int32"; const char *col1_type = "float32"; std::vector data = {col0.data(), col1.data()}; std::vector types = {col0_type, col1_type}; DMatrixHandle handle; XGDMatrixCreateFromDT(data.data(), types.data(), 3, 2, &handle, 0); std::shared_ptr *dmat = static_cast *>(handle); xgboost::MetaInfo &info = (*dmat)->Info(); ASSERT_EQ(info.num_col_, 2); ASSERT_EQ(info.num_row_, 3); ASSERT_EQ(info.num_nonzero_, 6); for (const auto &batch : (*dmat)->GetBatches()) { ASSERT_EQ(batch[0][0].fvalue, 0.0f); ASSERT_EQ(batch[0][1].fvalue, -4.0f); ASSERT_EQ(batch[2][0].fvalue, 3.0f); ASSERT_EQ(batch[2][1].fvalue, 0.0f); } delete dmat; } TEST(c_api, XGDMatrixCreateFromMat_omp) { std::vector num_rows = {100, 11374, 15000}; for (auto row : num_rows) { int num_cols = 50; int num_missing = 5; DMatrixHandle handle; std::vector data(num_cols * row, 1.5); for (int i = 0; i < num_missing; i++) { data[i] = std::numeric_limits::quiet_NaN(); } XGDMatrixCreateFromMat_omp(data.data(), row, num_cols, std::numeric_limits::quiet_NaN(), &handle, 0); std::shared_ptr *dmat = static_cast *>(handle); xgboost::MetaInfo &info = (*dmat)->Info(); ASSERT_EQ(info.num_col_, num_cols); ASSERT_EQ(info.num_row_, row); ASSERT_EQ(info.num_nonzero_, num_cols * row - num_missing); for (const auto &batch : (*dmat)->GetBatches()) { for (size_t i = 0; i < batch.Size(); i++) { auto inst = batch[i]; for (auto e : inst) { ASSERT_EQ(e.fvalue, 1.5); } } } delete dmat; } } namespace xgboost { TEST(c_api, Version) { int patch {0}; XGBoostVersion(NULL, NULL, &patch); // NOLINT ASSERT_EQ(patch, XGBOOST_VER_PATCH); } TEST(c_api, ConfigIO) { size_t constexpr kRows = 10; auto p_dmat = RandomDataGenerator(kRows, 10, 0).GenerateDMatix(); std::vector> mat {p_dmat}; std::vector labels(kRows); for (size_t i = 0; i < labels.size(); ++i) { labels[i] = i; } p_dmat->Info().labels_.HostVector() = labels; std::shared_ptr learner { Learner::Create(mat) }; BoosterHandle handle = learner.get(); learner->UpdateOneIter(0, p_dmat); char const* out[1]; bst_ulong len {0}; XGBoosterSaveJsonConfig(handle, &len, out); std::string config_str_0 { out[0] }; auto config_0 = Json::Load({config_str_0.c_str(), config_str_0.size()}); XGBoosterLoadJsonConfig(handle, out[0]); bst_ulong len_1 {0}; std::string config_str_1 { out[0] }; XGBoosterSaveJsonConfig(handle, &len_1, out); auto config_1 = Json::Load({config_str_1.c_str(), config_str_1.size()}); ASSERT_EQ(config_0, config_1); } TEST(c_api, JsonModelIO) { size_t constexpr kRows = 10; dmlc::TemporaryDirectory tempdir; auto p_dmat = RandomDataGenerator(kRows, 10, 0).GenerateDMatix(); std::vector> mat {p_dmat}; std::vector labels(kRows); for (size_t i = 0; i < labels.size(); ++i) { labels[i] = i; } p_dmat->Info().labels_.HostVector() = labels; std::shared_ptr learner { Learner::Create(mat) }; learner->UpdateOneIter(0, p_dmat); BoosterHandle handle = learner.get(); std::string modelfile_0 = tempdir.path + "/model_0.json"; XGBoosterSaveModel(handle, modelfile_0.c_str()); XGBoosterLoadModel(handle, modelfile_0.c_str()); std::string modelfile_1 = tempdir.path + "/model_1.json"; XGBoosterSaveModel(handle, modelfile_1.c_str()); auto model_str_0 = common::LoadSequentialFile(modelfile_0); auto model_str_1 = common::LoadSequentialFile(modelfile_1); ASSERT_EQ(model_str_0.front(), '{'); ASSERT_EQ(model_str_0, model_str_1); } } // namespace xgboost