Treelite
serializer.cc
Go to the documentation of this file.
1 
8 #include <treelite/tree.h>
9 
10 namespace treelite {
11 
12 std::vector<PyBufferFrame>
13 Model::GetPyBuffer() {
14  std::vector<PyBufferFrame> buffer;
15  auto header_primitive_field_handler = [&buffer](auto* field) {
16  buffer.push_back(GetPyBufferFromScalar(field));
17  };
18  SerializeTemplate(header_primitive_field_handler);
19  this->GetPyBuffer(&buffer);
20  return buffer;
21 }
22 
23 std::unique_ptr<Model>
24 Model::CreateFromPyBuffer(std::vector<PyBufferFrame> frames) {
25  TypeInfo threshold_type, leaf_output_type;
26  constexpr std::size_t kNumFrameInHeader = 5;
27  if (frames.size() < kNumFrameInHeader) {
28  throw std::runtime_error(std::string("Insufficient number of frames: there must be at least ")
29  + std::to_string(kNumFrameInHeader));
30  }
31  int idx = 0;
32  auto header_primitive_field_handler = [&idx, &frames](auto* field) {
33  InitScalarFromPyBuffer(field, frames[idx++]);
34  };
35  DeserializeTemplate(header_primitive_field_handler, threshold_type, leaf_output_type);
36  if (idx != kNumFrameInHeader) {
37  throw std::runtime_error("Did not read from a sufficient number of frames");
38  }
39 
40  std::unique_ptr<Model> model = Model::Create(threshold_type, leaf_output_type);
41  model->InitFromPyBuffer(frames.begin() + kNumFrameInHeader, frames.end());
42  return model;
43 }
44 
45 void
46 Model::SerializeToFile(FILE* dest_fp) {
47  auto header_primitive_field_handler = [dest_fp](auto* field) {
48  WriteScalarToFile(field, dest_fp);
49  };
50  SerializeTemplate(header_primitive_field_handler);
51  this->SerializeToFileImpl(dest_fp);
52 }
53 
54 std::unique_ptr<Model>
55 Model::DeserializeFromFile(FILE* src_fp) {
56  TypeInfo threshold_type, leaf_output_type;
57  int idx = 0;
58  auto header_primitive_field_handler = [src_fp](auto* field) {
59  ReadScalarFromFile(field, src_fp);
60  };
61  DeserializeTemplate(header_primitive_field_handler, threshold_type, leaf_output_type);
62 
63  std::unique_ptr<Model> model = Model::Create(threshold_type, leaf_output_type);
64  model->DeserializeFromFileImpl(src_fp);
65  return model;
66 }
67 
68 } // namespace treelite
model structure for tree ensemble
TypeInfo
Types used by thresholds and leaf outputs.
Definition: typeinfo.h:22