1
1
/* !
2
- * Copyright 2019 by Contributors
2
+ * Copyright 2019-2020 by Contributors
3
3
*/
4
+ #include < utility>
5
+
4
6
#include " xgboost/json.h"
5
7
#include " xgboost/logging.h"
6
8
#include " gbtree_model.h"
@@ -41,15 +43,14 @@ void GBTreeModel::SaveModel(Json* p_out) const {
41
43
auto & out = *p_out;
42
44
CHECK_EQ (param.num_trees , static_cast <int >(trees.size ()));
43
45
out[" gbtree_model_param" ] = ToJson (param);
44
- std::vector<Json> trees_json;
45
- size_t t = 0 ;
46
- for (auto const & tree : trees) {
46
+ std::vector<Json> trees_json (trees.size ());
47
+
48
+ for (size_t t = 0 ; t < trees.size (); ++t) {
49
+ auto const & tree = trees[t];
47
50
Json tree_json{Object ()};
48
51
tree->SaveModel (&tree_json);
49
- // The field is not used in XGBoost, but might be useful for external project.
50
- tree_json[" id" ] = Integer (t);
51
- trees_json.emplace_back (tree_json);
52
- t++;
52
+ tree_json[" id" ] = Integer (static_cast <Integer::Int>(t));
53
+ trees_json[t] = std::move (tree_json);
53
54
}
54
55
55
56
std::vector<Json> tree_info_json (tree_info.size ());
@@ -70,9 +71,10 @@ void GBTreeModel::LoadModel(Json const& in) {
70
71
auto const & trees_json = get<Array const >(in[" trees" ]);
71
72
trees.resize (trees_json.size ());
72
73
73
- for (size_t t = 0 ; t < trees.size (); ++t) {
74
- trees[t].reset ( new RegTree () );
75
- trees[t]->LoadModel (trees_json[t]);
74
+ for (size_t t = 0 ; t < trees_json.size (); ++t) { // NOLINT
75
+ auto tree_id = get<Integer>(trees_json[t][" id" ]);
76
+ trees.at (tree_id).reset (new RegTree ());
77
+ trees.at (tree_id)->LoadModel (trees_json[t]);
76
78
}
77
79
78
80
tree_info.resize (param.num_trees );
0 commit comments