//! This library is intended to be incredibly lightweight (cost nothing), but provide
//! common traits that can be shared among spatial data structures.
extern crate alloc;
pub use *;
pub use *;
use ;
/// This trait is implemented by points inside of a metric space.
///
/// It is important that all points that implement this trait satisfy
/// the [triangle inequality](https://en.wikipedia.org/wiki/Triangle_inequality).
/// This requirement basically means that the sum of distances that start
/// at a point A and end at a point B can never be less than the distance
/// from A to B directly. All implementors must also take care to avoid
/// negative numbers, as valid distances are only positive numbers.
///
/// In practice, the `u64` distance returned by this trait should only be used
/// to compare distances between points in a metric space. If the distances are added,
/// one would need to take care of overflow. Regardless of the underlying representation
/// (float or integer), one can map the metric distance into the set of 64-bit integers.
/// This may cause some loss of precision, but the choice to use 64 bits of precision
/// is one that is done with practicality in mind. Specifically, there may be cases
/// where only a few bits of precision are needed (hamming distance), but there may also
/// be cases where a 64-bit floating point number may be different by only one bit of precision.
/// It is trivial to map a 64-bit float to the unsigned integers for comparison, as
/// [IEEE 754](https://en.wikipedia.org/wiki/IEEE_754) is designed such that a direct
/// bit-to-bit translation of a 64-bit float to a 64-bit signed integer will compare
/// as intended using a standard signed integer comparation operation. Anything with more
/// than 64 bits of precision will need to be truncated.
///
/// If you have a floating distance, use [`f32_metric`] or [`f64_metric`].
/// Any data contained in this struct is treated such that all of the bits
/// of the data are each separate dimensions that can be of length `0` or `1`.
/// This is referred to as [hamming space](https://en.wikipedia.org/wiki/Hamming_space).
/// This leads to all [Lp spaces](https://en.wikipedia.org/wiki/Lp_space) being
/// equal and all distances being no larger than the number of bits of the data.
///
/// This is typically used to perform searches on data that was binarized using
/// hyperplane comparisons on high dimensional floating-point features or data built
/// on a series of binary comparisons. Hamming distance is incredibly fast
/// to compute. Hamming space can be difficult to search because the
/// amount of equidistant points is high (see "Thick Boundaries in Binary Space and
/// Their Influence on Nearest-Neighbor Search") and they can quickly
/// [grow in dimensionality](https://en.wikipedia.org/wiki/Curse_of_dimensionality).
;
/// L1 distance is applied to items wrapped in this type.
;
/// L2 distance is applied to items wrapped in this type.
;
/// L-infinity distance is applied to items wrapped in this type.
;
/// Converts a `f32` metric to a `u32` metric with no loss in precision.
/// Converts a `f64` metric into a `u32` metric by truncating 32-bits of precision.
///
/// ```
/// use space::f64_metric;
/// assert!(f64_metric(0.5) < f64_metric(1.0));
/// assert!(f64_metric(0.100001) < f64_metric(0.100002));
/// assert!(f64_metric(0.0) < f64_metric(0.78));
/// assert!(f64_metric(0.9) > f64_metric(0.78));
/// ```
/// For k-NN algorithms to return neighbors.
/// Performs a linear knn search by iterating over everything in the space
/// and performing a binary search on running set of neighbors.
///
/// * `search` is the feature we are searching nearest neighbors for.
/// * `neighbors` is where the nearest neighbors are placed nearest to furthest.
/// * `space` is all of the points we are searching.
///
/// Returns a slice of the nearest neighbors from nearest to furthest.
where
T: MetricPoint,