Candidate SuffixTree::speculate()

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;
}