mod check;
mod stats;
mod validator;
pub use check::{ValidationCheck, ValidationReport};
pub use stats::TensorStats;
pub use validator::AprValidator;
use crate::error::{WhisperError, WhisperResult};
use crate::format::{metadata_to_model_config, AprV2ReaderRef};
pub fn validate_apr_bytes(data: &[u8]) -> WhisperResult<ValidationReport> {
let reader =
AprV2ReaderRef::from_bytes(data).map_err(|e| WhisperError::Format(e.to_string()))?;
let config = metadata_to_model_config(reader.metadata());
let validator = AprValidator::new(&reader, config);
Ok(validator.validate_all())
}
pub fn quick_validate(reader: &AprV2ReaderRef<'_>) -> WhisperResult<()> {
if let Some(data) = reader.get_tensor_as_f32("decoder.layer_norm.weight") {
let stats = TensorStats::compute("decoder.layer_norm.weight", &data);
if stats.mean < 0.5 || stats.mean > 3.0 {
return Err(WhisperError::Format(format!(
"decoder.layer_norm.weight mean={:.4} outside valid range [0.5, 3.0]",
stats.mean
)));
}
}
if let Some(data) = reader.get_tensor_as_f32("encoder.layer_norm.weight") {
let stats = TensorStats::compute("encoder.layer_norm.weight", &data);
if stats.mean < 0.5 || stats.mean > 3.0 {
return Err(WhisperError::Format(format!(
"encoder.layer_norm.weight mean={:.4} outside valid range [0.5, 3.0]",
stats.mean
)));
}
}
Ok(())
}
#[cfg(test)]
mod tests;