use serde::{Deserialize, Serialize};
use crate::error::Result;
use crate::traits::Decoder;
fn default_suffix() -> String {
"</w>".into()
}
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
#[non_exhaustive]
pub struct BpeDecoder {
#[serde(default = "default_suffix")]
pub suffix: String,
}
impl Default for BpeDecoder {
fn default() -> Self {
Self::new(default_suffix())
}
}
impl BpeDecoder {
pub fn new(suffix: impl Into<String>) -> Self {
Self {
suffix: suffix.into(),
}
}
}
impl Decoder for BpeDecoder {
fn decode_chain(&self, tokens: Vec<String>) -> Result<Vec<String>> {
let last = tokens.len().saturating_sub(1);
Ok(tokens
.into_iter()
.enumerate()
.map(|(i, t)| t.replace(&self.suffix, if i == last { "" } else { " " }))
.collect())
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn decodes() {
let d = BpeDecoder::default();
let out = d
.decode(vec!["My</w>".into(), "na".into(), "me</w>".into()])
.unwrap();
assert_eq!(out, "My name");
assert_eq!(d.decode(vec![]).unwrap(), "");
}
}