pub const SETUP_CHUNK: u64 = 1024;
pub const LARGE_INPUT_CHUNK: u64 = 16;
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum BatchSize {
SmallInput,
LargeInput,
PerIteration,
NumBatches(u64),
NumIterations(u64),
}
impl BatchSize {
pub(super) fn batch_len(self, iters: u64) -> u64 {
let len = match self {
BatchSize::SmallInput => SETUP_CHUNK,
BatchSize::LargeInput => LARGE_INPUT_CHUNK,
BatchSize::PerIteration => 1,
BatchSize::NumBatches(batches) => iters.div_ceil(batches.max(1)),
BatchSize::NumIterations(size) => size,
};
len.clamp(1, iters.max(1))
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn fixed_sizes_cap_at_the_sample() {
assert_eq!(BatchSize::SmallInput.batch_len(5_000), 1024);
assert_eq!(BatchSize::SmallInput.batch_len(10), 10);
assert_eq!(BatchSize::LargeInput.batch_len(5_000), 16);
assert_eq!(BatchSize::LargeInput.batch_len(3), 3);
assert_eq!(BatchSize::PerIteration.batch_len(5_000), 1);
}
#[test]
fn num_batches_rounds_up() {
assert_eq!(BatchSize::NumBatches(4).batch_len(10), 3);
assert_eq!(BatchSize::NumBatches(1).batch_len(10), 10);
assert_eq!(BatchSize::NumBatches(0).batch_len(10), 10);
assert_eq!(BatchSize::NumBatches(100).batch_len(10), 1);
}
#[test]
fn num_iterations_clamps() {
assert_eq!(BatchSize::NumIterations(7).batch_len(10), 7);
assert_eq!(BatchSize::NumIterations(70).batch_len(10), 10);
assert_eq!(BatchSize::NumIterations(0).batch_len(10), 1);
}
#[test]
fn zero_iters_still_gives_one() {
assert_eq!(BatchSize::SmallInput.batch_len(0), 1);
}
}