use super::ring_buffer::RingBuffer;
use crate::constants::{
DEFAULT_DEQUE_CAPACITY, ESTIMATED_MINIMIZERS_PER_SEQUENCE, RING_BUFFER_SIZE,
};
pub struct MinimizerWorkspace {
pub(crate) q_fwd: RingBuffer<(usize, u64), RING_BUFFER_SIZE>,
pub(crate) q_rc: RingBuffer<(usize, u64), RING_BUFFER_SIZE>,
pub buffer: Vec<u64>,
pub estimated_minimizers: usize,
}
impl MinimizerWorkspace {
pub fn new() -> Self {
Self {
q_fwd: RingBuffer::new(),
q_rc: RingBuffer::new(),
buffer: Vec::with_capacity(DEFAULT_DEQUE_CAPACITY),
estimated_minimizers: ESTIMATED_MINIMIZERS_PER_SEQUENCE,
}
}
pub fn with_estimate(estimated_minimizers: usize) -> Self {
Self {
q_fwd: RingBuffer::new(),
q_rc: RingBuffer::new(),
buffer: Vec::with_capacity(DEFAULT_DEQUE_CAPACITY),
estimated_minimizers: estimated_minimizers.max(ESTIMATED_MINIMIZERS_PER_SEQUENCE),
}
}
pub fn estimate_for_length(seq_len: usize, k: usize, w: usize) -> usize {
if seq_len <= k {
ESTIMATED_MINIMIZERS_PER_SEQUENCE
} else {
(((seq_len - k) / w + 1) * 2).max(ESTIMATED_MINIMIZERS_PER_SEQUENCE)
}
}
}
impl Default for MinimizerWorkspace {
fn default() -> Self {
Self::new()
}
}