use std::collections::BTreeMap;
use crate::{MyResult, spec::Spec};
use super::{Merge, Word};
#[derive(Debug)]
pub struct BpeModel<C, I> {
special_tokens: Vec<String>,
vocab: BTreeMap<I, Word<C>>,
merges: Vec<Merge<C, I>>,
}
impl<C, I> BpeModel<C, I> {
pub(crate) fn new(
special_tokens: Vec<String>,
vocab: BTreeMap<I, Word<C>>,
merges: Vec<Merge<C, I>>,
) -> Self {
Self {
special_tokens,
vocab,
merges,
}
}
pub fn special_tokens(&self) -> &[String] {
&self.special_tokens
}
pub fn vocab(&self) -> &BTreeMap<I, Word<C>> {
&self.vocab
}
pub fn merges(&self) -> &[Merge<C, I>] {
&self.merges
}
pub fn save_vocab_json<W: std::io::Write>(&self, spec: &dyn Spec<C, I>, mut writer: W) -> MyResult<()> {
spec.encode_vocab(&mut writer, &self.vocab)
}
pub fn save_merges_txt<W: std::io::Write>(&self, spec: &dyn Spec<C, I>, mut writer: W) -> MyResult<()> {
spec.encode_merges(&mut writer, &self.merges)
}
}