use alloc::vec::Vec;
#[must_use]
pub fn find_most_frequent_pair(data: &[u8]) -> Option<(u8, u8)> {
if data.len() < 2 {
return None;
}
let mut counts = alloc::vec![0u32; 65536];
for i in 0..data.len() - 1 {
let key = (data[i] as usize) << 8 | data[i + 1] as usize;
counts[key] += 1;
}
let max_idx = counts.iter().enumerate().max_by_key(|&(_, &c)| c)?.0;
if counts[max_idx] < 2 {
return None;
}
#[allow(clippy::cast_possible_truncation)]
Some(((max_idx >> 8) as u8, (max_idx & 0xFF) as u8))
}
#[must_use]
pub fn bpe_replace(data: &[u8], pair: (u8, u8), replacement: u8) -> Vec<u8> {
let mut result = Vec::new();
let mut i = 0;
while i < data.len() {
if i + 1 < data.len() && data[i] == pair.0 && data[i + 1] == pair.1 {
result.push(replacement);
i += 2;
} else {
result.push(data[i]);
i += 1;
}
}
result
}
#[cfg(test)]
#[allow(
clippy::doc_markdown,
clippy::unreadable_literal,
clippy::cast_possible_truncation,
clippy::cast_sign_loss,
clippy::cast_precision_loss,
clippy::cast_possible_wrap,
clippy::uninlined_format_args
)]
mod tests {
use super::*;
#[test]
fn bpe_find_pair() {
let pair = find_most_frequent_pair(b"ababab").unwrap();
assert!(pair == (b'a', b'b') || pair == (b'b', b'a'));
}
#[test]
fn bpe_replace_basic() {
let result = bpe_replace(b"ababab", (b'a', b'b'), b'X');
assert_eq!(result, b"XXX");
}
#[test]
fn bpe_find_pair_empty() {
assert_eq!(find_most_frequent_pair(b""), None);
}
#[test]
fn bpe_find_pair_single_byte() {
assert_eq!(find_most_frequent_pair(b"a"), None);
}
#[test]
fn bpe_find_pair_all_same() {
let pair = find_most_frequent_pair(b"aaaa").unwrap();
assert_eq!(pair, (b'a', b'a'));
}
#[test]
fn bpe_find_pair_no_repeat() {
assert_eq!(find_most_frequent_pair(b"abcd"), None);
}
#[test]
fn bpe_find_pair_two_chars_no_repeat() {
assert_eq!(find_most_frequent_pair(b"ab"), None);
}
#[test]
fn bpe_find_pair_two_same_chars() {
assert_eq!(find_most_frequent_pair(b"aa"), None);
}
#[test]
fn bpe_find_pair_three_same_chars() {
let pair = find_most_frequent_pair(b"aaa").unwrap();
assert_eq!(pair, (b'a', b'a'));
}
#[test]
fn bpe_replace_no_match() {
let result = bpe_replace(b"abcdef", (b'x', b'y'), b'Z');
assert_eq!(result, b"abcdef");
}
#[test]
fn bpe_replace_partial_at_end() {
let result = bpe_replace(b"aba", (b'a', b'b'), b'X');
assert_eq!(result, b"Xa");
}
#[test]
fn bpe_replace_consecutive() {
let result = bpe_replace(b"aabb", (b'a', b'a'), b'X');
assert_eq!(result, b"Xbb");
}
#[test]
fn bpe_replace_empty() {
let result = bpe_replace(b"", (b'a', b'b'), b'X');
assert!(result.is_empty());
}
#[test]
fn bpe_replace_single() {
let result = bpe_replace(b"a", (b'a', b'b'), b'X');
assert_eq!(result, b"a");
}
#[test]
fn bpe_replace_collision() {
let result = bpe_replace(b"abXab", (b'a', b'b'), b'X');
assert_eq!(result, b"XXX");
}
#[test]
fn bpe_multi_step() {
let data = b"ababababab";
let step1 = bpe_replace(data, (b'a', b'b'), b'X');
assert_eq!(step1, b"XXXXX");
let pair = find_most_frequent_pair(&step1).unwrap();
assert_eq!(pair, (b'X', b'X'));
}
}