eld_llm 0.0.1

An LLM built from scratch in Rust
use crate::utils::corpus_tracker::CorpusTracker;
use crate::tokenizers::benchmark::dev::traits::TokenizerTrainingMetrics;


pub type TokenizerError = String;

pub trait TokenIdType: Copy + Eq + std::hash::Hash + 'static {
    fn from_usize(n: usize) -> Self;
}

impl TokenIdType for u32 {
    fn from_usize(n: usize) -> Self { n as u32 }
}

impl TokenIdType for u64 {
    fn from_usize(n: usize) -> Self { n as u64 }
}

impl TokenIdType for usize {
    fn from_usize(n: usize) -> Self { n }
}

pub trait Tokenizer {
    type TokenId: TokenIdType;

    fn name(&self) -> &'static str;

    // Corpus
    fn corpus(&self) -> &CorpusTracker;
    fn corpus_mut(&mut self) -> &mut CorpusTracker;

    // Vocabulary
    fn vocab_size(&self) -> usize;

    // Training, encoding, and decoding
    fn train(&mut self, data_path: &str, corpus_name: &str) -> Result<TokenizerTrainingMetrics, TokenizerError>;
    fn encode(&self, text: &str) -> Vec<Self::TokenId>;
    fn decode(&self, tokens: &[Self::TokenId]) -> String;

    // Persistence
    fn save(&self, path: &str) -> Result<(), TokenizerError>;
    fn load(&mut self, path: &str) -> Result<(), TokenizerError>;

    // Vocabulary iteration for metrics
    fn vocab_tokens(&self) -> Vec<String>;

    // Memory footprint
    fn size(&self) -> usize;
}