use crate::error::Error;
pub(super) fn validate_input_shape_dims(
input_shape: &[usize],
expected_dims: usize,
_layer_name: &str,
) -> Result<(), Error> {
if input_shape.len() != expected_dims {
return Err(Error::dimension_mismatch(expected_dims, input_shape.len()));
}
Ok(())
}
pub(super) fn validate_all_dims_positive(input_shape: &[usize]) -> Result<(), Error> {
if !input_shape.iter().all(|&dim| dim > 0) {
return Err(Error::invalid_input(format!(
"All dimensions in input_shape must be greater than zero. Got: {:?}",
input_shape
)));
}
Ok(())
}
pub(super) fn validate_pool_size_1d(pool_size: usize, input_length: usize) -> Result<(), Error> {
if pool_size == 0 {
return Err(Error::invalid_parameter(
"pool_size",
"must be greater than zero",
));
}
if pool_size > input_length {
return Err(Error::invalid_parameter(
"pool_size",
"cannot exceed the corresponding input dimension",
));
}
Ok(())
}
pub(super) fn validate_pool_size_2d(
pool_size: (usize, usize),
input_height: usize,
input_width: usize,
) -> Result<(), Error> {
if pool_size.0 == 0 || pool_size.1 == 0 {
return Err(Error::invalid_parameter(
"pool_size",
"must be greater than zero in all dimensions",
));
}
if pool_size.0 > input_height || pool_size.1 > input_width {
return Err(Error::invalid_parameter(
"pool_size",
"cannot exceed the corresponding input dimension",
));
}
Ok(())
}
pub(super) fn validate_pool_size_3d(
pool_size: (usize, usize, usize),
input_depth: usize,
input_height: usize,
input_width: usize,
) -> Result<(), Error> {
if pool_size.0 == 0 || pool_size.1 == 0 || pool_size.2 == 0 {
return Err(Error::invalid_parameter(
"pool_size",
"must be greater than zero in all dimensions",
));
}
if pool_size.0 > input_depth || pool_size.1 > input_height || pool_size.2 > input_width {
return Err(Error::invalid_parameter(
"pool_size",
"cannot exceed the corresponding input dimension",
));
}
Ok(())
}
pub(super) fn validate_stride_1d(stride: usize) -> Result<(), Error> {
if stride == 0 {
return Err(Error::invalid_parameter(
"stride",
"must be greater than zero",
));
}
Ok(())
}
pub(super) fn validate_strides_2d(strides: (usize, usize)) -> Result<(), Error> {
if strides.0 == 0 || strides.1 == 0 {
return Err(Error::invalid_parameter(
"strides",
"must be greater than zero in all dimensions",
));
}
Ok(())
}
pub(super) fn validate_strides_3d(strides: (usize, usize, usize)) -> Result<(), Error> {
if strides.0 == 0 || strides.1 == 0 || strides.2 == 0 {
return Err(Error::invalid_parameter(
"strides",
"must be greater than zero in all dimensions",
));
}
Ok(())
}
#[cfg(test)]
mod tests {
use super::*;
use crate::error::Error;
#[test]
fn test_validate_pool_size_3d_oversized_height() {
let result = validate_pool_size_3d((2, 5, 2), 4, 4, 4);
assert!(
matches!(result, Err(Error::InvalidParameter { ref name, .. }) if name == "pool_size"),
"oversized height pool must yield InvalidParameter(pool_size), got {:?}",
result
);
}
#[test]
fn test_validate_pool_size_3d_oversized_width() {
let result = validate_pool_size_3d((2, 2, 5), 4, 4, 4);
assert!(
matches!(result, Err(Error::InvalidParameter { ref name, .. }) if name == "pool_size"),
"oversized width pool must yield InvalidParameter(pool_size), got {:?}",
result
);
}
#[test]
fn test_validate_pool_size_3d_all_fitting_ok() {
assert!(validate_pool_size_3d((2, 2, 2), 4, 4, 4).is_ok());
}
}