8#ifdef CLUSTERING_USE_AVX2
9#include "clustering/math/detail/aabb_gap_avx2.h"
44[[nodiscard]]
inline T
pointAabbGapSq(
const T *point, std::span<const T> boxMin,
45 std::span<const T> boxMax)
noexcept {
46 static_assert(std::is_same_v<T, float>,
47 "pointAabbGapSq: T must be float; a double specialization is out of scope.");
49 const std::size_t d = boxMin.size();
50#ifdef CLUSTERING_USE_AVX2
51 return detail::pointAabbGapSqAvx2F32(point, boxMin.data(), boxMax.data(), d);
54 for (std::size_t j = 0; j < d; ++j) {
56 if (point[j] < boxMin[j]) {
57 gap = boxMin[j] - point[j];
58 }
else if (point[j] > boxMax[j]) {
59 gap = point[j] - boxMax[j];
83[[nodiscard]]
inline T
aabbAabbGapSq(std::span<const T> minA, std::span<const T> maxA,
84 std::span<const T> minB, std::span<const T> maxB)
noexcept {
86 minA.size() == minB.size());
88 for (std::size_t j = 0; j < minA.size(); ++j) {
90 if (minA[j] > maxB[j]) {
91 gap = minA[j] - maxB[j];
92 }
else if (minB[j] > maxA[j]) {
93 gap = minB[j] - maxA[j];
115 std::span<const T> boxMax)
noexcept {
118 for (std::size_t j = 0; j < boxMin.size(); ++j) {
119 const T lo = point[j] - boxMin[j];
120 const T hi = boxMax[j] - point[j];
121 const T loMag = lo < T{0} ? -lo : lo;
122 const T hiMag = hi < T{0} ? -hi : hi;
123 const T farSide = loMag > hiMag ? loMag : hiMag;
124 sum += farSide * farSide;
#define CLUSTERING_ALWAYS_ASSERT(cond)
Release-active assertion: evaluates cond in every build configuration.
T pointAabbGapSq(const T *point, std::span< const T > boxMin, std::span< const T > boxMax) noexcept
Squared gap distance between a point and an axis-aligned bounding box.
T aabbAabbGapSq(std::span< const T > minA, std::span< const T > maxA, std::span< const T > minB, std::span< const T > maxB) noexcept
Squared gap distance between two axis-aligned bounding boxes.
T sum(const NDArray< T, 1, L > &x) noexcept
Naive single-pass sum of a rank-1 array.
T pointAabbFarthestSq(const T *point, std::span< const T > boxMin, std::span< const T > boxMax) noexcept
Squared farthest distance from a point to any point of an axis-aligned bounding box.