use crate::errors::QlResult;
use crate::require;
pub const MAX_SEQUENCE_DIMENSION: usize = 256;
pub const MAX_SEQUENCE_ROWS: usize = 100_000;
pub const MAX_SEQUENCE_COMPONENTS: usize = 1_000_000;
pub const MAX_SEQUENCE_MATRIX_WORK: usize = 100_000_000;
#[derive(Clone, Copy, Debug, Eq, PartialEq)]
pub enum SequenceStatistic {
Mean,
Variance,
StandardDeviation,
ErrorEstimate,
Minimum,
Maximum,
Covariance,
Correlation,
}
pub fn validate_sequence_shape(
rows: usize,
dimension: usize,
measure: SequenceStatistic,
) -> QlResult<usize> {
require!(
dimension > 0 && dimension <= MAX_SEQUENCE_DIMENSION,
"sequence dimension must be in 1..={MAX_SEQUENCE_DIMENSION}"
);
require!(
rows > 0 && rows <= MAX_SEQUENCE_ROWS,
"sequence rows must be in 1..={MAX_SEQUENCE_ROWS}"
);
require!(
rows.checked_mul(dimension)
.is_some_and(|size| size <= MAX_SEQUENCE_COMPONENTS),
"sequence component limit exceeded"
);
if matches!(
measure,
SequenceStatistic::Covariance | SequenceStatistic::Correlation
) {
let size = dimension * dimension;
require!(
rows.checked_mul(size)
.is_some_and(|work| work <= MAX_SEQUENCE_MATRIX_WORK),
"sequence matrix work limit exceeded"
);
Ok(size)
} else {
Ok(dimension)
}
}