in csrc/suffix_decoding/suffix_tree.cc [479:508]
Candidate SuffixTree::_speculate_tree(Node* node, int idx,
int max_spec_tokens,
float min_token_prob) {
Candidate ret;
std::priority_queue<HeapItem, std::vector<HeapItem>, HeapItemCompare> queue;
queue.emplace(1.0, node, idx, -1);
while (ret.token_ids.size() < max_spec_tokens && !queue.empty()) {
HeapItem item = queue.top();
queue.pop();
if (item.idx < item.node->length) {
int token = _seqs[item.node->ref_seq][item.node->ref_idx + item.idx];
ret.token_ids.push_back(token);
ret.parents.push_back(item.parent);
ret.probs.push_back(item.prob);
ret.score += item.prob;
queue.emplace(item.prob, item.node, item.idx + 1,
static_cast<int>(ret.token_ids.size()) - 1);
} else {
for (const auto& kv : item.node->children) {
Node* child = kv.second.get();
float prob = item.prob * child->count /
static_cast<float>(item.node->count);
if (prob >= min_token_prob) {
queue.emplace(prob, child, 0, item.parent);
}
}
}
}
return ret;
}