diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 888eef4c..70f16ee4 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -68,7 +68,7 @@ jobs: - uses: LoliGothick/clippy-check@master with: token: ${{ secrets.GITHUB_TOKEN }} - options: --features=serde,rkyv,rkyv_08,test_utils --no-deps + options: --features=serde,rkyv_08,test_utils --no-deps name: Clippy (stable) - name: Check Rustdoc Links @@ -105,7 +105,7 @@ jobs: - uses: LoliGothick/clippy-check@master with: token: ${{ secrets.GITHUB_TOKEN }} - options: --features tracing,fixed,rkyv,rkyv_08,serde --no-deps + options: --features tracing,fixed,rkyv_08,serde --no-deps name: Clippy nightly - name: Check Rustdoc Links @@ -208,11 +208,9 @@ jobs: - name: Cargo test run: | - cargo run --example build-float-doctest-tree --features="rkyv" - cargo run --example build-immutable-doctest-tree --features="rkyv" cargo run --example build-float-doctest-tree-rkyv_08 --features="rkyv_08" cargo run --example build-immutable-doctest-tree-rkyv_08 --features="rkyv_08" - cargo test --workspace --features=serde,rkyv,rkyv_08,test_utils + cargo test --workspace --features=serde,rkyv_08,test_utils test-all-features: name: Run Tests (Nightly, all features enabled) @@ -242,18 +240,14 @@ jobs: - name: Cargo test (dev build) run: | - cargo run --example build-float-doctest-tree --features="rkyv" - cargo run --example build-immutable-doctest-tree --features="rkyv" cargo run --example build-float-doctest-tree-rkyv_08 --features="rkyv_08" cargo run --example build-immutable-doctest-tree-rkyv_08 --features="rkyv_08" - cargo test --workspace --features "csv,f16,las,serde,simd,rkyv,rkyv_08,test_utils,tracing" + cargo test --workspace --features "csv,f16,las,serde,simd,rkyv_08,test_utils,tracing" - name: Cargo test (release build) env: RUSTFLAGS: '-C target-cpu=native' run: | - cargo run --example build-float-doctest-tree --features="rkyv" - cargo run --example build-immutable-doctest-tree --features="rkyv" cargo run --example build-float-doctest-tree-rkyv_08 --features="rkyv_08" cargo run --example build-immutable-doctest-tree-rkyv_08 --features="rkyv_08" - cargo test --workspace --features "csv,f16,las,serde,simd,rkyv,rkyv_08,test_utils,tracing" --release + cargo test --workspace --features "csv,f16,las,serde,simd,rkyv_08,test_utils,tracing" --release diff --git a/.github/workflows/coverage.yml b/.github/workflows/coverage.yml index f85ab75a..947da15b 100644 --- a/.github/workflows/coverage.yml +++ b/.github/workflows/coverage.yml @@ -40,8 +40,7 @@ jobs: - name: Generate Coverage run: | cargo run --example build-immutable-doctest-tree-rkyv_08 --features="rkyv_08" - cargo run --example build-immutable-doctest-tree --features="rkyv" - cargo llvm-cov --features "csv,las,serde,simd,rkyv,rkyv_08,test_utils,tracing" --tests --ignore-run-fail --workspace --codecov --output-path codecov.json + cargo llvm-cov --features "csv,las,serde,simd,rkyv_08,test_utils,tracing" --tests --ignore-run-fail --workspace --codecov --output-path codecov.json - uses: codecov/codecov-action@v5 with: diff --git a/Cargo.toml b/Cargo.toml index d90dbdc3..3e8de2ee 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -68,9 +68,9 @@ version = "1" features = ["num-traits"] optional = true -# half 2.5.0 switched from rkyv 0.7 to rkyv 0.8. [dependencies.half] -version = "=2.4.1" +package = "half" +version = "2.5" optional = true features = ["num-traits"] @@ -92,12 +92,6 @@ version = "1" optional = true [dependencies.rkyv] -version = "0.7" -optional = true -default-features = false -features = ["alloc", "copy_unsafe", "size_64"] - -[dependencies.rkyv_08] package = "rkyv" version = "0.8.9" optional = true @@ -133,8 +127,7 @@ fixed = ["dep:fixed"] las = ["dep:las"] serde = ["dep:serde", "serde/derive", "dep:serde_derive", "dep:serde_with", "fixed/serde", "aligned-vec/serde"] simd = [] -rkyv = ["dep:rkyv"] -rkyv_08 = ["dep:rkyv_08"] +rkyv_08 = ["dep:rkyv"] test_utils = ["dep:rand", "dep:rand_chacha", "dep:rayon", "dep:fixed"] tracing = ["dep:tracing", "dep:tracing-subscriber"] @@ -184,21 +177,11 @@ required-features = ["test_utils"] name = "avx2-check" path = "examples/avx2-check.rs" -[[example]] -name = "build-float-doctest-tree" -path = "examples/build-float-doctest-tree.rs" -required-features = ["rkyv"] - [[example]] name = "build-float-doctest-tree-rkyv_08" path = "examples/build-float-doctest-tree-rkyv_08.rs" required-features = ["rkyv_08"] -[[example]] -name = "build-immutable-doctest-tree" -path = "examples/build-immutable-doctest-tree.rs" -required-features = ["rkyv"] - [[example]] name = "build-immutable-doctest-tree-rkyv_08" path = "examples/build-immutable-doctest-tree-rkyv_08.rs" @@ -233,16 +216,6 @@ name = "immutable-large" path = "examples/immutable-large.rs" required-features = ["test_utils"] -[[example]] -name = "immutable-rkyv-serialize" -path = "examples/immutable-rkyv-serialize.rs" -required-features = ["rkyv"] - -[[example]] -name = "immutable-rkyv-deserialize" -path = "examples/immutable-rkyv-deserialize.rs" -required-features = ["rkyv"] - [[example]] name = "immutable-rkyv_08-serialize" path = "examples/immutable-rkyv_08-serialize.rs" @@ -256,27 +229,12 @@ required-features = ["rkyv_08"] [[example]] name = "pointcloud-las" path = "examples/pointcloud-las.rs" -required-features = ["las", "rkyv"] +required-features = ["las", "rkyv_08"] [[example]] name = "pointcloud-csv" path = "examples/pointcloud-csv.rs" -required-features = ["csv", "rkyv"] - -[[example]] -name = "rkyv" -path = "examples/rkyv.rs" -required-features = ["csv", "rkyv"] - -[[example]] -name = "rkyv-large-serialize" -path = "examples/rkyv-large-serialize.rs" -required-features = ["rkyv"] - -[[example]] -name = "rkyv-large-deserialize" -path = "examples/rkyv-large-deserialize.rs" -required-features = ["rkyv"] +required-features = ["csv", "rkyv_08"] [[example]] name = "serde" diff --git a/examples/build-float-doctest-tree-rkyv_08.rs b/examples/build-float-doctest-tree-rkyv_08.rs index b2797b8a..e489f8c1 100644 --- a/examples/build-float-doctest-tree-rkyv_08.rs +++ b/examples/build-float-doctest-tree-rkyv_08.rs @@ -4,7 +4,7 @@ use std::error::Error; use std::fs::File; use std::io::Write; -use rkyv_08::{rancor::Error as RkyvError, to_bytes}; +use rkyv::{rancor::Error as RkyvError, to_bytes}; use kiddo::KdTree; diff --git a/examples/build-float-doctest-tree.rs b/examples/build-float-doctest-tree.rs deleted file mode 100644 index 2e2414b0..00000000 --- a/examples/build-float-doctest-tree.rs +++ /dev/null @@ -1,43 +0,0 @@ -// This example builds /examples/float-doctest-tree.rkyv, which is needed -// if you want to run the float ArchivedTree doctests -use std::error::Error; -use std::fs::File; -use std::io::Write; - -use rkyv::ser::serializers::{AlignedSerializer, BufferScratch, CompositeSerializer}; -use rkyv::ser::Serializer; -use rkyv::{AlignedVec, Infallible}; - -use kiddo::KdTree; - -const BUFFER_LEN: usize = 300_000; -const SCRATCH_LEN: usize = 300_000; - -fn main() -> Result<(), Box> { - // build and serialize small tree for ArchivedKdTree doctests - let mut tree: KdTree = KdTree::new(); - tree.add(&[1.0, 2.0, 5.0], 100); - tree.add(&[2.0, 3.0, 6.0], 101); - - let mut serialize_buffer = AlignedVec::with_capacity(BUFFER_LEN); - let mut serialize_scratch = AlignedVec::with_capacity(SCRATCH_LEN); - unsafe { - serialize_scratch.set_len(SCRATCH_LEN); - } - serialize_buffer.clear(); - let mut serializer = CompositeSerializer::new( - AlignedSerializer::new(&mut serialize_buffer), - BufferScratch::new(&mut serialize_scratch), - Infallible, - ); - serializer - .serialize_value(&tree) - .expect("Could not serialize with rkyv"); - - let buf = serializer.into_serializer().into_inner(); - let mut file = File::create("./examples/float-doctest-tree.rkyv")?; - file.write_all(buf) - .expect("Could not write serialized rkyv to file"); - - Ok(()) -} diff --git a/examples/build-immutable-doctest-tree-rkyv_08.rs b/examples/build-immutable-doctest-tree-rkyv_08.rs index a0bed7d0..55749ab0 100644 --- a/examples/build-immutable-doctest-tree-rkyv_08.rs +++ b/examples/build-immutable-doctest-tree-rkyv_08.rs @@ -1,5 +1,5 @@ use kiddo::immutable::float::kdtree::ImmutableKdTree; -use rkyv_08::{rancor::Error as RkyvError, to_bytes}; +use rkyv::{rancor::Error as RkyvError, to_bytes}; use std::error::Error; use std::fs::File; use std::io::Write; diff --git a/examples/build-immutable-doctest-tree.rs b/examples/build-immutable-doctest-tree.rs deleted file mode 100644 index 4f9a8240..00000000 --- a/examples/build-immutable-doctest-tree.rs +++ /dev/null @@ -1,43 +0,0 @@ -// This example builds /examples/immutable-doctest-tree.rkyv, which is needed -// if you want to run the ArchivedImmutableTree doctests -use std::error::Error; -use std::fs::File; -use std::io::Write; - -use kiddo::immutable::float::kdtree::{ImmutableKdTree, ImmutableKdTreeRK}; -use rkyv::ser::serializers::{AlignedSerializer, BufferScratch, CompositeSerializer}; -use rkyv::ser::Serializer; -use rkyv::{AlignedVec, Infallible}; - -const BUFFER_LEN: usize = 300_000; -const SCRATCH_LEN: usize = 300_000; - -fn main() -> Result<(), Box> { - // build and serialize small tree for ArchivedImmutableKdTree doctests - let content: Vec<[f64; 3]> = vec![[1.0, 2.0, 5.0], [2.0, 3.0, 6.0]]; - let tree: ImmutableKdTree = ImmutableKdTree::new_from_slice(&content); - - let rk_tree: ImmutableKdTreeRK = tree.into(); - - let mut serialize_buffer = AlignedVec::with_capacity(BUFFER_LEN); - let mut serialize_scratch = AlignedVec::with_capacity(SCRATCH_LEN); - unsafe { - serialize_scratch.set_len(SCRATCH_LEN); - } - serialize_buffer.clear(); - let mut serializer = CompositeSerializer::new( - AlignedSerializer::new(&mut serialize_buffer), - BufferScratch::new(&mut serialize_scratch), - Infallible, - ); - serializer - .serialize_value(&rk_tree) - .expect("Could not serialize with rkyv"); - - let buf = serializer.into_serializer().into_inner(); - let mut file = File::create("./examples/immutable-doctest-tree.rkyv")?; - file.write_all(buf) - .expect("Could not write serialized rkyv to file"); - - Ok(()) -} diff --git a/examples/float-rkyv_08-deserialize.rs b/examples/float-rkyv_08-deserialize.rs index df81132c..ce34c45e 100644 --- a/examples/float-rkyv_08-deserialize.rs +++ b/examples/float-rkyv_08-deserialize.rs @@ -9,7 +9,7 @@ use tracing::Level; #[cfg(feature = "tracing")] use tracing_subscriber::fmt; -use rkyv_08::rancor::Error as RkyvError; +use rkyv::rancor::Error as RkyvError; use kiddo::float::kdtree::ArchivedR8KdTree; use kiddo::float::kdtree::KdTree; @@ -34,7 +34,7 @@ where { // full deserialization let start = Instant::now(); - let tree = unsafe { rkyv_08::from_bytes_unchecked::(&buf) }?; + let tree = unsafe { rkyv::from_bytes_unchecked::(&buf) }?; let loaded = Instant::now(); // perform some queries @@ -116,7 +116,7 @@ where // Get archived tree let archived_tree = - rkyv_08::access::, RkyvError>(&buf[..]).unwrap(); + rkyv::access::, RkyvError>(&buf[..]).unwrap(); let loaded = Instant::now(); println!("Tree Size: {}", archived_tree.size()); @@ -200,7 +200,7 @@ where // Get archived tree using unsafe method let archived_tree = - unsafe { rkyv_08::access_unchecked::>(&buf) }; + unsafe { rkyv::access_unchecked::>(&buf) }; let loaded = Instant::now(); // perform a query using the wrapper diff --git a/examples/float-rkyv_08-serialize.rs b/examples/float-rkyv_08-serialize.rs index 9eaa4f08..2a833751 100644 --- a/examples/float-rkyv_08-serialize.rs +++ b/examples/float-rkyv_08-serialize.rs @@ -1,7 +1,7 @@ use elapsed::ElapsedDuration; use rand::Rng; use rand_chacha::rand_core::SeedableRng; -use rkyv_08::{rancor::Error as RkyvError, to_bytes}; +use rkyv::{rancor::Error as RkyvError, to_bytes}; use std::error::Error; use std::fs::File; use std::io::Write; diff --git a/examples/immutable-rkyv-deserialize.rs b/examples/immutable-rkyv-deserialize.rs deleted file mode 100644 index 908713cb..00000000 --- a/examples/immutable-rkyv-deserialize.rs +++ /dev/null @@ -1,44 +0,0 @@ -use elapsed::ElapsedDuration; -use memmap::MmapOptions; -use std::error::Error; -use std::fs::File; -use std::time::Instant; -#[cfg(feature = "tracing")] -use tracing::Level; -#[cfg(feature = "tracing")] -use tracing_subscriber::fmt; - -use kiddo::immutable::float::kdtree::AlignedArchivedImmutableKdTree; -use kiddo::SquaredEuclidean; - -type Tree<'a> = AlignedArchivedImmutableKdTree<'a, f64, u32, 3, 256>; - -fn main() -> Result<(), Box> -where -{ - #[cfg(feature = "tracing")] - let subscriber = fmt().with_max_level(Level::TRACE).without_time().finish(); - #[cfg(feature = "tracing")] - tracing::subscriber::set_global_default(subscriber)?; - - let query = [0.123f64, 0.456f64, 0.789f64]; - - let start = Instant::now(); - - // memmap the file into a buffer - let buf = - unsafe { MmapOptions::new().map(&File::open("./examples/immutable-test-tree.rkyv")?)? }; - - let tree: Tree = AlignedArchivedImmutableKdTree::from_bytes(&buf); - - // perform a query - let nearest_neighbour = tree.nearest_one::(&query); - - println!("Nearest item to query: {:?}", nearest_neighbour.item); - println!( - "total elapsed: {}\n\n", - ElapsedDuration::new(start.elapsed()) - ); - - Ok(()) -} diff --git a/examples/immutable-rkyv-serialize.rs b/examples/immutable-rkyv-serialize.rs deleted file mode 100644 index c4668323..00000000 --- a/examples/immutable-rkyv-serialize.rs +++ /dev/null @@ -1,85 +0,0 @@ -use elapsed::ElapsedDuration; -// use memmap::MmapOptions; -use rand::Rng; -use rand_chacha::rand_core::SeedableRng; -use std::error::Error; -use std::fs::File; -use std::io::Write; -use std::time::Instant; -#[cfg(feature = "tracing")] -use tracing::Level; -#[cfg(feature = "tracing")] -use tracing_subscriber::fmt; -use ubyte::ToByteUnit; - -use kiddo::float::distance::SquaredEuclidean; -use rkyv::ser::serializers::{AlignedSerializer, BufferScratch, CompositeSerializer}; -use rkyv::ser::Serializer; -use rkyv::{AlignedVec, Infallible}; - -use kiddo::immutable::float::kdtree::{ImmutableKdTree, ImmutableKdTreeRK}; - -const BUFFER_LEN: usize = 300_000_000; -const SCRATCH_LEN: usize = 300_000_000; - -const NUM_ITEMS: usize = 50_000_000; - -type Tree = ImmutableKdTree; - -fn main() -> Result<(), Box> { - #[cfg(feature = "tracing")] - let subscriber = fmt().with_max_level(Level::TRACE).without_time().finish(); - #[cfg(feature = "tracing")] - tracing::subscriber::set_global_default(subscriber)?; - - let query = [0.123f64, 0.456f64, 0.789f64]; - - // build and serialize a large ImmutableKdTree - let mut rng = rand_chacha::ChaCha8Rng::seed_from_u64(1); - let content_to_add: Vec<[f64; 3]> = (0..NUM_ITEMS).map(|_| rng.random::<[f64; 3]>()).collect(); - - let start = Instant::now(); - let tree: Tree = ImmutableKdTree::new_from_slice(&content_to_add); - println!( - "Populated ImmutableKdTree with {} items ({})", - tree.size(), - ElapsedDuration::new(start.elapsed()) - ); - - let nearest_neighbour = tree.nearest_one::(&query); - - println!("Nearest item to query: {:?}", nearest_neighbour.item); - - let start = Instant::now(); - - let tree_rk: ImmutableKdTreeRK = tree.into(); - - let mut serialize_buffer = AlignedVec::with_capacity(BUFFER_LEN); - let mut serialize_scratch = AlignedVec::with_capacity(SCRATCH_LEN); - unsafe { - serialize_scratch.set_len(SCRATCH_LEN); - } - serialize_buffer.clear(); - let mut serializer = CompositeSerializer::new( - AlignedSerializer::new(&mut serialize_buffer), - BufferScratch::new(&mut serialize_scratch), - Infallible, - ); - serializer - .serialize_value(&tree_rk) - .expect("Could not serialize with rkyv"); - - let buf = serializer.into_serializer().into_inner(); - let mut file = File::create("./examples/immutable-test-tree.rkyv")?; - file.write_all(buf) - .expect("Could not write serialized rkyv to file"); - - let file_size = file.metadata().unwrap().len().bytes(); - println!( - "Serialized k-d tree to rkyv file 'immutable-test-tree.rkyv' ({}). File size: {:.2}", - ElapsedDuration::new(start.elapsed()), - file_size - ); - - Ok(()) -} diff --git a/examples/immutable-rkyv_08-deserialize.rs b/examples/immutable-rkyv_08-deserialize.rs index 64c85214..93edf3c5 100644 --- a/examples/immutable-rkyv_08-deserialize.rs +++ b/examples/immutable-rkyv_08-deserialize.rs @@ -9,7 +9,7 @@ use tracing::Level; #[cfg(feature = "tracing")] use tracing_subscriber::fmt; -use rkyv_08::{access, access_unchecked, from_bytes_unchecked, rancor::Error as RkyvError}; +use rkyv::{access, access_unchecked, from_bytes_unchecked, rancor::Error as RkyvError}; use kiddo::immutable::float::kdtree::ArchivedR8ImmutableKdTree; use kiddo::immutable::float::kdtree::ImmutableKdTree; diff --git a/examples/immutable-rkyv_08-serialize.rs b/examples/immutable-rkyv_08-serialize.rs index 4006f0c4..579394b6 100644 --- a/examples/immutable-rkyv_08-serialize.rs +++ b/examples/immutable-rkyv_08-serialize.rs @@ -2,7 +2,7 @@ use elapsed::ElapsedDuration; // use memmap::MmapOptions; use rand::Rng; use rand_chacha::rand_core::SeedableRng; -use rkyv_08::{rancor::Error as RkyvError, to_bytes}; +use rkyv::{rancor::Error as RkyvError, to_bytes}; use std::error::Error; use std::fs::File; use std::io::Write; diff --git a/examples/pointcloud-csv.rs b/examples/pointcloud-csv.rs index 66b8f410..058ad7f3 100644 --- a/examples/pointcloud-csv.rs +++ b/examples/pointcloud-csv.rs @@ -5,24 +5,16 @@ /// https://cesium.com/public/learn/House.laz use elapsed::ElapsedDuration; use std::error::Error; -use std::fs::File; -use std::io::Write; use std::time::Instant; use csv::Reader; -use kiddo::immutable::float::kdtree::{ImmutableKdTree, ImmutableKdTreeRK}; +use kiddo::immutable::float::kdtree::ImmutableKdTree; use kiddo::SquaredEuclidean; -use rkyv::ser::serializers::{AlignedSerializer, BufferScratch, CompositeSerializer}; -use rkyv::ser::Serializer; -use rkyv::{AlignedVec, Infallible}; use serde::Deserialize; use tracing::Level; use tracing_subscriber::fmt; -const BUFFER_LEN: usize = 10_000_000_000; -const SCRATCH_LEN: usize = 1_000_000_000; - #[derive(Debug, Deserialize)] struct Point { x: f64, @@ -66,46 +58,5 @@ fn main() -> Result<(), Box> { let nearest_neighbour = kdtree.nearest_one::(&query); println!("Nearest item to query: {:?}", nearest_neighbour.item); - let start = Instant::now(); - - // create a file for us to serialize into - let mut file = File::create("./examples/house.rkyv")?; - - serialize_to_rkyv(&mut file, kdtree); - println!( - "Serialized k-d tree to rkyv file ({})\n\n", - ElapsedDuration::new(start.elapsed()) - ); - - println!( - "total elapsed: {}\n\n", - ElapsedDuration::new(start.elapsed()) - ); - Ok(()) } - -fn serialize_to_rkyv(file: &mut File, tree: Tree) { - let tree_rk: ImmutableKdTreeRK = tree.into(); - - let mut serialize_buffer = AlignedVec::with_capacity(BUFFER_LEN); - let mut serialize_scratch = AlignedVec::with_capacity(SCRATCH_LEN); - - unsafe { serialize_scratch.set_len(SCRATCH_LEN) }; - serialize_buffer.clear(); - - let mut serializer = CompositeSerializer::new( - AlignedSerializer::new(&mut serialize_buffer), - BufferScratch::new(&mut serialize_scratch), - Infallible, - ); - - serializer - .serialize_value(&tree_rk) - .expect("Could not serialize with rkyv"); - - let buf = serializer.into_serializer().into_inner(); - - file.write_all(buf) - .expect("Could not write serialized rkyv to file"); -} diff --git a/examples/pointcloud-las.rs b/examples/pointcloud-las.rs index 0a3027d4..0c5264b1 100644 --- a/examples/pointcloud-las.rs +++ b/examples/pointcloud-las.rs @@ -5,23 +5,15 @@ /// https://cesium.com/public/learn/House.laz use elapsed::ElapsedDuration; use std::error::Error; -use std::fs::File; -use std::io::Write; use std::time::Instant; use kiddo::SquaredEuclidean; use las::Reader; -use kiddo::immutable::float::kdtree::{ImmutableKdTree, ImmutableKdTreeRK}; -use rkyv::ser::serializers::{AlignedSerializer, BufferScratch, CompositeSerializer}; -use rkyv::ser::Serializer; -use rkyv::{AlignedVec, Infallible}; +use kiddo::immutable::float::kdtree::ImmutableKdTree; use tracing::Level; use tracing_subscriber::fmt; -const BUFFER_LEN: usize = 10_000_000_000; -const SCRATCH_LEN: usize = 1_000_000_000; - type Tree = ImmutableKdTree; fn main() -> Result<(), Box> { @@ -58,46 +50,5 @@ fn main() -> Result<(), Box> { let nearest_neighbour = kdtree.nearest_one::(&query); println!("Nearest item to query: {:?}", nearest_neighbour.item); - let start = Instant::now(); - - // create a file for us to serialize into - let mut file = File::create("./examples/house.rkyv")?; - - serialize_to_rkyv(&mut file, kdtree); - println!( - "Serialized k-d tree to rkyv file ({})\n\n", - ElapsedDuration::new(start.elapsed()) - ); - - println!( - "total elapsed: {}\n\n", - ElapsedDuration::new(start.elapsed()) - ); - Ok(()) } - -fn serialize_to_rkyv(file: &mut File, tree: Tree) { - let tree_rk: ImmutableKdTreeRK = tree.into(); - - let mut serialize_buffer = AlignedVec::with_capacity(BUFFER_LEN); - let mut serialize_scratch = AlignedVec::with_capacity(SCRATCH_LEN); - - unsafe { serialize_scratch.set_len(SCRATCH_LEN) }; - serialize_buffer.clear(); - - let mut serializer = CompositeSerializer::new( - AlignedSerializer::new(&mut serialize_buffer), - BufferScratch::new(&mut serialize_scratch), - Infallible, - ); - - serializer - .serialize_value(&tree_rk) - .expect("Could not serialize with rkyv"); - - let buf = serializer.into_serializer().into_inner(); - - file.write_all(buf) - .expect("Could not write serialized rkyv to file"); -} diff --git a/examples/rkyv-large-deserialize.rs b/examples/rkyv-large-deserialize.rs deleted file mode 100644 index 6af0ff73..00000000 --- a/examples/rkyv-large-deserialize.rs +++ /dev/null @@ -1,45 +0,0 @@ -/// Kiddo example: Rkyv large, deserialize -/// -/// Deserializes a large tree of random data using memmap and Rkyv's -/// zero-copy deserialization, and then runs a single query against -/// it. Use this to get an idea of the kind of time-to-first-query -/// you can achieve with Kiddo. -/// -/// Run the rkyv-large-serialize example before this to generate the -/// tree of random data and serialize it to a file. -use elapsed::ElapsedDuration; -use memmap::MmapOptions; -use std::error::Error; -use std::fs::File; -use std::time::Instant; - -use kiddo::{KdTree, SquaredEuclidean}; - -type Tree = KdTree; - -fn main() -> Result<(), Box> { - let query = [0.123f32, 0.456f32, 0.789f32]; - - let start = Instant::now(); - - // memmap the file into a buffer - let buf = unsafe { MmapOptions::new().map(&File::open("./examples/large-random-tree.rkyv")?)? }; - - // zero-copy deserialize - let tree = unsafe { rkyv::archived_root::(&buf) }; - println!( - "Memmap ZC Deserialized rkyv file back into a k-d tree ({})", - ElapsedDuration::new(start.elapsed()) - ); - - // perform a query - let nearest_neighbour = tree.nearest_one::(&query); - - println!("Nearest item to query: {:?}", nearest_neighbour.item); - println!( - "total elapsed: {}\n\n", - ElapsedDuration::new(start.elapsed()) - ); - - Ok(()) -} diff --git a/examples/rkyv-large-serialize.rs b/examples/rkyv-large-serialize.rs deleted file mode 100644 index 1cf30d05..00000000 --- a/examples/rkyv-large-serialize.rs +++ /dev/null @@ -1,84 +0,0 @@ -/// Kiddo example: Rkyv large, serialize -/// -/// Creates a large tree of random data and serializes it with Rkyv -/// to a file. -/// -/// Run the rkyv-large-deserialize example after this to see how -/// quickly memmapped zero-copy deserialization can read in the tree -/// from the file system and perform a query on it. -use elapsed::ElapsedDuration; -use std::error::Error; -use std::fs::File; -use std::io::Write; -use std::time::Instant; - -use kiddo::{KdTree, SquaredEuclidean}; - -use kiddo::test_utils::build_populated_tree_float; -use rkyv::ser::serializers::{AlignedSerializer, BufferScratch, CompositeSerializer}; -use rkyv::ser::Serializer; -use rkyv::{AlignedVec, Infallible}; - -const BUFFER_LEN: usize = 10_000_000_000; -const SCRATCH_LEN: usize = 1_000_000_000; - -const NUM_ITEMS: usize = 250_000_000; - -type Tree = KdTree; - -fn main() -> Result<(), Box> { - // create a tree populated with random points - let start = Instant::now(); - let kdtree: Tree = build_populated_tree_float(NUM_ITEMS, 0); - println!( - "Populated k-d tree with {} items. Took {}", - kdtree.size(), - ElapsedDuration::new(start.elapsed()) - ); - - // Test query on the newly created tree - let query = [0.123f32, 0.456f32, 0.789f32]; - let nearest_neighbour = kdtree.nearest_one::(&query); - println!("Nearest item to query: {:?}", nearest_neighbour.item); - - let start = Instant::now(); - - // create a file for us to serialize into - let mut file = File::create("./examples/large-random-tree.rkyv")?; - - serialize_to_rkyv(&mut file, kdtree); - println!( - "Serialized k-d tree to rkyv file ({})\n\n", - ElapsedDuration::new(start.elapsed()) - ); - - println!( - "total elapsed: {}\n\n", - ElapsedDuration::new(start.elapsed()) - ); - - Ok(()) -} - -fn serialize_to_rkyv(file: &mut File, tree: Tree) { - let mut serialize_buffer = AlignedVec::with_capacity(BUFFER_LEN); - let mut serialize_scratch = AlignedVec::with_capacity(SCRATCH_LEN); - - unsafe { serialize_scratch.set_len(SCRATCH_LEN) }; - serialize_buffer.clear(); - - let mut serializer = CompositeSerializer::new( - AlignedSerializer::new(&mut serialize_buffer), - BufferScratch::new(&mut serialize_scratch), - Infallible, - ); - - serializer - .serialize_value(&tree) - .expect("Could not serialize with rkyv"); - - let buf = serializer.into_serializer().into_inner(); - - file.write_all(buf) - .expect("Could not write serialized rkyv to file"); -} diff --git a/examples/rkyv.rs b/examples/rkyv.rs deleted file mode 100644 index f74bbaea..00000000 --- a/examples/rkyv.rs +++ /dev/null @@ -1,192 +0,0 @@ -/// Kiddo example 2: Rkyv -/// -/// Creates a large tree of random data and serialize it with Rkyv -/// to a file. -/// -/// Deserializes it back into a KdTree using four different approaches: -/// memmapped & ZC, ZC without memmmap, Memmapped without ZC, and niether memmapped nor ZC. -mod cities; - -use elapsed::ElapsedDuration; -use memmap::MmapOptions; -use std::error::Error; -use std::fs::File; -use std::io::{Read, Write}; -use std::time::Instant; - -use kiddo::{float::distance::SquaredEuclidean, float::kdtree::KdTree}; - -use rkyv::ser::serializers::{AlignedSerializer, BufferScratch, CompositeSerializer}; -use rkyv::ser::Serializer; -use rkyv::{AlignedVec, Deserialize, Infallible}; - -use cities::{degrees_lat_lng_to_unit_sphere, parse_csv_file}; - -const BUFFER_LEN: usize = 300_000_000; -const SCRATCH_LEN: usize = 300_000_000; - -// We need a large bucket size for this dataset as there are 11m items but -// the positional precision of the source dataset is only 4DP in degrees -// of lat / lon and so there are large numbers of points with the same value -// on some axes. All values that are the same in one axis must fit in one bucket. -const BUCKET_SIZE: usize = 1024; - -type Tree = KdTree; - -/// Each `CityCsvRecord` corresponds to 1 row in our city source data CSV. -/// -/// Serde uses this to deserialize the CSV into a convenient format for us to work with. -#[derive(Debug, serde::Deserialize)] -pub struct CityCsvRecord { - #[allow(dead_code)] - name: String, - - #[serde(rename = "latitude")] - lat: f32, - #[serde(rename = "longitude")] - lng: f32, -} - -impl CityCsvRecord { - pub fn as_xyz(&self) -> [f32; 3] { - degrees_lat_lng_to_unit_sphere(self.lat, self.lng) - } -} - -fn main() -> Result<(), Box> { - // Load in the cities data from the CSV and use it to populate a k-d tree, as per - // the cities.rs example - let start = Instant::now(); - let cities: Vec = parse_csv_file("./examples/geonames.csv")?; - println!( - "Parsed {} rows from the CSV: ({})", - cities.len(), - ElapsedDuration::new(start.elapsed()) - ); - - let start = Instant::now(); - let mut kdtree: Tree = KdTree::with_capacity(cities.len()); - cities.iter().enumerate().for_each(|(idx, city)| { - //println!("Adding #{} ({:?})", idx, &city); - kdtree.add(&city.as_xyz(), idx as u64); - }); - println!( - "Populated k-d tree with {} items ({})", - kdtree.size(), - ElapsedDuration::new(start.elapsed()) - ); - - // Test query on the newly created tree - let query = degrees_lat_lng_to_unit_sphere(52.5f32, -1.9f32); - let nearest_neighbour = kdtree.nearest_one::(&query); - let nearest_city = &cities[nearest_neighbour.item as usize]; - println!("\nNearest city to 52.5N, 1.9W: {nearest_city:?}"); - - let start = Instant::now(); - let mut file: File = File::create("./examples/geonames-tree.rkyv")?; - serialize_to_rkyv(&mut file, kdtree); - println!( - "Serialized k-d tree to rkyv file ({})\n\n", - ElapsedDuration::new(start.elapsed()) - ); - - /////// zero-copy memmapped deserialization //////////////////////////////// - let start = Instant::now(); - let mmap = unsafe { MmapOptions::new().map(&File::open("./examples/geonames-tree.rkyv")?)? }; - let mm_zc_deserialized_tree = unsafe { rkyv::archived_root::(&mmap) }; - println!( - "Memmap ZC Deserialized rkyv file back into a k-d tree ({})", - ElapsedDuration::new(start.elapsed()) - ); - - let query = degrees_lat_lng_to_unit_sphere(52.5f32, -1.9f32); - let nearest_neighbour = mm_zc_deserialized_tree.nearest_one::(&query); - let nearest_city = &cities[nearest_neighbour.item as usize]; - println!("\nNearest city to 52.5N, 1.9W: {nearest_city:?}"); - println!( - "total elapsed: {}\n\n", - ElapsedDuration::new(start.elapsed()) - ); - - /////// zero-copy non-memmapped deserialization //////////////////////////////// - let start = Instant::now(); - let mut buffer: Vec = Vec::new(); - File::open("./examples/geonames-tree.rkyv")?.read_to_end(&mut buffer)?; - let zc_deserialized_tree = unsafe { rkyv::archived_root::(&buffer) }; - println!( - "ZC Deserialized rkyv file back into a k-d tree ({})", - ElapsedDuration::new(start.elapsed()) - ); - - let query = degrees_lat_lng_to_unit_sphere(52.5f32, -1.9f32); - let nearest_neighbour = zc_deserialized_tree.nearest_one::(&query); - let nearest_city = &cities[nearest_neighbour.item as usize]; - println!("\nNearest city to 52.5N, 1.9W: {nearest_city:?}"); - println!( - "total elapsed: {}\n\n", - ElapsedDuration::new(start.elapsed()) - ); - - /////// non-zero-copy memmapped deserialization //////////////////////////////// - let start = Instant::now(); - let mmap = unsafe { MmapOptions::new().map(&File::open("./examples/geonames-tree.rkyv")?)? }; - let archived = unsafe { rkyv::archived_root::(&mmap) }; - let mm_deserialized_tree: Tree = archived.deserialize(&mut rkyv::Infallible).unwrap(); - println!( - "Memmap Deserialized rkyv file back into a k-d tree ({})", - ElapsedDuration::new(start.elapsed()) - ); - - let query = degrees_lat_lng_to_unit_sphere(52.5f32, -1.9f32); - let nearest_neighbour = mm_deserialized_tree.nearest_one::(&query); - let nearest_city = &cities[nearest_neighbour.item as usize]; - println!("\nNearest city to 52.5N, 1.9W: {nearest_city:?}"); - println!( - "total elapsed: {}\n\n", - ElapsedDuration::new(start.elapsed()) - ); - - ///////// non-zero-copy, non-memmapped deserialization /////////////////////// - let start = Instant::now(); - let mut file = File::open("./examples/geonames-tree.rkyv")?; - let mut buffer: Vec = Vec::new(); - file.read_to_end(&mut buffer)?; - let archived = unsafe { rkyv::archived_root::(&buffer) }; - let deserialized_tree: Tree = archived.deserialize(&mut rkyv::Infallible).unwrap(); - println!( - "Deserialized rkyv file back into a k-d tree ({})", - ElapsedDuration::new(start.elapsed()) - ); - - let query = degrees_lat_lng_to_unit_sphere(52.5f32, -1.9f32); - let nearest_neighbour = deserialized_tree.nearest_one::(&query); - let nearest_city = &cities[nearest_neighbour.item as usize]; - println!("\nNearest city to 52.5N, 1.9W: {nearest_city:?}"); - println!( - "total elapsed: {}\n\n", - ElapsedDuration::new(start.elapsed()) - ); - - Ok(()) -} - -fn serialize_to_rkyv(file: &mut File, tree: Tree) { - let mut serialize_buffer = AlignedVec::with_capacity(BUFFER_LEN); - let mut serialize_scratch = AlignedVec::with_capacity(SCRATCH_LEN); - unsafe { - serialize_scratch.set_len(SCRATCH_LEN); - } - serialize_buffer.clear(); - let mut serializer = CompositeSerializer::new( - AlignedSerializer::new(&mut serialize_buffer), - BufferScratch::new(&mut serialize_scratch), - Infallible, - ); - serializer - .serialize_value(&tree) - .expect("Could not serialize with rkyv"); - let buf = serializer.into_serializer().into_inner(); - let _ = file - .write(buf) - .expect("Could not write serialized rkyv to file"); -} diff --git a/src/fixed/kdtree.rs b/src/fixed/kdtree.rs index 05ed107e..b6c36e5a 100644 --- a/src/fixed/kdtree.rs +++ b/src/fixed/kdtree.rs @@ -33,37 +33,6 @@ impl Axis for T { } } -/// Rkyv-serializable equivalent of `kiddo::fixed::kdtree::Axis` -#[cfg(feature = "rkyv")] -pub trait AxisRK: num_traits::Zero + Default + Debug + rkyv::Archive {} -#[cfg(feature = "rkyv")] -impl AxisRK for T {} - -/// Rkyv-serializable fixed point k-d tree -/// -/// This is only required when using Rkyv to serialize to / deserialize from -/// a [`FixedKdTree`](crate::fixed::kdtree::KdTree). The types in the [`Fixed`](https://docs.rs/fixed/1.21.0/fixed) crate do not support [`Rkyv`](https://crates.io/crates/rkyv/0.7.39) yet. -/// As a workaround, we need to [`std::mem::transmute`] a [`crate::fixed::kdtree::KdTree`] into -/// an equivalent [`crate::fixed::kdtree::KdTreeRK`] before serializing via Rkyv, -/// and vice-versa when deserializing. -#[cfg_attr( - feature = "rkyv", - derive(rkyv::Archive, rkyv::Serialize, rkyv::Deserialize) -)] -#[cfg(feature = "rkyv")] -pub struct KdTreeRK< - A: num_traits::PrimInt, - T: Content, - const K: usize, - const B: usize, - IDX: Index, -> { - pub(crate) leaves: Vec>, - pub(crate) stems: Vec>, - pub(crate) root_index: IDX, - pub(crate) size: usize, -} - /// Fixed point k-d tree /// /// For use when the co-ordinates of the points being stored in the tree @@ -79,18 +48,6 @@ pub struct KdTree> { - pub(crate) left: IDX, - pub(crate) right: IDX, - pub(crate) split_val: A, -} - #[cfg_attr(feature = "serde", derive(Serialize, Deserialize))] #[derive(Clone, Debug, PartialEq)] pub(crate) struct StemNode { @@ -99,25 +56,6 @@ pub(crate) struct StemNode { pub(crate) split_val: A, } -#[doc(hidden)] -#[cfg_attr( - feature = "rkyv", - derive(rkyv::Archive, rkyv::Serialize, rkyv::Deserialize) -)] -#[cfg(feature = "rkyv")] -pub struct LeafNodeRK< - A: num_traits::PrimInt, - T: Content, - const K: usize, - const B: usize, - IDX: Index, -> { - // TODO: Refactor content_points to be [[A; B]; K] to see if this helps vectorisation - pub(crate) content_points: [[A; K]; B], - pub(crate) content_items: [T; B], - pub(crate) size: IDX, -} - #[cfg_attr(feature = "serde", derive(Serialize, Deserialize))] #[derive(Clone, Debug, PartialEq)] pub(crate) struct LeafNode< diff --git a/src/float/kdtree.rs b/src/float/kdtree.rs index f42697a5..969ace65 100644 --- a/src/float/kdtree.rs +++ b/src/float/kdtree.rs @@ -94,15 +94,11 @@ impl /// NB if you don't need to be able to add or remove items from the tree after construction / /// deserialization, you may get better performance from [`immutable::float::kdtree::ImmutableKdTree`](`crate::immutable::float::kdtree::ImmutableKdTree`) #[cfg_attr(feature = "serde", derive(Serialize, Deserialize))] -#[cfg_attr( - feature = "rkyv", - derive(rkyv::Archive, rkyv::Serialize, rkyv::Deserialize) -)] #[cfg_attr( feature = "rkyv_08", - derive(rkyv_08::Archive, rkyv_08::Serialize, rkyv_08::Deserialize) + derive(rkyv::Archive, rkyv::Serialize, rkyv::Deserialize) )] -#[cfg_attr(feature = "rkyv_08", rkyv(crate=rkyv_08, archived=ArchivedR8KdTree, resolver=KdTreeR8Resolver))] +#[cfg_attr(feature = "rkyv_08", rkyv(archived=ArchivedR8KdTree, resolver=KdTreeR8Resolver))] #[derive(Clone, Debug, PartialEq)] pub struct KdTree { pub(crate) leaves: Vec>, @@ -113,15 +109,11 @@ pub struct KdTree { @@ -132,15 +124,11 @@ pub struct StemNode { #[doc(hidden)] #[cfg_attr(feature = "serde", derive(Serialize, Deserialize))] -#[cfg_attr( - feature = "rkyv", - derive(rkyv::Archive, rkyv::Serialize, rkyv::Deserialize) -)] #[cfg_attr( feature = "rkyv_08", - derive(rkyv_08::Archive, rkyv_08::Serialize, rkyv_08::Deserialize) + derive(rkyv::Archive, rkyv::Serialize, rkyv::Deserialize) )] -#[cfg_attr(feature = "rkyv_08", rkyv(crate=rkyv_08, archived=ArchivedR8LeafNode, resolver=LeafNodeR8Resolver))] +#[cfg_attr(feature = "rkyv_08", rkyv(archived=ArchivedR8LeafNode, resolver=LeafNodeR8Resolver))] #[cfg_attr(feature = "rkyv_08", rkyv(attr(doc(hidden))))] #[derive(Clone, Debug, PartialEq)] pub struct LeafNode { @@ -335,27 +323,13 @@ where generate_common_methods!(KdTree); } -#[cfg(feature = "rkyv")] -impl< - A: Axis + rkyv::Archive, - T: Content + rkyv::Archive, - const K: usize, - const B: usize, - IDX: Index + rkyv::Archive, - > ArchivedKdTree -where - usize: Cast, -{ - generate_common_methods!(ArchivedKdTree); -} - #[cfg(feature = "rkyv_08")] impl< - A: Axis + rkyv_08::Archive, - T: Content + rkyv_08::Archive, + A: Axis + rkyv::Archive, + T: Content + rkyv::Archive, const K: usize, const B: usize, - IDX: Index + rkyv_08::Archive, + IDX: Index + rkyv::Archive, > ArchivedR8KdTree where usize: Cast, diff --git a/src/float/query/best_n_within.rs b/src/float/query/best_n_within.rs index 266124f5..7a1dad28 100644 --- a/src/float/query/best_n_within.rs +++ b/src/float/query/best_n_within.rs @@ -55,42 +55,19 @@ where ); } -#[cfg(feature = "rkyv")] -use crate::float::kdtree::{ArchivedKdTree, ArchivedLeafNode}; -#[cfg(feature = "rkyv")] -impl< - A: Axis + rkyv::Archive, - T: Content + rkyv::Archive, - const K: usize, - const B: usize, - IDX: Index + rkyv::Archive, - > ArchivedKdTree -where - usize: Cast, -{ - generate_float_best_n_within!( - ArchivedLeafNode, - "use std::fs::File; - use memmap::MmapOptions; - - let mmap = unsafe { MmapOptions::new().map(&File::open(\"./examples/float-doctest-tree.rkyv\").expect(\"./examples/float-doctest-tree.rkyv missing\")).unwrap() }; - let tree = unsafe { rkyv::archived_root::>(&mmap) };" - ); -} - #[cfg(feature = "rkyv_08")] use crate::float::kdtree::{ArchivedR8KdTree, ArchivedR8LeafNode}; #[cfg(feature = "rkyv_08")] impl< - A: Axis + rkyv_08::Archive, - T: Content + rkyv_08::Archive, + A: Axis + rkyv::Archive, + T: Content + rkyv::Archive, const K: usize, const B: usize, IDX: Index, > ArchivedR8KdTree where usize: Cast, - IDX: rkyv_08::Archive, + IDX: rkyv::Archive, { generate_float_best_n_within!( ArchivedR8LeafNode, @@ -99,7 +76,7 @@ where use kiddo::float::kdtree::ArchivedR8KdTree; let mmap = unsafe { MmapOptions::new().map(&File::open(\"./examples/float-doctest-tree-rkyv_08.rkyv\").expect(\"./examples/float-doctest-tree-rkyv_08.rkyv missing\")).unwrap() }; - let tree = unsafe { rkyv_08::access_unchecked::>(&mmap) };" + let tree = unsafe { rkyv::access_unchecked::>(&mmap) };" ); } diff --git a/src/float/query/nearest_n.rs b/src/float/query/nearest_n.rs index 85981aa1..73fb77c1 100644 --- a/src/float/query/nearest_n.rs +++ b/src/float/query/nearest_n.rs @@ -47,41 +47,19 @@ where ); } -#[cfg(feature = "rkyv")] -use crate::float::kdtree::ArchivedKdTree; -#[cfg(feature = "rkyv")] -impl< - A: Axis + rkyv::Archive, - T: Content + rkyv::Archive, - const K: usize, - const B: usize, - IDX: Index + rkyv::Archive, - > ArchivedKdTree -where - usize: Cast, -{ - generate_float_nearest_n!( - "use std::fs::File; - use memmap::MmapOptions; - - let mmap = unsafe { MmapOptions::new().map(&File::open(\"./examples/float-doctest-tree.rkyv\").expect(\"./examples/float-doctest-tree.rkyv missing\")).unwrap() }; - let tree = unsafe { rkyv::archived_root::>(&mmap) };" - ); -} - #[cfg(feature = "rkyv_08")] use crate::float::kdtree::ArchivedR8KdTree; #[cfg(feature = "rkyv_08")] impl< - A: Axis + rkyv_08::Archive, - T: Content + rkyv_08::Archive, + A: Axis + rkyv::Archive, + T: Content + rkyv::Archive, const K: usize, const B: usize, IDX: Index, > ArchivedR8KdTree where usize: Cast, - IDX: rkyv_08::Archive, + IDX: rkyv::Archive, { generate_float_nearest_n!( "use std::fs::File; @@ -89,7 +67,7 @@ where use kiddo::float::kdtree::ArchivedR8KdTree; let mmap = unsafe { MmapOptions::new().map(&File::open(\"./examples/float-doctest-tree-rkyv_08.rkyv\").expect(\"./examples/float-doctest-tree-rkyv_08.rkyv missing\")).unwrap() }; - let tree = unsafe { rkyv_08::access_unchecked::>(&mmap) };" + let tree = unsafe { rkyv::access_unchecked::>(&mmap) };" ); } diff --git a/src/float/query/nearest_n_within.rs b/src/float/query/nearest_n_within.rs index c0d22ea2..fafaa529 100644 --- a/src/float/query/nearest_n_within.rs +++ b/src/float/query/nearest_n_within.rs @@ -53,41 +53,19 @@ tree.add(&[2.0, 3.0, 6.0], 101);" ); } -#[cfg(feature = "rkyv")] -use crate::float::kdtree::ArchivedKdTree; -#[cfg(feature = "rkyv")] -impl< - A: Axis + rkyv::Archive, - T: Content + rkyv::Archive, - const K: usize, - const B: usize, - IDX: Index + rkyv::Archive, - > ArchivedKdTree -where - usize: Cast, -{ - generate_float_nearest_n_within!( - "use std::fs::File; -use memmap::MmapOptions; - -let mmap = unsafe { MmapOptions::new().map(&File::open(\"./examples/float-doctest-tree.rkyv\").expect(\"./examples/float-doctest-tree.rkyv missing\")).unwrap() }; -let tree = unsafe { rkyv::archived_root::>(&mmap) };" - ); -} - #[cfg(feature = "rkyv_08")] use crate::float::kdtree::ArchivedR8KdTree; #[cfg(feature = "rkyv_08")] impl< - A: Axis + rkyv_08::Archive, - T: Content + rkyv_08::Archive, + A: Axis + rkyv::Archive, + T: Content + rkyv::Archive, const K: usize, const B: usize, IDX: Index, > ArchivedR8KdTree where usize: Cast, - IDX: rkyv_08::Archive, + IDX: rkyv::Archive, { generate_float_nearest_n_within!( "use std::fs::File; @@ -95,7 +73,7 @@ where use kiddo::float::kdtree::ArchivedR8KdTree; let mmap = unsafe { MmapOptions::new().map(&File::open(\"./examples/float-doctest-tree-rkyv_08.rkyv\").expect(\"./examples/float-doctest-tree-rkyv_08.rkyv missing\")).unwrap() }; - let tree = unsafe { rkyv_08::access_unchecked::>(&mmap) };" + let tree = unsafe { rkyv::access_unchecked::>(&mmap) };" ); } diff --git a/src/float/query/nearest_one.rs b/src/float/query/nearest_one.rs index 3879bcf8..2ffc6376 100644 --- a/src/float/query/nearest_one.rs +++ b/src/float/query/nearest_one.rs @@ -60,42 +60,19 @@ where ); } -#[cfg(feature = "rkyv")] -use crate::float::kdtree::{ArchivedKdTree, ArchivedLeafNode}; -#[cfg(feature = "rkyv")] -impl< - A: Axis + rkyv::Archive, - T: Content + rkyv::Archive, - const K: usize, - const B: usize, - IDX: Index + rkyv::Archive, - > ArchivedKdTree -where - usize: Cast, -{ - generate_float_nearest_one!( - ArchivedLeafNode, - "use std::fs::File; - use memmap::MmapOptions; - - let mmap = unsafe { MmapOptions::new().map(&File::open(\"./examples/float-doctest-tree.rkyv\").expect(\"./examples/float-doctest-tree.rkyv missing\")).unwrap() }; - let tree = unsafe { rkyv::archived_root::>(&mmap) };" - ); -} - #[cfg(feature = "rkyv_08")] use crate::float::kdtree::{ArchivedR8KdTree, ArchivedR8LeafNode}; #[cfg(feature = "rkyv_08")] impl< - A: Axis + rkyv_08::Archive, - T: Content + rkyv_08::Archive, + A: Axis + rkyv::Archive, + T: Content + rkyv::Archive, const K: usize, const B: usize, IDX: Index, > ArchivedR8KdTree where usize: Cast, - IDX: rkyv_08::Archive, + IDX: rkyv::Archive, { generate_float_nearest_one!( ArchivedR8LeafNode, @@ -104,7 +81,7 @@ where use kiddo::float::kdtree::ArchivedR8KdTree; let mmap = unsafe { MmapOptions::new().map(&File::open(\"./examples/float-doctest-tree-rkyv_08.rkyv\").expect(\"./examples/float-doctest-tree-rkyv_08.rkyv missing\")).unwrap() }; - let tree = unsafe { rkyv_08::access_unchecked::>(&mmap) };" + let tree = unsafe { rkyv::access_unchecked::>(&mmap) };" ); } diff --git a/src/float/query/within.rs b/src/float/query/within.rs index a895c5ab..ab178e17 100644 --- a/src/float/query/within.rs +++ b/src/float/query/within.rs @@ -45,41 +45,19 @@ tree.add(&[2.0, 3.0, 6.0], 101);" ); } -#[cfg(feature = "rkyv")] -use crate::float::kdtree::ArchivedKdTree; -#[cfg(feature = "rkyv")] -impl< - A: Axis + rkyv::Archive, - T: Content + rkyv::Archive, - const K: usize, - const B: usize, - IDX: Index + rkyv::Archive, - > ArchivedKdTree -where - usize: Cast, -{ - generate_float_within!( - "use std::fs::File; -use memmap::MmapOptions; - -let mmap = unsafe { MmapOptions::new().map(&File::open(\"./examples/float-doctest-tree.rkyv\").expect(\"./examples/float-doctest-tree.rkyv missing\")).unwrap() }; -let tree = unsafe { rkyv::archived_root::>(&mmap) };" - ); -} - #[cfg(feature = "rkyv_08")] use crate::float::kdtree::ArchivedR8KdTree; #[cfg(feature = "rkyv_08")] impl< - A: Axis + rkyv_08::Archive, - T: Content + rkyv_08::Archive, + A: Axis + rkyv::Archive, + T: Content + rkyv::Archive, const K: usize, const B: usize, IDX: Index, > ArchivedR8KdTree where usize: Cast, - IDX: rkyv_08::Archive, + IDX: rkyv::Archive, { generate_float_within!( "use std::fs::File; @@ -87,7 +65,7 @@ where use kiddo::float::kdtree::ArchivedR8KdTree; let mmap = unsafe { MmapOptions::new().map(&File::open(\"./examples/float-doctest-tree-rkyv_08.rkyv\").expect(\"./examples/float-doctest-tree-rkyv_08.rkyv missing\")).unwrap() }; - let tree = unsafe { rkyv_08::access_unchecked::>(&mmap) };" + let tree = unsafe { rkyv::access_unchecked::>(&mmap) };" ); } diff --git a/src/float/query/within_unsorted.rs b/src/float/query/within_unsorted.rs index 5d2d776a..c5f1d4e7 100644 --- a/src/float/query/within_unsorted.rs +++ b/src/float/query/within_unsorted.rs @@ -47,41 +47,19 @@ tree.add(&[2.0, 3.0, 6.0], 101);" ); } -#[cfg(feature = "rkyv")] -use crate::float::kdtree::ArchivedKdTree; -#[cfg(feature = "rkyv")] -impl< - A: Axis + rkyv::Archive, - T: Content + rkyv::Archive, - const K: usize, - const B: usize, - IDX: Index + rkyv::Archive, - > ArchivedKdTree -where - usize: Cast, -{ - generate_float_within_unsorted!( - "use std::fs::File; -use memmap::MmapOptions; - -let mmap = unsafe { MmapOptions::new().map(&File::open(\"./examples/float-doctest-tree.rkyv\").expect(\"./examples/float-doctest-tree.rkyv missing\")).unwrap() }; -let tree = unsafe { rkyv::archived_root::>(&mmap) };" - ); -} - #[cfg(feature = "rkyv_08")] use crate::float::kdtree::ArchivedR8KdTree; #[cfg(feature = "rkyv_08")] impl< - A: Axis + rkyv_08::Archive, - T: Content + rkyv_08::Archive, + A: Axis + rkyv::Archive, + T: Content + rkyv::Archive, const K: usize, const B: usize, IDX: Index, > ArchivedR8KdTree where usize: Cast, - IDX: rkyv_08::Archive, + IDX: rkyv::Archive, { generate_float_within_unsorted!( "use std::fs::File; @@ -89,7 +67,7 @@ where use kiddo::float::kdtree::ArchivedR8KdTree; let mmap = unsafe { MmapOptions::new().map(&File::open(\"./examples/float-doctest-tree-rkyv_08.rkyv\").expect(\"./examples/float-doctest-tree-rkyv_08.rkyv missing\")).unwrap() }; - let tree = unsafe { rkyv_08::access_unchecked::>(&mmap) };" + let tree = unsafe { rkyv::access_unchecked::>(&mmap) };" ); } diff --git a/src/float/query/within_unsorted_iter.rs b/src/float/query/within_unsorted_iter.rs index 29ee1508..967c2b40 100644 --- a/src/float/query/within_unsorted_iter.rs +++ b/src/float/query/within_unsorted_iter.rs @@ -56,48 +56,24 @@ tree.add(&[2.0, 3.0, 6.0], 101);" ); } -#[cfg(feature = "rkyv")] -use crate::float::kdtree::ArchivedKdTree; -#[cfg(feature = "rkyv")] -impl< - 'a, - 'query, - A: Axis + rkyv::Archive, - T: Content + rkyv::Archive, - const K: usize, - const B: usize, - IDX: Index + rkyv::Archive + Send, - > ArchivedKdTree -where - usize: Cast, -{ - generate_float_within_unsorted_iter!( - "use std::fs::File; -use memmap::MmapOptions; - -let mmap = unsafe { MmapOptions::new().map(&File::open(\"./examples/float-doctest-tree.rkyv\").expect(\"./examples/float-doctest-tree.rkyv missing\")).unwrap() }; -let tree = unsafe { rkyv::archived_root::>(&mmap) };" - ); -} - #[cfg(feature = "rkyv_08")] use crate::float::kdtree::ArchivedR8KdTree; #[cfg(feature = "rkyv_08")] impl< 'a, 'query, - A: Axis + Send + rkyv_08::Archive, - T: Content + Send + rkyv_08::Archive, + A: Axis + Send + rkyv::Archive, + T: Content + Send + rkyv::Archive, const K: usize, const B: usize, IDX: Index + Send, > ArchivedR8KdTree where usize: Cast, - IDX: rkyv_08::Archive, - ::Archived: Sync, - ::Archived: Sync, - ::Archived: Sync, + IDX: rkyv::Archive, + ::Archived: Sync, + ::Archived: Sync, + ::Archived: Sync, { generate_float_within_unsorted_iter!( "use std::fs::File; @@ -105,7 +81,7 @@ where use kiddo::float::kdtree::ArchivedR8KdTree; let mmap = unsafe { MmapOptions::new().map(&File::open(\"./examples/float-doctest-tree-rkyv_08.rkyv\").expect(\"./examples/float-doctest-tree-rkyv_08.rkyv missing\")).unwrap() }; - let tree = unsafe { rkyv_08::access_unchecked::>(&mmap) };" + let tree = unsafe { rkyv::access_unchecked::>(&mmap) };" ); } diff --git a/src/hybrid/kdtree.rs b/src/hybrid/kdtree.rs index 80653695..0bb8640f 100644 --- a/src/hybrid/kdtree.rs +++ b/src/hybrid/kdtree.rs @@ -88,10 +88,6 @@ impl Axis for T {} /// For use when the co-ordinates of the points being stored in the tree /// are floats. f64 or f32 are supported currently #[cfg_attr(feature = "serde", derive(Serialize, Deserialize))] -#[cfg_attr( - feature = "rkyv", - derive(rkyv::Archive, rkyv::Serialize, rkyv::Deserialize) -)] #[derive(Clone, Debug, PartialEq)] pub struct KdTree { pub(crate) leaves: Vec>, @@ -105,10 +101,6 @@ pub struct KdTree { // pub(crate) left: IDX, @@ -119,10 +111,6 @@ pub struct StemNode { #[doc(hidden)] #[cfg_attr(feature = "serde", derive(Serialize, Deserialize))] -#[cfg_attr( - feature = "rkyv", - derive(rkyv::Archive, rkyv::Serialize, rkyv::Deserialize) -)] #[derive(Clone, Debug, PartialEq)] pub struct LeafNode { #[cfg_attr(feature = "serde", serde(with = "array_of_arrays"))] diff --git a/src/immutable/float/kdtree.rs b/src/immutable/float/kdtree.rs index 3f468e7a..3bb3b296 100644 --- a/src/immutable/float/kdtree.rs +++ b/src/immutable/float/kdtree.rs @@ -57,8 +57,6 @@ use array_init::array_init; use az::{Az, Cast}; use cmov::Cmov; use ordered_float::OrderedFloat; -#[cfg(feature = "rkyv")] -use rkyv::vec::ArchivedVec; #[cfg(feature = "serde")] use serde::{Deserialize, Serialize}; #[cfg(feature = "rkyv_08")] @@ -85,9 +83,9 @@ use std::{cmp::PartialEq, fmt::Debug}; #[cfg_attr(feature = "serde", derive(Serialize, Deserialize))] #[cfg_attr( feature = "rkyv_08", - derive(rkyv_08::Archive, rkyv_08::Serialize, rkyv_08::Deserialize) + derive(rkyv::Archive, rkyv::Serialize, rkyv::Deserialize) )] -#[cfg_attr(feature = "rkyv_08", rkyv(crate=rkyv_08, archived=ArchivedR8ImmutableKdTree, resolver=ImmutableKdTreeR8Resolver))] +#[cfg_attr(feature = "rkyv_08", rkyv(archived=ArchivedR8ImmutableKdTree, resolver=ImmutableKdTreeR8Resolver))] #[derive(Clone, Debug, PartialEq)] pub struct ImmutableKdTree { #[cfg_attr(feature = "rkyv_08", rkyv(with = EncodeAVec))] @@ -107,158 +105,10 @@ pub struct ImmutableKdTree { - pub(crate) stems: Vec, - pub(crate) leaf_points: [Vec; K], - pub(crate) leaf_items: Vec, - pub(crate) leaf_extents: Vec<(u32, u32)>, - pub(crate) max_stem_level: i32, -} - -#[cfg(feature = "rkyv")] -impl From> - for ImmutableKdTreeRK -where - A: Axis + LeafSliceFloat + LeafSliceFloatChunk, - T: Content, - usize: Cast, -{ - /// 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 - /// - /// ```rust - /// use kiddo::immutable::float::kdtree::ImmutableKdTree; - /// - /// let points: Vec<[f64; 3]> = vec!([1.0f64, 2.0f64, 3.0f64]); - /// let tree: ImmutableKdTree = (&*points).into(); - /// - /// assert_eq!(tree.size(), 1); - /// ``` - fn from(orig: ImmutableKdTree) -> Self { - let ImmutableKdTree { - stems, - leaf_points, - leaf_items, - leaf_extents, - max_stem_level, - } = orig; - - let (ptr, _, length, capacity) = stems.into_raw_parts(); - let stems = unsafe { Vec::from_raw_parts(ptr, length, capacity) }; - - ImmutableKdTreeRK { - stems, - leaf_points, - leaf_items, - leaf_extents, - max_stem_level, - } - } -} - -/// rkyv zero-copy deserializable version of an `ImmutableKdTree`. -/// -/// Convert an `ImmutableKdTreeRK` into this in order to perform queries. -/// Required because the AlignedVec used for storing stem node values cannot -/// be zero-copy deserialized. You need to first zero-copy-deserialize into an -/// `ImmutableKdTreeRK` and then convert that into one of these, re-aligning the stems. -#[cfg(feature = "rkyv")] -#[derive(Debug, PartialEq)] -pub struct AlignedArchivedImmutableKdTree< - 'a, - A: Copy + Default, - T: Copy + Default, - const K: usize, - const B: usize, -> { - pub(crate) stems: AVec>, - pub(crate) leaf_points: &'a [ArchivedVec; K], - pub(crate) leaf_items: &'a ArchivedVec, - pub(crate) leaf_extents: &'a ArchivedVec<(u32, u32)>, - pub(crate) max_stem_level: i32, -} - -#[cfg(feature = "rkyv")] -impl< - 'a, - A: Copy + Default + rkyv::Archive, - T: Copy + Default + rkyv::Archive, - const K: usize, - const B: usize, - > AlignedArchivedImmutableKdTree<'a, A, T, K, B> -{ - pub(crate) fn new_from( - value: &'a ArchivedImmutableKdTreeRK, - ) -> AlignedArchivedImmutableKdTree<'a, A, T, K, B> { - AlignedArchivedImmutableKdTree { - stems: AVec::from_slice(CACHELINE_ALIGN, &value.stems[..]), - leaf_points: &value.leaf_points, - leaf_extents: &value.leaf_extents, - leaf_items: &value.leaf_items, - max_stem_level: value.max_stem_level, - } - } - - /// create an `AlignedArchivedImmutableKdTree` from `Bytes` - /// - /// Intended to be used on raw / mem-mapped bytes from a `File` containing data serialized from an - /// `ArchivedImmutableKdTreeRK` - #[cfg(feature = "rkyv")] - pub fn from_bytes(bytes: &'a [u8]) -> AlignedArchivedImmutableKdTree<'a, A, T, K, B> { - let tree_rk = unsafe { rkyv::archived_root::>(bytes) }; - - AlignedArchivedImmutableKdTree::new_from(tree_rk) - } -} - -#[cfg(feature = "rkyv")] -impl AlignedArchivedImmutableKdTree<'_, A, T, K, B> -where - A: Axis + LeafSliceFloat + LeafSliceFloatChunk + rkyv::Archive, - T: Content + rkyv::Archive, - usize: Cast, -{ - /// Returns the current number of elements stored in the tree - #[inline] - pub fn size(&self) -> usize { - self.leaf_items.len() - } - - /// Returns a LeafSlice for a given leaf index - #[inline] - pub(crate) fn get_leaf_slice(&self, leaf_idx: usize) -> LeafSlice<'_, A, T, K> { - let (start, end) = unsafe { *self.leaf_extents.get_unchecked(leaf_idx) }; - - // Artificially extend size to be at least chunk length for faster processing - // TODO: why does this slow things down? - // let end = end.max(start + 32).min(self.leaf_items.len() as u32); - - LeafSlice::new( - array_init::array_init(|i| &self.leaf_points[i][start as usize..end as usize]), - &self.leaf_items[start as usize..end as usize], - ) - } -} - #[cfg(feature = "rkyv_08")] impl< - A: Copy + Default + rkyv_08::Archive, - T: Copy + Default + rkyv_08::Archive, + A: Copy + Default + rkyv::Archive, + T: Copy + Default + rkyv::Archive, const K: usize, const B: usize, > Debug for ArchivedR8ImmutableKdTree @@ -280,8 +130,8 @@ impl< #[cfg(feature = "rkyv_08")] impl ArchivedR8ImmutableKdTree where - A: Axis + LeafSliceFloat + LeafSliceFloatChunk + rkyv_08::Archive, - T: Content + rkyv_08::Archive, + A: Axis + LeafSliceFloat + LeafSliceFloatChunk + rkyv::Archive, + T: Content + rkyv::Archive, usize: Cast, { /// Returns the current number of elements stored in the tree @@ -348,10 +198,6 @@ where } } -// prevent clippy complaining that the feature unreliable_select_nth_unstable -// is not defined (I don't want to explicitly define it as if I do then -// passing --all-features in CI will enable it, which I don't want to do -#[allow(unexpected_cfgs)] impl ImmutableKdTree where A: Axis + LeafSliceFloat + LeafSliceFloatChunk, @@ -584,7 +430,6 @@ where ); } - #[cfg(not(feature = "unreliable_select_nth_unstable"))] #[inline] fn update_pivot( source: &[[A; K]], diff --git a/src/immutable/float/query/approx_nearest_one.rs b/src/immutable/float/query/approx_nearest_one.rs index 5af8ffe1..ed9b1ea0 100644 --- a/src/immutable/float/query/approx_nearest_one.rs +++ b/src/immutable/float/query/approx_nearest_one.rs @@ -47,27 +47,6 @@ impl ImmutableKdTree, - T: Content + rkyv::Archive, - const K: usize, - const B: usize, - > AlignedArchivedImmutableKdTree<'_, A, T, K, B> -{ - generate_immutable_approx_float_nearest_one!( - "use std::fs::File; - use memmap::MmapOptions; - - use kiddo::immutable::float::kdtree::AlignedArchivedImmutableKdTree; - - let mmap = unsafe { MmapOptions::new().map(&File::open(\"./examples/immutable-doctest-tree.rkyv\").expect(\"./examples/immutable-doctest-tree.rkyv missing\")).unwrap() }; - let tree: AlignedArchivedImmutableKdTree = AlignedArchivedImmutableKdTree::from_bytes(&mmap);" - ); -} - #[cfg(feature = "rkyv_08")] impl crate::immutable::float::kdtree::ArchivedR8ImmutableKdTree @@ -78,14 +57,14 @@ where + Axis + LeafSliceFloat + LeafSliceFloatChunk - + rkyv_08::Archive, - T: Copy + Default + Content + rkyv_08::Archive, + + rkyv::Archive, + T: Copy + Default + Content + rkyv::Archive, usize: Cast, { generate_immutable_approx_float_nearest_one!( "use std::fs::File; use memmap::MmapOptions; - use rkyv_08::{access_unchecked, Archived}; + use rkyv::{access_unchecked, Archived}; use kiddo::immutable::float::kdtree::ArchivedR8ImmutableKdTree; let mmap = unsafe { MmapOptions::new().map(&File::open(\"./examples/immutable-doctest-tree_rkyv08.rkyv\").expect(\"./examples/immutable-doctest-tree_rkyv08.rkyv missing\")).unwrap() }; diff --git a/src/immutable/float/query/best_n_within.rs b/src/immutable/float/query/best_n_within.rs index d951d08d..d0e7a36c 100644 --- a/src/immutable/float/query/best_n_within.rs +++ b/src/immutable/float/query/best_n_within.rs @@ -59,26 +59,6 @@ where ); } -#[cfg(feature = "rkyv")] -use crate::immutable::float::kdtree::AlignedArchivedImmutableKdTree; -#[cfg(feature = "rkyv")] -impl AlignedArchivedImmutableKdTree<'_, A, T, K, B> -where - A: Axis + LeafSliceFloat + LeafSliceFloatChunk + rkyv::Archive, - T: Content + rkyv::Archive, - usize: Cast, -{ - generate_immutable_float_best_n_within!( - "use std::fs::File; - use memmap::MmapOptions; - - use kiddo::immutable::float::kdtree::AlignedArchivedImmutableKdTree; - - let mmap = unsafe { MmapOptions::new().map(&File::open(\"./examples/immutable-doctest-tree.rkyv\").expect(\"./examples/immutable-doctest-tree.rkyv missing\")).unwrap() }; - let tree: AlignedArchivedImmutableKdTree = AlignedArchivedImmutableKdTree::from_bytes(&mmap);" - ); -} - #[cfg(feature = "rkyv_08")] impl crate::immutable::float::kdtree::ArchivedR8ImmutableKdTree @@ -89,8 +69,8 @@ where + Axis + LeafSliceFloat + LeafSliceFloatChunk - + rkyv_08::Archive, - T: Copy + Default + Content + rkyv_08::Archive, + + rkyv::Archive, + T: Copy + Default + Content + rkyv::Archive, usize: Cast, { generate_immutable_float_best_n_within!( @@ -99,7 +79,7 @@ where use kiddo::immutable::float::kdtree::ArchivedR8ImmutableKdTree; let mmap = unsafe { MmapOptions::new().map(&File::open(\"./examples/immutable-doctest-tree_rkyv08.rkyv\").expect(\"./examples/immutable-doctest-tree_rkyv08.rkyv missing\")).unwrap() }; - let tree = unsafe { rkyv_08::access_unchecked::>(&mmap) };" + let tree = unsafe { rkyv::access_unchecked::>(&mmap) };" ); } diff --git a/src/immutable/float/query/nearest_n.rs b/src/immutable/float/query/nearest_n.rs index 9c34868b..29764257 100644 --- a/src/immutable/float/query/nearest_n.rs +++ b/src/immutable/float/query/nearest_n.rs @@ -51,27 +51,6 @@ where ); } -#[cfg(feature = "rkyv")] -use crate::immutable::float::kdtree::AlignedArchivedImmutableKdTree; -#[cfg(feature = "rkyv")] -impl< - A: Axis + rkyv::Archive, - T: Content + rkyv::Archive, - const K: usize, - const B: usize, - > AlignedArchivedImmutableKdTree<'_, A, T, K, B> -{ - generate_immutable_float_nearest_n!( - "use std::fs::File; - use memmap::MmapOptions; - - use kiddo::immutable::float::kdtree::AlignedArchivedImmutableKdTree; - - let mmap = unsafe { MmapOptions::new().map(&File::open(\"./examples/immutable-doctest-tree.rkyv\").expect(\"./examples/immutable-doctest-tree.rkyv missing\")).unwrap() }; - let tree: AlignedArchivedImmutableKdTree = AlignedArchivedImmutableKdTree::from_bytes(&mmap);" - ); -} - #[cfg(feature = "rkyv_08")] impl crate::immutable::float::kdtree::ArchivedR8ImmutableKdTree @@ -82,14 +61,14 @@ where + Axis + LeafSliceFloat + LeafSliceFloatChunk - + rkyv_08::Archive, - T: Copy + Default + Content + rkyv_08::Archive, + + rkyv::Archive, + T: Copy + Default + Content + rkyv::Archive, usize: Cast, { generate_immutable_float_nearest_n!( "use std::fs::File; use memmap::MmapOptions; - use rkyv_08::{access_unchecked, Archived}; + use rkyv::{access_unchecked, Archived}; use kiddo::immutable::float::kdtree::ArchivedR8ImmutableKdTree; let mmap = unsafe { MmapOptions::new().map(&File::open(\"./examples/immutable-doctest-tree_rkyv08.rkyv\").expect(\"./examples/immutable-doctest-tree_rkyv08.rkyv missing\")).unwrap() }; diff --git a/src/immutable/float/query/nearest_n_within.rs b/src/immutable/float/query/nearest_n_within.rs index 7b3cfece..de3696af 100644 --- a/src/immutable/float/query/nearest_n_within.rs +++ b/src/immutable/float/query/nearest_n_within.rs @@ -56,31 +56,6 @@ where ); } -#[cfg(feature = "rkyv")] -use crate::immutable::float::kdtree::AlignedArchivedImmutableKdTree; -#[cfg(feature = "rkyv")] -impl< - A: Axis + rkyv::Archive, - T: Content + rkyv::Archive, - const K: usize, - const B: usize, - > AlignedArchivedImmutableKdTree<'_, A, T, K, B> -where - A: Axis + LeafSliceFloat + LeafSliceFloatChunk, - T: Content, - usize: Cast, -{ - generate_immutable_float_nearest_n_within!( - "use std::fs::File; - use memmap::MmapOptions; - - use kiddo::immutable::float::kdtree::AlignedArchivedImmutableKdTree; - - let mmap = unsafe { MmapOptions::new().map(&File::open(\"./examples/immutable-doctest-tree.rkyv\").expect(\"./examples/immutable-doctest-tree.rkyv missing\")).unwrap() }; - let tree: AlignedArchivedImmutableKdTree = AlignedArchivedImmutableKdTree::from_bytes(&mmap);" - ); -} - #[cfg(feature = "rkyv_08")] impl crate::immutable::float::kdtree::ArchivedR8ImmutableKdTree @@ -91,8 +66,8 @@ where + Axis + LeafSliceFloat + LeafSliceFloatChunk - + rkyv_08::Archive, - T: Copy + Default + Content + rkyv_08::Archive, + + rkyv::Archive, + T: Copy + Default + Content + rkyv::Archive, usize: Cast, { generate_immutable_float_nearest_n_within!( @@ -102,7 +77,7 @@ where use kiddo::immutable::float::kdtree::ArchivedR8ImmutableKdTree; let mmap = unsafe { MmapOptions::new().map(&File::open(\"./examples/immutable-doctest-tree_rkyv08.rkyv\").expect(\"./examples/immutable-doctest-tree_rkyv08.rkyv missing\")).unwrap() }; - let tree = unsafe { rkyv_08::access_unchecked::>(&mmap) };" + let tree = unsafe { rkyv::access_unchecked::>(&mmap) };" ); } diff --git a/src/immutable/float/query/nearest_one.rs b/src/immutable/float/query/nearest_one.rs index 6e16eb01..fd186e0f 100644 --- a/src/immutable/float/query/nearest_one.rs +++ b/src/immutable/float/query/nearest_one.rs @@ -51,26 +51,6 @@ where ); } -#[cfg(feature = "rkyv")] -use crate::immutable::float::kdtree::AlignedArchivedImmutableKdTree; -#[cfg(feature = "rkyv")] -impl AlignedArchivedImmutableKdTree<'_, A, T, K, B> -where - A: Axis + LeafSliceFloat + LeafSliceFloatChunk + rkyv::Archive, - T: Content + rkyv::Archive, - usize: Cast, -{ - generate_immutable_float_nearest_one!( - "use std::fs::File; - use memmap::MmapOptions; - - use kiddo::immutable::float::kdtree::AlignedArchivedImmutableKdTree; - - let mmap = unsafe { MmapOptions::new().map(&File::open(\"./examples/immutable-doctest-tree.rkyv\").expect(\"./examples/immutable-doctest-tree.rkyv missing\")).unwrap() }; - let tree: AlignedArchivedImmutableKdTree = AlignedArchivedImmutableKdTree::from_bytes(&mmap);" - ); -} - #[cfg(feature = "rkyv_08")] impl crate::immutable::float::kdtree::ArchivedR8ImmutableKdTree @@ -81,14 +61,14 @@ where + Axis + LeafSliceFloat + LeafSliceFloatChunk - + rkyv_08::Archive, - T: Copy + Default + Content + rkyv_08::Archive, + + rkyv::Archive, + T: Copy + Default + Content + rkyv::Archive, usize: Cast, { generate_immutable_float_nearest_one!( "use std::fs::File; use memmap::MmapOptions; - use rkyv_08::{access_unchecked, Archived}; + use rkyv::{access_unchecked, Archived}; use kiddo::immutable::float::kdtree::ArchivedR8ImmutableKdTree; let mmap = unsafe { MmapOptions::new().map(&File::open(\"./examples/immutable-doctest-tree_rkyv08.rkyv\").expect(\"./examples/immutable-doctest-tree_rkyv08.rkyv missing\")).unwrap() }; diff --git a/src/immutable/float/query/within.rs b/src/immutable/float/query/within.rs index a04c9f7a..fa791ff6 100644 --- a/src/immutable/float/query/within.rs +++ b/src/immutable/float/query/within.rs @@ -48,27 +48,6 @@ where ); } -#[cfg(feature = "rkyv")] -use crate::immutable::float::kdtree::AlignedArchivedImmutableKdTree; -#[cfg(feature = "rkyv")] -impl< - A: Axis + rkyv::Archive, - T: Content + rkyv::Archive, - const K: usize, - const B: usize, - > AlignedArchivedImmutableKdTree<'_, A, T, K, B> -{ - generate_immutable_float_within!( - "use std::fs::File; - use memmap::MmapOptions; - - use kiddo::immutable::float::kdtree::AlignedArchivedImmutableKdTree; - - let mmap = unsafe { MmapOptions::new().map(&File::open(\"./examples/immutable-doctest-tree.rkyv\").expect(\"./examples/immutable-doctest-tree.rkyv missing\")).unwrap() }; - let tree: AlignedArchivedImmutableKdTree = AlignedArchivedImmutableKdTree::from_bytes(&mmap);" - ); -} - #[cfg(feature = "rkyv_08")] impl crate::immutable::float::kdtree::ArchivedR8ImmutableKdTree @@ -79,8 +58,8 @@ where + Axis + LeafSliceFloat + LeafSliceFloatChunk - + rkyv_08::Archive, - T: Copy + Default + Content + rkyv_08::Archive, + + rkyv::Archive, + T: Copy + Default + Content + rkyv::Archive, usize: Cast, { generate_immutable_float_within!( @@ -90,7 +69,7 @@ where use kiddo::immutable::float::kdtree::ArchivedR8ImmutableKdTree; let mmap = unsafe { MmapOptions::new().map(&File::open(\"./examples/immutable-doctest-tree_rkyv08.rkyv\").expect(\"./examples/immutable-doctest-tree_rkyv08.rkyv missing\")).unwrap() }; - let tree = unsafe { rkyv_08::access_unchecked::>(&mmap) };" + let tree = unsafe { rkyv::access_unchecked::>(&mmap) };" ); } diff --git a/src/immutable/float/query/within_unsorted.rs b/src/immutable/float/query/within_unsorted.rs index 28310c5a..f62a4163 100644 --- a/src/immutable/float/query/within_unsorted.rs +++ b/src/immutable/float/query/within_unsorted.rs @@ -48,27 +48,6 @@ where ); } -#[cfg(feature = "rkyv")] -use crate::immutable::float::kdtree::AlignedArchivedImmutableKdTree; -#[cfg(feature = "rkyv")] -impl< - A: Axis + rkyv::Archive, - T: Content + rkyv::Archive, - const K: usize, - const B: usize, - > AlignedArchivedImmutableKdTree<'_, A, T, K, B> -{ - generate_immutable_float_within_unsorted!( - "use std::fs::File; - use memmap::MmapOptions; - - use kiddo::immutable::float::kdtree::AlignedArchivedImmutableKdTree; - - let mmap = unsafe { MmapOptions::new().map(&File::open(\"./examples/immutable-doctest-tree.rkyv\").expect(\"./examples/immutable-doctest-tree.rkyv missing\")).unwrap() }; - let tree: AlignedArchivedImmutableKdTree = AlignedArchivedImmutableKdTree::from_bytes(&mmap);" - ); -} - #[cfg(feature = "rkyv_08")] impl crate::immutable::float::kdtree::ArchivedR8ImmutableKdTree @@ -79,14 +58,14 @@ where + Axis + LeafSliceFloat + LeafSliceFloatChunk - + rkyv_08::Archive, - T: Copy + Default + Content + rkyv_08::Archive, + + rkyv::Archive, + T: Copy + Default + Content + rkyv::Archive, usize: Cast, { generate_immutable_float_within_unsorted!( "use std::fs::File; use memmap::MmapOptions; - use rkyv_08::{access_unchecked, Archived}; + use rkyv::{access_unchecked, Archived}; use kiddo::immutable::float::kdtree::ArchivedR8ImmutableKdTree; let mmap = unsafe { MmapOptions::new().map(&File::open(\"./examples/immutable-doctest-tree_rkyv08.rkyv\").expect(\"./examples/immutable-doctest-tree_rkyv08.rkyv missing\")).unwrap() }; diff --git a/src/immutable/float/query/within_unsorted_iter.rs b/src/immutable/float/query/within_unsorted_iter.rs index 3f3cceba..96f3443c 100644 --- a/src/immutable/float/query/within_unsorted_iter.rs +++ b/src/immutable/float/query/within_unsorted_iter.rs @@ -54,34 +54,12 @@ where ); } -#[cfg(feature = "rkyv")] -use crate::immutable::float::kdtree::AlignedArchivedImmutableKdTree; -#[cfg(feature = "rkyv")] -impl< - 'a, - A: Axis + rkyv::Archive, - T: Content + rkyv::Archive, - const K: usize, - const B: usize, -> AlignedArchivedImmutableKdTree<'_, A, T, K, B> -{ - generate_immutable_float_within_unsorted_iter!( - "use std::fs::File; - use memmap::MmapOptions; - - use kiddo::immutable::float::kdtree::AlignedArchivedImmutableKdTree; - - let mmap = unsafe { MmapOptions::new().map(&File::open(\"./examples/immutable-doctest-tree.rkyv\").expect(\"./examples/immutable-doctest-tree.rkyv missing\")).unwrap() }; - let tree: AlignedArchivedImmutableKdTree = AlignedArchivedImmutableKdTree::from_bytes(&mmap);" - ); -} - #[cfg(feature = "rkyv_08")] impl crate::immutable::float::kdtree::ArchivedR8ImmutableKdTree where - A: Copy + Default + PartialOrd + Axis + LeafSliceFloat + LeafSliceFloatChunk + rkyv_08::Archive, - T: Copy + Default + Content + rkyv_08::Archive, + A: Copy + Default + PartialOrd + Axis + LeafSliceFloat + LeafSliceFloatChunk + rkyv::Archive, + T: Copy + Default + Content + rkyv::Archive, usize: Cast, { generate_immutable_float_within_unsorted_iter!( diff --git a/src/immutable/float/rkyv_aligned_vec.rs b/src/immutable/float/rkyv_aligned_vec.rs index d0b4e562..8998b312 100644 --- a/src/immutable/float/rkyv_aligned_vec.rs +++ b/src/immutable/float/rkyv_aligned_vec.rs @@ -1,7 +1,7 @@ use aligned_vec::{AVec, CACHELINE_ALIGN}; -use rkyv_08::rancor::Fallible; -use rkyv_08::with::{ArchiveWith, DeserializeWith, SerializeWith}; -use rkyv_08::{ +use rkyv::rancor::Fallible; +use rkyv::with::{ArchiveWith, DeserializeWith, SerializeWith}; +use rkyv::{ ser::{Allocator, Writer}, vec::{ArchivedVec, VecResolver}, Archive, Place, Serialize, @@ -59,7 +59,7 @@ mod tests { use aligned_vec::{AVec, CACHELINE_ALIGN}; use std::ops::Rem; - use rkyv_08::{ + use rkyv::{ access_unchecked, deserialize, rancor::Error, Archive, Archived, Deserialize, Serialize, }; @@ -68,7 +68,6 @@ mod tests { #[test] fn roundtrip_avec_deserialized() { #[derive(Archive, Debug, Serialize, Deserialize, PartialEq)] - #[rkyv(crate=rkyv_08)] struct Obj { #[rkyv(with = EncodeAVec)] pub inner: AVec, @@ -78,7 +77,7 @@ mod tests { inner: AVec::from_slice(CACHELINE_ALIGN, &[10, 20, 30, 40]), }; - let buf = rkyv_08::to_bytes::(&original).unwrap(); + let buf = rkyv::to_bytes::(&original).unwrap(); // check that the deserialized values are the same let archived: &ArchivedObj = unsafe { access_unchecked::>(buf.as_ref()) }; @@ -94,7 +93,6 @@ mod tests { #[test] fn roundtrip_avec_archived() { #[derive(Archive, Debug, Serialize, Deserialize, PartialEq)] - #[rkyv(crate=rkyv_08)] struct Obj { #[rkyv(with = EncodeAVec)] pub inner: AVec, @@ -104,7 +102,7 @@ mod tests { inner: AVec::from_slice(CACHELINE_ALIGN, &[10, 20, 30, 40]), }; - let buf = rkyv_08::to_bytes::(&original).unwrap(); + let buf = rkyv::to_bytes::(&original).unwrap(); // check that the archived values are the same let archived: &ArchivedObj = unsafe { access_unchecked::>(buf.as_ref()) };