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));
18 SerializeTemplate(header_primitive_field_handler);
19 this->GetPyBuffer(&buffer);
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));
32 auto header_primitive_field_handler = [&idx, &frames](
auto* field) {
33 InitScalarFromPyBuffer(field, frames[idx++]);
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");
40 std::unique_ptr<Model> model = Model::Create(threshold_type, leaf_output_type);
41 model->InitFromPyBuffer(frames.begin() + kNumFrameInHeader, frames.end());
46 Model::SerializeToFile(FILE* dest_fp) {
47 auto header_primitive_field_handler = [dest_fp](
auto* field) {
48 WriteScalarToFile(field, dest_fp);
50 SerializeTemplate(header_primitive_field_handler);
51 this->SerializeToFileImpl(dest_fp);
54 std::unique_ptr<Model>
55 Model::DeserializeFromFile(FILE* src_fp) {
56 TypeInfo threshold_type, leaf_output_type;
58 auto header_primitive_field_handler = [src_fp](
auto* field) {
59 ReadScalarFromFile(field, src_fp);
61 DeserializeTemplate(header_primitive_field_handler, threshold_type, leaf_output_type);
63 std::unique_ptr<Model> model = Model::Create(threshold_type, leaf_output_type);
64 model->DeserializeFromFileImpl(src_fp);
model structure for tree ensemble
TypeInfo
Types used by thresholds and leaf outputs.