Treelite
model_concat.cc
Go to the documentation of this file.
1 
8 #include <treelite/tree.h>
9 #include <treelite/logging.h>
10 #include <algorithm>
11 #include <memory>
12 #include <type_traits>
13 
14 namespace treelite {
15 
16 std::unique_ptr<Model> ConcatenateModelObjects(const std::vector<const Model*>& objs) {
17  if (objs.empty()) {
18  return std::unique_ptr<Model>();
19  }
20  return objs[0]->Dispatch([&objs](const auto& first_model_obj) {
21  using ModelType = std::remove_const_t<std::remove_reference_t<decltype(first_model_obj)>>;
22  std::unique_ptr<ModelType> concatenated_model = std::make_unique<ModelType>();
23  for (std::size_t i = 0; i < objs.size(); ++i) {
24  auto* casted = dynamic_cast<const ModelType*>(objs[i]);
25  if (casted) {
26  std::transform(casted->trees.begin(), casted->trees.end(),
27  std::back_inserter(concatenated_model->trees),
28  [](const auto& tree) { return tree.Clone(); });
29  } else {
30  TREELITE_LOG(FATAL) << "Model object at index " << i
31  << " has a different type than the first model object (at index 0)";
32  }
33  }
34  /* Copy model metadata */
35  concatenated_model->num_feature = first_model_obj.num_feature;
36  concatenated_model->task_type = first_model_obj.task_type;
37  concatenated_model->average_tree_output = first_model_obj.average_tree_output;
38  concatenated_model->task_param = first_model_obj.task_param;
39  concatenated_model->param = first_model_obj.param;
40  return std::unique_ptr<Model>(concatenated_model.release());
41  });
42 }
43 
44 } // namespace treelite
model structure for tree ensemble
logging facility for Treelite
std::unique_ptr< Model > ConcatenateModelObjects(const std::vector< const Model *> &objs)
Concatenate multiple model objects into a single model object by copying all member trees into the de...
Definition: model_concat.cc:16