pub fn checked_mul(lhs: usize, rhs: usize) -> anyhow::Result<usize> {
lhs.checked_mul(rhs).ok_or_else(|| {
anyhow::anyhow!(
"Arithmetic overflow: {lhs} * {rhs} would wrap — \
DoS protection (F2)."
)
})
}
pub fn checked_mul3(a: usize, b: usize, c: usize) -> anyhow::Result<usize> {
checked_mul(checked_mul(a, b)?, c)
}
pub fn checked_mul4(a: usize, b: usize, c: usize, d: usize) -> anyhow::Result<usize> {
checked_mul(checked_mul3(a, b, c)?, d)
}
pub fn checked_add(lhs: usize, rhs: usize) -> anyhow::Result<usize> {
lhs.checked_add(rhs).ok_or_else(|| {
anyhow::anyhow!(
"Arithmetic overflow: {lhs} + {rhs} would wrap — \
DoS protection (F2)."
)
})
}
pub fn checked_conv_padded_total(
num_blocks: usize,
width: usize,
in_size: usize,
k_size: usize,
) -> anyhow::Result<usize> {
checked_mul4(num_blocks, width, in_size, k_size)
}
pub fn checked_conv_total(out_size: usize, in_size: usize, k_size: usize) -> anyhow::Result<usize> {
checked_mul3(out_size, in_size, k_size)
}
pub fn checked_dense_total(out_size: usize, in_size: usize) -> anyhow::Result<usize> {
checked_mul(out_size, in_size)
}