in csrc/suffix_decoding/suffix_tree.cc [250:280]
Candidate SuffixTree::speculate(const std::vector<int>& pattern,
int max_spec_tokens,
float max_spec_factor,
float max_spec_offset,
float min_token_prob,
bool use_tree_spec) {
Candidate result;
int start_idx = std::max(static_cast<int>(pattern.size()) - _max_depth, 0);
for ( ; start_idx < pattern.size(); start_idx++) {
auto[node, idx] = _match_pattern(pattern, start_idx);
if (node == nullptr) {
continue;
}
int match_len = static_cast<int>(pattern.size()) - start_idx;
int max_tokens = std::min(max_spec_tokens,
static_cast<int>(match_len * max_spec_factor
+ max_spec_offset + 1e-6));
max_tokens = std::max(max_tokens, 0);
Candidate candidate;
if (use_tree_spec) {
candidate = _speculate_tree(node, idx, max_tokens, min_token_prob);
} else {
candidate = _speculate_path(node, idx, max_tokens, min_token_prob);
}
if (candidate.score > result.score) {
result = std::move(candidate);
result.match_len = match_len;
}
}
return result;
}