Remove leaf vector, add tree serialisation test, fix Windows tests (#3989)

This commit is contained in:
Rory Mitchell
2018-12-13 10:28:38 +13:00
committed by GitHub
parent 84a3af8dc0
commit 3d81c48d3f
9 changed files with 95 additions and 36 deletions

View File

@@ -48,14 +48,14 @@ class QuantileHistMock : public QuantileHistMaker {
BuildHist(gpair, row_set_collection_[nid],
gmat, quantile_index_block, hist_[nid]);
std::vector<GradientPairPrecise> solution {
{0.27, 0.29}, {0.27, 0.29}, {0.47, 0.49},
{0.27, 0.29}, {0.57, 0.59}, {0.26, 0.27},
{0.37, 0.39}, {0.23, 0.24}, {0.37, 0.39},
{0.27, 0.28}, {0.27, 0.29}, {0.37, 0.39},
{0.26, 0.27}, {0.23, 0.24}, {0.57, 0.59},
{0.47, 0.49}, {0.47, 0.49}, {0.37, 0.39},
{0.26, 0.27}, {0.23, 0.24}, {0.27, 0.28},
{0.57, 0.59}, {0.23, 0.24}, {0.47, 0.49}};
{0.27f, 0.29f}, {0.27f, 0.29f}, {0.47f, 0.49f},
{0.27f, 0.29f}, {0.57f, 0.59f}, {0.26f, 0.27f},
{0.37f, 0.39f}, {0.23f, 0.24f}, {0.37f, 0.39f},
{0.27f, 0.28f}, {0.27f, 0.29f}, {0.37f, 0.39f},
{0.26f, 0.27f}, {0.23f, 0.24f}, {0.57f, 0.59f},
{0.47f, 0.49f}, {0.47f, 0.49f}, {0.37f, 0.39f},
{0.26f, 0.27f}, {0.23f, 0.24f}, {0.27f, 0.28f},
{0.57f, 0.59f}, {0.23f, 0.24f}, {0.47f, 0.49f}};
for (size_t i = 0; i < hist_[nid].size; ++i) {
GradientPairPrecise sol = solution[i];

View File

@@ -0,0 +1,87 @@
// Copyright by Contributors
#include <gtest/gtest.h>
#include <xgboost/tree_model.h>
#include "../helpers.h"
#include "dmlc/filesystem.h"
namespace xgboost {
// Manually construct tree in binary format
// Do not use structs in case they change
// We want to preserve backwards compatibility
TEST(Tree, Load) {
dmlc::TemporaryDirectory tempdir;
const std::string tmp_file = tempdir.path + "/tree.model";
std::unique_ptr<dmlc::Stream> fo(dmlc::Stream::Create(tmp_file.c_str(), "w"));
// Write params
EXPECT_EQ(sizeof(TreeParam), (31 + 6) * sizeof(int));
int num_roots = 1;
int num_nodes = 2;
int num_deleted = 0;
int max_depth = 1;
int num_feature = 0;
int size_leaf_vector = 0;
int reserved[31];
fo->Write(&num_roots, sizeof(int));
fo->Write(&num_nodes, sizeof(int));
fo->Write(&num_deleted, sizeof(int));
fo->Write(&max_depth, sizeof(int));
fo->Write(&num_feature, sizeof(int));
fo->Write(&size_leaf_vector, sizeof(int));
fo->Write(reserved, sizeof(int) * 31);
// Write 2 nodes
EXPECT_EQ(sizeof(RegTree::Node),
3 * sizeof(int) + 1 * sizeof(unsigned) + sizeof(float));
int parent = -1;
int cleft = 1;
int cright = -1;
unsigned sindex = 5;
float split_or_weight = 0.5;
fo->Write(&parent, sizeof(int));
fo->Write(&cleft, sizeof(int));
fo->Write(&cright, sizeof(int));
fo->Write(&sindex, sizeof(unsigned));
fo->Write(&split_or_weight, sizeof(float));
parent = 0;
cleft = -1;
cright = -1;
sindex = 2;
split_or_weight = 0.1;
fo->Write(&parent, sizeof(int));
fo->Write(&cleft, sizeof(int));
fo->Write(&cright, sizeof(int));
fo->Write(&sindex, sizeof(unsigned));
fo->Write(&split_or_weight, sizeof(float));
// Write 2x node stats
EXPECT_EQ(sizeof(RTreeNodeStat), 3 * sizeof(float) + sizeof(int));
bst_float loss_chg = 5.0;
bst_float sum_hess = 1.0;
bst_float base_weight = 3.0;
int leaf_child_cnt = 0;
fo->Write(&loss_chg, sizeof(float));
fo->Write(&sum_hess, sizeof(float));
fo->Write(&base_weight, sizeof(float));
fo->Write(&leaf_child_cnt, sizeof(int));
loss_chg = 50.0;
sum_hess = 10.0;
base_weight = 30.0;
leaf_child_cnt = 0;
fo->Write(&loss_chg, sizeof(float));
fo->Write(&sum_hess, sizeof(float));
fo->Write(&base_weight, sizeof(float));
fo->Write(&leaf_child_cnt, sizeof(int));
fo.reset();
std::unique_ptr<dmlc::Stream> fi(dmlc::Stream::Create(tmp_file.c_str(), "r"));
xgboost::RegTree tree;
tree.Load(fi.get());
EXPECT_EQ(tree.GetDepth(1), 1);
EXPECT_EQ(tree[0].SplitCond(), 0.5f);
EXPECT_EQ(tree[0].SplitIndex(), 5);
EXPECT_EQ(tree[1].LeafValue(), 0.1f);
EXPECT_TRUE(tree[1].IsLeaf());
}
} // namespace xgboost