pub struct ImmutableKdTree<A: Copy + Default, T: Copy + Default, const K: usize, const B: usize> { /* private fields */ }
Expand description
Immutable floating point k-d tree
Offers less memory utilisation, smaller size vs non-immutable tree when serialised, and faster more consistent query performance. This comes at the expense of not being able to modify the contents of the tree after its initial construction, and longer construction times.
Compared to non-dynamic ImmutableKdTree
, this can handle data like point clouds
that may have many occurrences of multiple points have the exact same value on a given axis.
This comes at the expense of slower performance. Memory usage should still be very efficient,
more so than the standard and non-dynamic immutable tree types.
As with the vanilla tree, f64
or f32
are supported currently for co-ordinate
values, or f16
if used with the
half
crate.
A convenient type alias exists for ImmutableKdTree with some sensible defaults set: kiddo::ImmutableKdTree
.
Implementations§
Source§impl<A, T, const K: usize, const B: usize> ImmutableKdTree<A, T, K, B>
impl<A, T, const K: usize, const B: usize> ImmutableKdTree<A, T, K, B>
Sourcepub fn new_from_slice(source: &[[A; K]]) -> Self
pub fn new_from_slice(source: &[[A; K]]) -> Self
Creates an ImmutableKdTree
, balanced and optimized, populated
with items from source
.
ImmutableKdTree
instances are optimally
balanced and tuned, but are not modifiable after construction.
§Examples
use kiddo::immutable::float::kdtree::ImmutableKdTree;
let points: Vec<[f64; 3]> = vec!([1.0f64, 2.0f64, 3.0f64]);
let tree: ImmutableKdTree<f64, u32, 3, 32> = ImmutableKdTree::new_from_slice(&points);
assert_eq!(tree.size(), 1);
Sourcepub fn size(&self) -> usize
pub fn size(&self) -> usize
Returns the current number of elements stored in the tree
§Examples
use kiddo::immutable::float::kdtree::ImmutableKdTree;
let points: Vec<[f64; 3]> = vec!([1.0f64, 2.0f64, 3.0f64]);
let tree: ImmutableKdTree<f64, u32, 3, 32> = ImmutableKdTree::new_from_slice(&points);
assert_eq!(tree.size(), 1);
Source§impl<A: Axis, T: Content, const K: usize, const B: usize> ImmutableKdTree<A, T, K, B>
impl<A: Axis, T: Content, const K: usize, const B: usize> ImmutableKdTree<A, T, K, B>
Sourcepub fn approx_nearest_one<D>(&self, query: &[A; K]) -> NearestNeighbour<A, T>
pub fn approx_nearest_one<D>(&self, query: &[A; K]) -> NearestNeighbour<A, T>
Queries the tree to find the approximate nearest element to query
, using the specified
distance metric function.
Faster than querying for nearest_one(point) due to not recursing up the tree to find potentially closer points in other branches.
§Examples
use kiddo::ImmutableKdTree;
use kiddo::SquaredEuclidean;
let content: Vec<[f64; 3]> = vec!(
[1.0, 2.0, 5.0],
[2.0, 3.0, 6.0]
);
let tree: ImmutableKdTree<f64, 3> = ImmutableKdTree::new_from_slice(&content);
let nearest = tree.approx_nearest_one::<SquaredEuclidean>(&[1.0, 2.0, 5.1]);
assert!((nearest.distance - 0.01f64).abs() < f64::EPSILON);
assert_eq!(nearest.item, 0);
Source§impl<A, T, const K: usize, const B: usize> ImmutableKdTree<A, T, K, B>
impl<A, T, const K: usize, const B: usize> ImmutableKdTree<A, T, K, B>
Sourcepub fn best_n_within<D>(
&self,
query: &[A; K],
dist: A,
max_qty: NonZero<usize>,
) -> impl Iterator<Item = BestNeighbour<A, T>>
pub fn best_n_within<D>( &self, query: &[A; K], dist: A, max_qty: NonZero<usize>, ) -> impl Iterator<Item = BestNeighbour<A, T>>
Finds the “best” n
elements within dist
of query
.
Results are returned in arbitrary order. ‘Best’ is determined by
performing a comparison of the elements using < (ie, std::cmp::Ordering::is_lt
). Returns an iterator.
§Examples
use std::num::NonZero;
use kiddo::ImmutableKdTree;
use kiddo::best_neighbour::BestNeighbour;
use kiddo::SquaredEuclidean;
let content: Vec<[f64; 3]> = vec!(
[1.0, 2.0, 5.0],
[2.0, 3.0, 6.0]
);
let tree: ImmutableKdTree<f64, 3> = ImmutableKdTree::new_from_slice(&content);
let mut best_n_within = tree.best_n_within::<SquaredEuclidean>(&[1.0, 2.0, 5.0], 10f64, NonZero::new(1).unwrap());
let first = best_n_within.next().unwrap();
assert_eq!(first, BestNeighbour { distance: 0.0, item: 0 });
Source§impl<A, T, const K: usize, const B: usize> ImmutableKdTree<A, T, K, B>
impl<A, T, const K: usize, const B: usize> ImmutableKdTree<A, T, K, B>
Sourcepub fn nearest_n<D>(
&self,
query: &[A; K],
max_qty: NonZero<usize>,
) -> Vec<NearestNeighbour<A, T>>
pub fn nearest_n<D>( &self, query: &[A; K], max_qty: NonZero<usize>, ) -> Vec<NearestNeighbour<A, T>>
Finds the nearest qty
elements to query
, according the specified
distance metric function.
§Examples
use std::num::NonZero;
use kiddo::ImmutableKdTree;
use kiddo::SquaredEuclidean;
let content: Vec<[f64; 3]> = vec!(
[1.0, 2.0, 5.0],
[2.0, 3.0, 6.0]
);
let tree: ImmutableKdTree<f64, 3> = ImmutableKdTree::new_from_slice(&content);
let nearest: Vec<_> = tree.nearest_n::<SquaredEuclidean>(&[1.0, 2.0, 5.1], NonZero::new(1).unwrap());
assert_eq!(nearest.len(), 1);
assert!((nearest[0].distance - 0.01f64).abs() < f64::EPSILON);
assert_eq!(nearest[0].item, 0);
Source§impl<A, T, const K: usize, const B: usize> ImmutableKdTree<A, T, K, B>
impl<A, T, const K: usize, const B: usize> ImmutableKdTree<A, T, K, B>
Sourcepub fn nearest_n_within<D>(
&self,
query: &[A; K],
dist: A,
max_items: NonZero<usize>,
sorted: bool,
) -> Vec<NearestNeighbour<A, T>>where
D: DistanceMetric<A, K>,
pub fn nearest_n_within<D>(
&self,
query: &[A; K],
dist: A,
max_items: NonZero<usize>,
sorted: bool,
) -> Vec<NearestNeighbour<A, T>>where
D: DistanceMetric<A, K>,
Finds up to n elements within dist
of query
, using the specified
distance metric function.
§Examples
use std::num::NonZero;
use kiddo::ImmutableKdTree;
use kiddo::SquaredEuclidean;
let content: Vec<[f64; 3]> = vec!(
[1.0, 2.0, 5.0],
[2.0, 3.0, 6.0]
);
let tree: ImmutableKdTree<f64, 3> = ImmutableKdTree::new_from_slice(&content);
let within = tree.nearest_n_within::<SquaredEuclidean>(&[1.0, 2.0, 5.0], 10f64, NonZero::new(2).unwrap(), true);
assert_eq!(within.len(), 2);
Source§impl<A, T, const K: usize, const B: usize> ImmutableKdTree<A, T, K, B>
impl<A, T, const K: usize, const B: usize> ImmutableKdTree<A, T, K, B>
Sourcepub fn nearest_one<D>(&self, query: &[A; K]) -> NearestNeighbour<A, T>where
D: DistanceMetric<A, K>,
pub fn nearest_one<D>(&self, query: &[A; K]) -> NearestNeighbour<A, T>where
D: DistanceMetric<A, K>,
Queries the tree to find the nearest item to the query
point.
Faster than querying for nearest_n(point, 1, …) due to not needing to allocate memory or maintain sorted results.
§Examples
use kiddo::ImmutableKdTree;
use kiddo::SquaredEuclidean;
let content: Vec<[f64; 3]> = vec!(
[1.0, 2.0, 5.0],
[2.0, 3.0, 6.0]
);
let tree: ImmutableKdTree<f64, 3> = ImmutableKdTree::new_from_slice(&content);
let nearest = tree.nearest_one::<SquaredEuclidean>(&[1.0, 2.0, 5.1]);
assert!((nearest.distance - 0.01f64).abs() < f64::EPSILON);
assert_eq!(nearest.item, 0);
Source§impl<A, T, const K: usize, const B: usize> ImmutableKdTree<A, T, K, B>
impl<A, T, const K: usize, const B: usize> ImmutableKdTree<A, T, K, B>
Sourcepub fn within<D>(&self, query: &[A; K], dist: A) -> Vec<NearestNeighbour<A, T>>
pub fn within<D>(&self, query: &[A; K], dist: A) -> Vec<NearestNeighbour<A, T>>
Finds all elements within dist
of query
, using the specified
distance metric function.
Results are returned sorted nearest-first
§Examples
use kiddo::ImmutableKdTree;
use kiddo::SquaredEuclidean;
let content: Vec<[f64; 3]> = vec!(
[1.0, 2.0, 5.0],
[2.0, 3.0, 6.0]
);
let tree: ImmutableKdTree<f64, 3> = ImmutableKdTree::new_from_slice(&content);
let within = tree.within::<SquaredEuclidean>(&[1.0, 2.0, 5.0], 10f64);
assert_eq!(within.len(), 2);
Source§impl<A, T, const K: usize, const B: usize> ImmutableKdTree<A, T, K, B>
impl<A, T, const K: usize, const B: usize> ImmutableKdTree<A, T, K, B>
Sourcepub fn within_unsorted<D>(
&self,
query: &[A; K],
dist: A,
) -> Vec<NearestNeighbour<A, T>>
pub fn within_unsorted<D>( &self, query: &[A; K], dist: A, ) -> Vec<NearestNeighbour<A, T>>
Finds all elements within dist
of query
, using the specified
distance metric function.
Results are returned in arbitrary order. Faster than within
.
§Examples
use kiddo::ImmutableKdTree;
use kiddo::SquaredEuclidean;
let content: Vec<[f64; 3]> = vec!(
[1.0, 2.0, 5.0],
[2.0, 3.0, 6.0]
);
let tree: ImmutableKdTree<f64, 3> = ImmutableKdTree::new_from_slice(&content);
let within = tree.within_unsorted::<SquaredEuclidean>(&[1.0, 2.0, 5.0], 10f64);
assert_eq!(within.len(), 2);
Trait Implementations§
Source§impl<A: Copy + Default, T: Copy + Default, const K: usize, const B: usize> Archive for ImmutableKdTree<A, T, K, B>
impl<A: Copy + Default, T: Copy + Default, const K: usize, const B: usize> Archive for ImmutableKdTree<A, T, K, B>
Source§type Archived = ArchivedR8ImmutableKdTree<A, T, K, B>
type Archived = ArchivedR8ImmutableKdTree<A, T, K, B>
Source§type Resolver = ImmutableKdTreeR8Resolver<A, T, K, B>
type Resolver = ImmutableKdTreeR8Resolver<A, T, K, B>
Source§fn resolve(&self, resolver: Self::Resolver, out: Place<Self::Archived>)
fn resolve(&self, resolver: Self::Resolver, out: Place<Self::Archived>)
Source§const COPY_OPTIMIZATION: CopyOptimization<Self> = _
const COPY_OPTIMIZATION: CopyOptimization<Self> = _
serialize
. Read moreSource§impl<A: Clone + Copy + Default, T: Clone + Copy + Default, const K: usize, const B: usize> Clone for ImmutableKdTree<A, T, K, B>
impl<A: Clone + Copy + Default, T: Clone + Copy + Default, const K: usize, const B: usize> Clone for ImmutableKdTree<A, T, K, B>
Source§fn clone(&self) -> ImmutableKdTree<A, T, K, B>
fn clone(&self) -> ImmutableKdTree<A, T, K, B>
1.0.0 · Source§const fn clone_from(&mut self, source: &Self)
const fn clone_from(&mut self, source: &Self)
source
. Read moreSource§impl<A: Debug + Copy + Default, T: Debug + Copy + Default, const K: usize, const B: usize> Debug for ImmutableKdTree<A, T, K, B>
impl<A: Debug + Copy + Default, T: Debug + Copy + Default, const K: usize, const B: usize> Debug for ImmutableKdTree<A, T, K, B>
Source§impl<'de, A, T, const K: usize, const B: usize> Deserialize<'de> for ImmutableKdTree<A, T, K, B>where
A: Deserialize<'de> + Deserialize<'de> + Copy + Default,
T: Deserialize<'de> + Copy + Default + Deserialize<'de>,
impl<'de, A, T, const K: usize, const B: usize> Deserialize<'de> for ImmutableKdTree<A, T, K, B>where
A: Deserialize<'de> + Deserialize<'de> + Copy + Default,
T: Deserialize<'de> + Copy + Default + Deserialize<'de>,
Source§fn deserialize<__D>(__deserializer: __D) -> Result<Self, __D::Error>where
__D: Deserializer<'de>,
fn deserialize<__D>(__deserializer: __D) -> Result<Self, __D::Error>where
__D: Deserializer<'de>,
Source§impl<__D: Fallible + ?Sized, A: Copy + Default, T: Copy + Default, const K: usize, const B: usize> Deserialize<ImmutableKdTree<A, T, K, B>, __D> for Archived<ImmutableKdTree<A, T, K, B>>where
EncodeAVec<A>: ArchiveWith<AVec<A>> + DeserializeWith<<EncodeAVec<A> as ArchiveWith<AVec<A>>>::Archived, AVec<A>, __D>,
[Vec<A>; K]: Archive,
<[Vec<A>; K] as Archive>::Archived: Deserialize<[Vec<A>; K], __D>,
Vec<T>: Archive,
<Vec<T> as Archive>::Archived: Deserialize<Vec<T>, __D>,
Vec<(u32, u32)>: Archive,
<Vec<(u32, u32)> as Archive>::Archived: Deserialize<Vec<(u32, u32)>, __D>,
i32: Archive,
<i32 as Archive>::Archived: Deserialize<i32, __D>,
impl<__D: Fallible + ?Sized, A: Copy + Default, T: Copy + Default, const K: usize, const B: usize> Deserialize<ImmutableKdTree<A, T, K, B>, __D> for Archived<ImmutableKdTree<A, T, K, B>>where
EncodeAVec<A>: ArchiveWith<AVec<A>> + DeserializeWith<<EncodeAVec<A> as ArchiveWith<AVec<A>>>::Archived, AVec<A>, __D>,
[Vec<A>; K]: Archive,
<[Vec<A>; K] as Archive>::Archived: Deserialize<[Vec<A>; K], __D>,
Vec<T>: Archive,
<Vec<T> as Archive>::Archived: Deserialize<Vec<T>, __D>,
Vec<(u32, u32)>: Archive,
<Vec<(u32, u32)> as Archive>::Archived: Deserialize<Vec<(u32, u32)>, __D>,
i32: Archive,
<i32 as Archive>::Archived: Deserialize<i32, __D>,
Source§fn deserialize(
&self,
deserializer: &mut __D,
) -> Result<ImmutableKdTree<A, T, K, B>, <__D as Fallible>::Error>
fn deserialize( &self, deserializer: &mut __D, ) -> Result<ImmutableKdTree<A, T, K, B>, <__D as Fallible>::Error>
Source§impl<A, T, const K: usize, const B: usize> From<&[[A; K]]> for ImmutableKdTree<A, T, K, B>
impl<A, T, const K: usize, const B: usize> From<&[[A; K]]> for ImmutableKdTree<A, T, K, B>
Source§fn from(slice: &[[A; K]]) -> Self
fn from(slice: &[[A; K]]) -> Self
Creates an ImmutableKdTree
, balanced and optimized, populated
with items from source
.
ImmutableKdTree
instances are optimally
balanced and tuned, but are not modifiable after construction.
§Examples
use kiddo::immutable::float::kdtree::ImmutableKdTree;
let points: Vec<[f64; 3]> = vec!([1.0f64, 2.0f64, 3.0f64]);
let tree: ImmutableKdTree<f64, u32, 3, 32> = (&*points).into();
assert_eq!(tree.size(), 1);
Source§impl<A, T, const K: usize, const B: usize> From<ImmutableKdTree<A, T, K, B>> for ImmutableKdTreeRK<A, T, K, B>
impl<A, T, const K: usize, const B: usize> From<ImmutableKdTree<A, T, K, B>> for ImmutableKdTreeRK<A, T, K, B>
Source§fn from(orig: ImmutableKdTree<A, T, K, B>) -> Self
fn from(orig: ImmutableKdTree<A, T, K, B>) -> Self
Creates an ImmutableKdTreeRK
from an ImmutableKdTree
ImmutableKdTreeRK
implements rkyv::Archive
, permitting it to be serialized to
as close to a zero-copy form as possible. Zero-copy-deserialized ImmutableKdTreeRK
instances can be converted to instances of AlignedArchivedImmutableKdTree
, which involves
a copy of the stems to ensure correct alignment, but re-use of the rest of the structure.
AlignedArchivedImmutableKdTree
instances can then be queried in the same way as the original
ImmutableKdTree
.
§Examples
use kiddo::immutable::float::kdtree::ImmutableKdTree;
let points: Vec<[f64; 3]> = vec!([1.0f64, 2.0f64, 3.0f64]);
let tree: ImmutableKdTree<f64, u32, 3, 32> = (&*points).into();
assert_eq!(tree.size(), 1);
Source§impl<A: PartialEq + Copy + Default, T: PartialEq + Copy + Default, const K: usize, const B: usize> PartialEq for ImmutableKdTree<A, T, K, B>
impl<A: PartialEq + Copy + Default, T: PartialEq + Copy + Default, const K: usize, const B: usize> PartialEq for ImmutableKdTree<A, T, K, B>
Source§fn eq(&self, other: &ImmutableKdTree<A, T, K, B>) -> bool
fn eq(&self, other: &ImmutableKdTree<A, T, K, B>) -> bool
self
and other
values to be equal, and is used by ==
.Source§impl<__S: Fallible + ?Sized, A: Copy + Default, T: Copy + Default, const K: usize, const B: usize> Serialize<__S> for ImmutableKdTree<A, T, K, B>
impl<__S: Fallible + ?Sized, A: Copy + Default, T: Copy + Default, const K: usize, const B: usize> Serialize<__S> for ImmutableKdTree<A, T, K, B>
impl<A: Copy + Default, T: Copy + Default, const K: usize, const B: usize> StructuralPartialEq for ImmutableKdTree<A, T, K, B>
Auto Trait Implementations§
impl<A, T, const K: usize, const B: usize> Freeze for ImmutableKdTree<A, T, K, B>
impl<A, T, const K: usize, const B: usize> RefUnwindSafe for ImmutableKdTree<A, T, K, B>where
A: RefUnwindSafe,
T: RefUnwindSafe,
impl<A, T, const K: usize, const B: usize> Send for ImmutableKdTree<A, T, K, B>
impl<A, T, const K: usize, const B: usize> Sync for ImmutableKdTree<A, T, K, B>
impl<A, T, const K: usize, const B: usize> Unpin for ImmutableKdTree<A, T, K, B>
impl<A, T, const K: usize, const B: usize> UnwindSafe for ImmutableKdTree<A, T, K, B>
Blanket Implementations§
Source§impl<T> ArchivePointee for T
impl<T> ArchivePointee for T
Source§type ArchivedMetadata = ()
type ArchivedMetadata = ()
Source§fn pointer_metadata(
_: &<T as ArchivePointee>::ArchivedMetadata,
) -> <T as Pointee>::Metadata
fn pointer_metadata( _: &<T as ArchivePointee>::ArchivedMetadata, ) -> <T as Pointee>::Metadata
Source§impl<T> ArchivePointee for T
impl<T> ArchivePointee for T
Source§type ArchivedMetadata = ()
type ArchivedMetadata = ()
Source§fn pointer_metadata(
_: &<T as ArchivePointee>::ArchivedMetadata,
) -> <T as Pointee>::Metadata
fn pointer_metadata( _: &<T as ArchivePointee>::ArchivedMetadata, ) -> <T as Pointee>::Metadata
Source§impl<T> ArchiveUnsized for Twhere
T: Archive,
impl<T> ArchiveUnsized for Twhere
T: Archive,
Source§type Archived = <T as Archive>::Archived
type Archived = <T as Archive>::Archived
Archive
, it may be
unsized. Read moreSource§fn archived_metadata(
&self,
) -> <<T as ArchiveUnsized>::Archived as ArchivePointee>::ArchivedMetadata
fn archived_metadata( &self, ) -> <<T as ArchiveUnsized>::Archived as ArchivePointee>::ArchivedMetadata
Source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
Source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
Source§impl<T> CheckedAs for T
impl<T> CheckedAs for T
Source§fn checked_as<Dst>(self) -> Option<Dst>where
T: CheckedCast<Dst>,
fn checked_as<Dst>(self) -> Option<Dst>where
T: CheckedCast<Dst>,
Source§impl<Src, Dst> CheckedCastFrom<Src> for Dstwhere
Src: CheckedCast<Dst>,
impl<Src, Dst> CheckedCastFrom<Src> for Dstwhere
Src: CheckedCast<Dst>,
Source§fn checked_cast_from(src: Src) -> Option<Dst>
fn checked_cast_from(src: Src) -> Option<Dst>
Source§impl<T> CloneToUninit for Twhere
T: Clone,
impl<T> CloneToUninit for Twhere
T: Clone,
Source§impl<F, W, T, D> Deserialize<With<T, W>, D> for F
impl<F, W, T, D> Deserialize<With<T, W>, D> for F
Source§impl<T> IntoEither for T
impl<T> IntoEither for T
Source§fn into_either(self, into_left: bool) -> Either<Self, Self>
fn into_either(self, into_left: bool) -> Either<Self, Self>
self
into a Left
variant of Either<Self, Self>
if into_left
is true
.
Converts self
into a Right
variant of Either<Self, Self>
otherwise. Read moreSource§fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
self
into a Left
variant of Either<Self, Self>
if into_left(&self)
returns true
.
Converts self
into a Right
variant of Either<Self, Self>
otherwise. Read moreSource§impl<T> LayoutRaw for T
impl<T> LayoutRaw for T
Source§fn layout_raw(_: <T as Pointee>::Metadata) -> Result<Layout, LayoutError>
fn layout_raw(_: <T as Pointee>::Metadata) -> Result<Layout, LayoutError>
Source§impl<Src, Dst> LosslessTryInto<Dst> for Srcwhere
Dst: LosslessTryFrom<Src>,
impl<Src, Dst> LosslessTryInto<Dst> for Srcwhere
Dst: LosslessTryFrom<Src>,
Source§fn lossless_try_into(self) -> Option<Dst>
fn lossless_try_into(self) -> Option<Dst>
Source§impl<Src, Dst> LossyInto<Dst> for Srcwhere
Dst: LossyFrom<Src>,
impl<Src, Dst> LossyInto<Dst> for Srcwhere
Dst: LossyFrom<Src>,
Source§fn lossy_into(self) -> Dst
fn lossy_into(self) -> Dst
Source§impl<T, N1, N2> Niching<NichedOption<T, N1>> for N2
impl<T, N1, N2> Niching<NichedOption<T, N1>> for N2
Source§unsafe fn is_niched(niched: *const NichedOption<T, N1>) -> bool
unsafe fn is_niched(niched: *const NichedOption<T, N1>) -> bool
Source§fn resolve_niched(out: Place<NichedOption<T, N1>>)
fn resolve_niched(out: Place<NichedOption<T, N1>>)
out
indicating that a T
is niched.