use crate::ports::{GrammarMasker, InferenceEngine, PromptCompressor};
use el_core::{Result, Token};
pub struct IdentityCompressor;
impl PromptCompressor for IdentityCompressor {
fn compress(&self, tokens: &[Token]) -> Vec<Token> {
tokens.to_vec()
}
}
pub struct AllowAllMasker;
impl GrammarMasker for AllowAllMasker {
fn mask(&self, _recent: &[Token], vocab: usize) -> Vec<bool> {
vec![true; vocab]
}
}
pub struct NullEngine {
pub eos: Token,
pub vocab: usize,
}
impl NullEngine {
pub fn new(eos: Token, vocab: usize) -> Self {
Self { eos, vocab }
}
}
impl InferenceEngine for NullEngine {
fn prefill(&mut self, tokens: &[Token]) -> Result<u32> {
Ok(tokens.len() as u32)
}
fn next_logits(&mut self, _committed: &[Token]) -> Vec<i32> {
let mut v = vec![0i32; self.vocab];
if let Some(slot) = v.get_mut(self.eos as usize) {
*slot = 1;
}
v
}
fn eos_token(&self) -> Token {
self.eos
}
fn rollback(&mut self, _keep_committed: u32) -> Result<()> {
Ok(())
}
}