use crate::errors::QlResult;
use crate::require;
pub const MAX_SEQUENCE_DIMENSION: usize = 256;
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, "sequence rows must be positive");
require!(
rows.checked_mul(dimension).is_some(),
"sequence component count overflow"
);
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)
}
}