Files
wehub-resource-sync 770d92cb1f
Lint / lint (push) Waiting to run
Windows CI / Windows (push) Waiting to run
Build Docs / Deploy Docs (push) Waiting to run
chore: import upstream snapshot with attribution
2026-07-13 13:23:58 +08:00

135 lines
4.0 KiB
C++

/*!
* Copyright (c) 2023-2025 by Contributors
* \file serve/radix_tree.h
*/
#ifndef MLC_LLM_SERVE_RADIX_TREE_H_
#define MLC_LLM_SERVE_RADIX_TREE_H_
#include <tvm/ffi/container/shape.h>
#include <tvm/ffi/object.h>
#include <tvm/ffi/reflection/registry.h>
#include <unordered_map>
#include <unordered_set>
namespace mlc {
namespace llm {
namespace serve {
using tvm::ffi::Object;
using tvm::ffi::ObjectRef;
using tvm::ffi::Shape;
/*!
* \brief The paged radix tree data structure.
*/
class PagedRadixTreeObj : public Object {
public:
/*!
* \brief Check if a sequence exists.
* \param seq_id The sequence ID for index.
* \return The sequence existence.
* \throw Error if sequence ID is not valid.
*/
virtual bool HasSequence(int64_t seq_id) = 0;
/*!
* \brief Get a sequence's all tokens.
* \param seq_id The sequence ID for index.
* \return The sequence tokens.
* \throw Error if sequence ID is not valid.
*/
virtual Shape GetSequence(int64_t seq_id) = 0;
/*!
* \brief Get all sequences with longest common prefix with give prefix tokens.
* \param tokens The prefix tokens for reference.
* \return The pair of matched prefix length and the array of matched sequences indices.
*/
virtual std::pair<size_t, std::vector<int64_t>> MatchPrefix(
const std::vector<int32_t>& tokens) = 0;
/*!
* \brief Get a sequence's length.
* \param seq_id The sequence ID for index.
* \return The sequence length.
* \throw Error if sequence ID is not valid.
*/
virtual size_t GetSequenceLength(int64_t seq_id) = 0;
/*!
* \brief Fork a sequence from parent sequence at given position.
* \param seq_id The new sequence ID.
* \param parent_seq_id The parent sequence ID to fork from.
* \param forked_offset The position of parent sequence to fork at.
* The valid value is [1, length of forked sequence]. If the position equals the length of forked
* sequence, the new sequence will copy the entire forked sequence.
* \throw Error if sequence ID or
* forked postion is not valid.
*/
virtual void ForkSequence(int64_t seq_id, int64_t parent_seq_id, size_t forked_offset) = 0;
/*!
* \brief Add an empty sequence at root.
* \param seq_id The new sequence ID.
* \throw Error if sequence ID is not valid.
*/
virtual void AddSequence(int64_t seq_id) = 0;
/*!
* \brief Extend a sequence with given tokens.
* \param seq_id The sequence ID for index.
* \param tokens The given tokens to extend.
* \throw Error if sequence ID is not valid.
*/
virtual void ExtendSequence(int64_t seq_id, const std::vector<int32_t>& tokens) = 0;
/*!
* \brief Roll back a sequence by number of tokens.
* \param seq_id The sequence ID for index.
* \param num_tokens The number of tokens to be rolled back.
* \throw Error if sequence ID is not valid.
*/
virtual void RollBackSequence(int64_t seq_id, size_t num_tokens) = 0;
/*!
* \brief Remove a sequence.
* \param seq_id The sequence ID to remove.
* \throw Error if sequence ID is not valid.
*/
virtual void RemoveSequence(int64_t seq_id) = 0;
/*!
* \brief Get the remaining token capacity of the paged radix tree.
* \return The the remaining token capacity of the paged radix tree.
*/
virtual size_t FreeCapacity() = 0;
/*!
* \brief Reset the paged radix tree to initial status.
*/
virtual void Reset() = 0;
static void RegisterReflection() {
namespace refl = tvm::ffi::reflection;
refl::ObjectDef<PagedRadixTreeObj>();
}
static constexpr const bool _type_mutable = true;
TVM_FFI_DECLARE_OBJECT_INFO("mlc.serve.PagedRadixTree", PagedRadixTreeObj, Object);
};
class PagedRadixTree : public ObjectRef {
public:
/*!
* \brief Construct a paged radix tree.
* \return The constructed paged radix tree. */
static PagedRadixTree Create();
TVM_FFI_DEFINE_OBJECT_REF_METHODS_NULLABLE(PagedRadixTree, ObjectRef, PagedRadixTreeObj);
};
} // namespace serve
} // namespace llm
} // namespace mlc
#endif // MLC_LLM_SERVE_RADIX_TREE_H_