use iqdb_types::{IqdbError, Result};
pub(crate) fn finite_non_empty(vector: &[f32]) -> Result<()> {
if vector.is_empty() {
return Err(IqdbError::InvalidVector);
}
if vector.iter().any(|v| !v.is_finite()) {
return Err(IqdbError::InvalidVector);
}
Ok(())
}
pub(crate) fn dim_eq(expected: usize, actual: usize) -> Result<()> {
if actual != expected {
return Err(IqdbError::DimensionMismatch {
expected,
found: actual,
});
}
Ok(())
}
pub(crate) fn training_set(vectors: &[&[f32]]) -> Result<usize> {
let first = match vectors.first() {
Some(first) => first,
None => {
return Err(IqdbError::InvalidConfig {
reason: "quantizer training set is empty",
});
}
};
finite_non_empty(first)?;
let dim = first.len();
for v in &vectors[1..] {
finite_non_empty(v)?;
dim_eq(dim, v.len())?;
}
Ok(dim)
}