use std::collections::HashMap;
use crate::Token;
use crate::encoding::Encoding;
use crate::error::Result;
use crate::normalized_string::NormalizedString;
use crate::pre_tokenized_string::PreTokenizedString;
pub trait Normalizer {
fn normalize(&self, normalized: &mut NormalizedString) -> Result<()>;
}
pub trait PreTokenizer {
fn pre_tokenize(&self, pretokenized: &mut PreTokenizedString) -> Result<()>;
}
pub trait Model {
fn tokenize(&self, sequence: &str) -> Result<Vec<Token>>;
fn token_to_id(&self, token: &str) -> Option<u32>;
fn id_to_token(&self, id: u32) -> Option<String>;
fn vocab(&self) -> HashMap<String, u32>;
fn vocab_size(&self) -> usize;
}
pub trait PostProcessor {
fn added_tokens(&self, is_pair: bool) -> usize;
fn process_encodings(
&self,
encodings: Vec<Encoding>,
add_special_tokens: bool,
) -> Result<Vec<Encoding>>;
fn process(
&self,
encoding: Encoding,
pair_encoding: Option<Encoding>,
add_special_tokens: bool,
) -> Result<Encoding> {
let mut encodings = vec![encoding];
encodings.extend(pair_encoding);
for (i, e) in encodings.iter_mut().enumerate() {
e.set_sequence_id(i);
for o in e.overflowing_mut() {
o.set_sequence_id(i);
}
e.set_uniform_type_id(i as u32);
}
let encodings = self.process_encodings(encodings, add_special_tokens)?;
Ok(Encoding::merge(encodings, false))
}
}
pub trait Decoder {
fn decode_chain(&self, tokens: Vec<String>) -> Result<Vec<String>>;
fn decode(&self, tokens: Vec<String>) -> Result<String> {
Ok(self.decode_chain(tokens)?.join(""))
}
}
pub trait Trainer {
type Model: Model + Sized;
fn should_show_progress(&self) -> bool {
false
}
fn train(&self, model: &mut Self::Model) -> Result<Vec<crate::AddedToken>>;
fn feed<I, S, F>(&mut self, iterator: I, process: F) -> Result<()>
where
I: Iterator<Item = S> + Send,
S: AsRef<str> + Send,
F: Fn(&str) -> Result<Vec<String>> + Sync;
}