use super::*;
pub fn rewind_buffers(
output_tokens: &mut Vec<u32>,
seq_tokens: &mut Vec<u32>,
seq_len: usize,
keep_len: usize,
) -> usize {
let dropped = output_tokens.len().saturating_sub(keep_len);
output_tokens.truncate(keep_len);
let mut new_seq_len = seq_len;
for _ in 0..dropped {
if seq_tokens.pop().is_some() {
new_seq_len = new_seq_len.saturating_sub(1);
}
}
new_seq_len
}
pub(super) fn apply_rollback(a: &mut ActiveSeq, keep_len: usize, dropped: usize) {
a.seq.seq_len = rewind_buffers(
&mut a.output_tokens,
&mut a.seq.tokens,
a.seq.seq_len,
keep_len,
);
a.remaining = a.remaining.saturating_add(dropped);
a.content_tokens = a.content_tokens.saturating_sub(dropped as u32);
if let Some(&last) = a.output_tokens.last() {
a.last_token = last;
}
if let Some(ref mut gs) = a.grammar_state {
match grammar_rewind(dropped, gs.num_history_steps()) {
Some(n) => gs.rollback(n),
None => tracing::warn!(
"grammar rollback skipped: {dropped} tokens dropped but the matcher \
recorded only {} steps. Constrained output may drift for this \
sequence; it is not a reason to kill the scheduler (#842).",
gs.num_history_steps()
),
}
}
a.prose_tokens_since_last_tool = 0;
a.consecutive_confident = 0;
}
#[allow(dead_code)]
pub trait RomHead: Send + Sync {
fn repetition_onset_score(&self, recent_tokens: &[u32]) -> f32;
}
pub(super) fn grammar_rewind(dropped: usize, history_steps: usize) -> Option<usize> {
(dropped <= history_steps).then_some(dropped)
}