scirs2_spatial/distance/
manhattandistance_traits.rs

1//! # ManhattanDistance - Trait Implementations
2//!
3//! This module contains trait implementations for `ManhattanDistance`.
4//!
5//! ## Implemented Traits
6//!
7//! - `Default`
8//! - `Distance`
9//!
10//! 🤖 Generated with [SplitRS](https://github.com/cool-japan/splitrs)
11
12use scirs2_core::numeric::Float;
13
14use super::functions::prefetch_read;
15use super::functions::Distance;
16use super::types::ManhattanDistance;
17
18impl<T: Float> Default for ManhattanDistance<T> {
19    fn default() -> Self {
20        Self::new()
21    }
22}
23
24impl<T: Float + Send + Sync> Distance<T> for ManhattanDistance<T> {
25    fn distance(&self, a: &[T], b: &[T]) -> T {
26        if a.len() != b.len() {
27            return T::nan();
28        }
29        if let Some(result) = Self::try_simd_f64(a, b) {
30            return result;
31        }
32        if let Some(result) = Self::try_simd_f32(a, b) {
33            return result;
34        }
35        let len = a.len();
36        let mut sum = T::zero();
37        let chunks = len / 4;
38        for i in 0..chunks {
39            let base = i * 4;
40            if base + 8 < len {
41                let end_idx = (base + 8).min(len);
42                prefetch_read(&a[base + 4..end_idx]);
43                prefetch_read(&b[base + 4..end_idx]);
44            }
45            let diff0_abs = (a[base] - b[base]).abs();
46            let diff1_abs = (a[base + 1] - b[base + 1]).abs();
47            let diff2_abs = (a[base + 2] - b[base + 2]).abs();
48            let diff3_abs = (a[base + 3] - b[base + 3]).abs();
49            sum = sum + diff0_abs + diff1_abs + diff2_abs + diff3_abs;
50        }
51        for i in (chunks * 4)..len {
52            sum = sum + (a[i] - b[i]).abs();
53        }
54        sum
55    }
56    fn min_distance_point_rectangle(&self, point: &[T], mins: &[T], maxes: &[T]) -> T {
57        let mut sum = T::zero();
58        for i in 0..point.len() {
59            let coord = point[i];
60            let min_val = mins[i];
61            let max_val = maxes[i];
62            let clamped = coord.max(min_val).min(max_val);
63            let diff = (coord - clamped).abs();
64            sum = sum + diff;
65        }
66        sum
67    }
68}