use iqdb_types::Result;
use crate::Distance;
#[derive(Debug, Clone, Copy, Default, PartialEq, Eq, Hash)]
pub struct Manhattan;
impl Distance for Manhattan {
fn compute(a: &[f32], b: &[f32]) -> Result<f32> {
crate::validate::pair(a, b)?;
Ok(dispatch(a, b))
}
fn compute_batch(query: &[f32], candidates: &[&[f32]], out: &mut [f32]) -> Result<()> {
crate::metrics::batch_with(query, candidates, out, Manhattan::compute)
}
}
fn dispatch(a: &[f32], b: &[f32]) -> f32 {
let features = crate::features::detect_features();
match crate::features::select_kernel(features) {
crate::features::Kernel::Scalar => crate::scalar::manhattan::compute(a, b),
#[cfg(target_arch = "x86_64")]
crate::features::Kernel::Avx2 => {
unsafe { crate::simd::avx2::manhattan(a, b) }
}
#[cfg(target_arch = "aarch64")]
crate::features::Kernel::Neon => {
unsafe { crate::simd::neon::manhattan(a, b) }
}
}
}