in src/compiler/ast_native.cc [345:412]
void HandleQNode(const QuantizerNode* node,
const std::string& dest,
size_t indent) {
/* render arrays needed to convert feature values into bin indices */
std::string array_threshold, array_th_begin, array_th_len;
// threshold[] : list of all thresholds that occur at least once in the
// ensemble model. For each feature, an ascending list of unique
// thresholds is generated. The range th_begin[i]:(th_begin[i]+th_len[i])
// of the threshold[] array stores the threshold list for feature i.
size_t total_num_threshold;
// to hold total number of (distinct) thresholds
{
common::ArrayFormatter formatter(80, 2);
for (const auto& e : node->cut_pts) {
// cut_pts had been generated in ASTBuilder::QuantizeThresholds
// cut_pts[i][k] stores the k-th threshold of feature i.
for (tl_float v : e) {
formatter << v;
}
}
array_threshold = formatter.str();
}
{
common::ArrayFormatter formatter(80, 2);
size_t accum = 0; // used to compute cumulative sum over threshold counts
for (const auto& e : node->cut_pts) {
formatter << accum;
accum += e.size(); // e.size() = number of thresholds for each feature
}
total_num_threshold = accum;
array_th_begin = formatter.str();
}
{
common::ArrayFormatter formatter(80, 2);
for (const auto& e : node->cut_pts) {
formatter << e.size();
}
array_th_len = formatter.str();
}
if (!array_threshold.empty() && !array_th_begin.empty() && !array_th_len.empty()) {
PrependToBuffer(dest,
fmt::format(native::qnode_template,
"total_num_threshold"_a = total_num_threshold), 0);
AppendToBuffer(dest,
fmt::format(native::quantize_loop_template,
"num_feature"_a = num_feature_), indent);
}
if (!array_threshold.empty()) {
PrependToBuffer(dest,
fmt::format("static const double threshold[] = {{\n"
"{array_threshold}\n"
"}};\n", "array_threshold"_a = array_threshold), 0);
}
if (!array_th_begin.empty()) {
PrependToBuffer(dest,
fmt::format("static const int th_begin[] = {{\n"
"{array_th_begin}\n"
"}};\n", "array_th_begin"_a = array_th_begin), 0);
}
if (!array_th_len.empty()) {
PrependToBuffer(dest,
fmt::format("static const int th_len[] = {{\n"
"{array_th_len}\n"
"}};\n", "array_th_len"_a = array_th_len), 0);
}
CHECK_EQ(node->children.size(), 1);
WalkAST(node->children[0], dest, indent);
}