diff --git a/Cargo.lock b/Cargo.lock index ebbd5472..19a975a9 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -841,12 +841,21 @@ dependencies = [ "dary_heap", "distance", "rabitq", - "simd", "small_iter", "vector", "zerocopy", ] +[[package]] +name = "index_accessor" +version = "0.0.0" +dependencies = [ + "distance", + "rabitq", + "simd", + "vector", +] + [[package]] name = "indexmap" version = "2.13.0" @@ -1942,6 +1951,7 @@ dependencies = [ "feistel", "humansize", "index", + "index_accessor", "k_means", "mimalloc", "paste", @@ -1971,6 +1981,7 @@ dependencies = [ "always_equal", "distance", "index", + "index_accessor", "min-max-heap", "rabitq", "rand", @@ -1988,6 +1999,7 @@ dependencies = [ "always_equal", "distance", "index", + "index_accessor", "pin-project", "rabitq", "rand", diff --git a/Cargo.toml b/Cargo.toml index 743081fe..99b9aebc 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -25,6 +25,7 @@ always_equal = { path = "./crates/always_equal" } distance = { path = "./crates/distance" } feistel = { path = "./crates/feistel" } index = { path = "./crates/index" } +index_accessor = { path = "./crates/index_accessor" } k_means = { path = "./crates/k_means" } rabitq = { path = "./crates/rabitq" } simd = { path = "./crates/simd" } diff --git a/crates/index/Cargo.toml b/crates/index/Cargo.toml index deb0d497..7ade4785 100644 --- a/crates/index/Cargo.toml +++ b/crates/index/Cargo.toml @@ -8,7 +8,6 @@ publish = false always_equal = { path = "../always_equal" } distance = { path = "../distance" } rabitq = { path = "../rabitq" } -simd = { path = "../simd" } small_iter = { path = "../small_iter" } vector = { path = "../vector" } diff --git a/crates/index/src/lib.rs b/crates/index/src/lib.rs index 1ba2ed4e..6ec70b6b 100644 --- a/crates/index/src/lib.rs +++ b/crates/index/src/lib.rs @@ -12,7 +12,7 @@ // // Copyright (c) 2025 TensorChord Inc. -pub mod accessor; +// pub mod accessor; pub mod bump; pub mod fetch; pub mod packed; diff --git a/crates/index_accessor/Cargo.toml b/crates/index_accessor/Cargo.toml new file mode 100644 index 00000000..e23da0f3 --- /dev/null +++ b/crates/index_accessor/Cargo.toml @@ -0,0 +1,17 @@ +[package] +name = "index_accessor" +version.workspace = true +edition.workspace = true +publish = false + +[lib] +path = "../index/src/accessor.rs" + +[dependencies] +distance = { path = "../distance" } +rabitq = { path = "../rabitq" } +simd = { path = "../simd" } +vector = { path = "../vector" } + +[lints] +workspace = true diff --git a/crates/vchordg/Cargo.toml b/crates/vchordg/Cargo.toml index 7b5a1658..c1772834 100644 --- a/crates/vchordg/Cargo.toml +++ b/crates/vchordg/Cargo.toml @@ -8,6 +8,7 @@ publish = false always_equal = { path = "../always_equal" } distance = { path = "../distance" } index = { path = "../index" } +index_accessor = { path = "../index_accessor" } rabitq = { path = "../rabitq" } simd = { path = "../simd" } vector = { path = "../vector" } diff --git a/crates/vchordg/src/insert.rs b/crates/vchordg/src/insert.rs index 5b72d923..a133ae6d 100644 --- a/crates/vchordg/src/insert.rs +++ b/crates/vchordg/src/insert.rs @@ -21,10 +21,10 @@ use crate::types::DistanceKind; use crate::vectors::{by_prefetch, by_read, copy_all, copy_nothing, copy_outs, update}; use crate::visited::Visited; use always_equal::AlwaysEqual; -use index::accessor::{DefaultWithDimension, LAccess}; use index::bump::Bump; use index::prefetcher::{Prefetcher, PrefetcherSequenceFamily}; use index::relation::{Page, PageGuard, RelationRead, RelationWrite}; +use index_accessor::{DefaultWithDimension, LAccess}; use rabitq::bits::Bits; use std::cmp::Reverse; use std::collections::VecDeque; diff --git a/crates/vchordg/src/maintain.rs b/crates/vchordg/src/maintain.rs index de25edbc..6d43daad 100644 --- a/crates/vchordg/src/maintain.rs +++ b/crates/vchordg/src/maintain.rs @@ -18,8 +18,8 @@ use crate::tuples::{MetaTuple, VertexTuple, WithReader}; use crate::types::DistanceKind; use crate::vectors::{by_read, copy_all, copy_nothing, copy_outs, update}; use always_equal::AlwaysEqual; -use index::accessor::DefaultWithDimension; use index::relation::{Page, PageGuard, RelationRead, RelationWrite}; +use index_accessor::DefaultWithDimension; use std::cmp::Reverse; use vector::VectorOwned; diff --git a/crates/vchordg/src/operator.rs b/crates/vchordg/src/operator.rs index 6eead52e..bc279567 100644 --- a/crates/vchordg/src/operator.rs +++ b/crates/vchordg/src/operator.rs @@ -14,7 +14,7 @@ use crate::types::DistanceKind; use distance::Distance; -use index::accessor::{ +use index_accessor::{ Accessor1, Accessor2, ByteDistanceAccessor, DefaultWithDimension, DistanceAccessor, Dot, HalfbyteDistanceAccessor, L2S, }; diff --git a/crates/vchordg/src/search.rs b/crates/vchordg/src/search.rs index ee5ee353..33a378e9 100644 --- a/crates/vchordg/src/search.rs +++ b/crates/vchordg/src/search.rs @@ -21,10 +21,10 @@ use crate::vectors::{by_prefetch, copy_outs}; use crate::visited::Visited; use always_equal::AlwaysEqual; use distance::Distance; -use index::accessor::{DefaultWithDimension, LAccess}; use index::bump::Bump; use index::prefetcher::{Prefetcher, PrefetcherSequenceFamily}; use index::relation::{Page, RelationRead}; +use index_accessor::{DefaultWithDimension, LAccess}; use rabitq::bits::Bits; use std::cmp::Reverse; use std::collections::VecDeque; diff --git a/crates/vchordg/src/vectors.rs b/crates/vchordg/src/vectors.rs index 95b83e25..272ba48f 100644 --- a/crates/vchordg/src/vectors.rs +++ b/crates/vchordg/src/vectors.rs @@ -15,8 +15,8 @@ use crate::operator::{Operator, Vector}; use crate::tuples::*; use distance::Distance; -use index::accessor::Accessor1; use index::relation::{Page, RelationRead, RelationWrite}; +use index_accessor::Accessor1; use std::collections::VecDeque; use std::num::{NonZero, Wrapping}; diff --git a/crates/vchordrq/Cargo.toml b/crates/vchordrq/Cargo.toml index 89c4c360..ebac0e59 100644 --- a/crates/vchordrq/Cargo.toml +++ b/crates/vchordrq/Cargo.toml @@ -8,6 +8,7 @@ publish = false always_equal = { path = "../always_equal" } distance = { path = "../distance" } index = { path = "../index" } +index_accessor = { path = "../index_accessor" } rabitq = { path = "../rabitq" } simd = { path = "../simd" } vector = { path = "../vector" } diff --git a/crates/vchordrq/src/bulkdelete.rs b/crates/vchordrq/src/bulkdelete.rs index 6bdbe530..d5e64acd 100644 --- a/crates/vchordrq/src/bulkdelete.rs +++ b/crates/vchordrq/src/bulkdelete.rs @@ -17,8 +17,8 @@ use crate::operator::Operator; use crate::tape::by_next; use crate::tuples::*; use crate::{Opaque, tape}; -use index::accessor::FunctionalAccessor; use index::relation::{Page, RelationRead, RelationWrite}; +use index_accessor::FunctionalAccessor; use std::num::NonZero; pub fn bulkdelete( diff --git a/crates/vchordrq/src/cache.rs b/crates/vchordrq/src/cache.rs index 89c9178e..65c28347 100644 --- a/crates/vchordrq/src/cache.rs +++ b/crates/vchordrq/src/cache.rs @@ -15,8 +15,8 @@ use crate::closure_lifetime_binder::{id_0, id_1}; use crate::tuples::{MetaTuple, WithReader}; use crate::{Opaque, tape}; -use index::accessor::FunctionalAccessor; use index::relation::{Page, PageGuard, RelationRead}; +use index_accessor::FunctionalAccessor; pub fn cache(index: &R, level: i32) -> Vec where diff --git a/crates/vchordrq/src/centroids.rs b/crates/vchordrq/src/centroids.rs index 44221a86..521987d5 100644 --- a/crates/vchordrq/src/centroids.rs +++ b/crates/vchordrq/src/centroids.rs @@ -14,8 +14,8 @@ use crate::operator::*; use crate::tuples::*; -use index::accessor::Accessor1; use index::relation::{Page, RelationRead}; +use index_accessor::Accessor1; pub fn read< 'a, diff --git a/crates/vchordrq/src/insert.rs b/crates/vchordrq/src/insert.rs index 32ae080a..bf256b08 100644 --- a/crates/vchordrq/src/insert.rs +++ b/crates/vchordrq/src/insert.rs @@ -19,11 +19,11 @@ use crate::tuples::*; use crate::{Opaque, centroids, tape, vectors}; use always_equal::AlwaysEqual; use distance::Distance; -use index::accessor::{DefaultWithDimension, FunctionalAccessor, LAccess}; use index::bump::Bump; use index::fetch::BorrowedIter; use index::prefetcher::{Prefetcher, PrefetcherHeapFamily}; use index::relation::{Page, RelationRead, RelationWrite}; +use index_accessor::{DefaultWithDimension, FunctionalAccessor, LAccess}; use std::cmp::Reverse; use std::collections::BinaryHeap; use std::num::NonZero; diff --git a/crates/vchordrq/src/maintain.rs b/crates/vchordrq/src/maintain.rs index 24f4b255..291fa2e5 100644 --- a/crates/vchordrq/src/maintain.rs +++ b/crates/vchordrq/src/maintain.rs @@ -17,11 +17,11 @@ use crate::operator::{Operator, Vector}; use crate::tape_writer::{DirectoryTapeWriter, FrozenTapeWriter}; use crate::tuples::*; use crate::{Branch, Opaque, freepages, tape}; -use index::accessor::FunctionalAccessor; use index::prefetcher::PrefetcherSequenceFamily; use index::relation::{ Page, PageGuard, Relation, RelationRead, RelationReadTypes, RelationWrite, RelationWriteTypes, }; +use index_accessor::FunctionalAccessor; use rabitq::packing::unpack; use std::cell::RefCell; diff --git a/crates/vchordrq/src/operator.rs b/crates/vchordrq/src/operator.rs index 54395aae..3e1016d4 100644 --- a/crates/vchordrq/src/operator.rs +++ b/crates/vchordrq/src/operator.rs @@ -13,7 +13,7 @@ // Copyright (c) 2025 TensorChord Inc. use distance::Distance; -use index::accessor::{ +use index_accessor::{ Accessor1, Accessor2, ByteDistanceAccessor, DefaultWithDimension, DistanceAccessor, Dot, HalfbyteDistanceAccessor, L2S, RAccess, }; diff --git a/crates/vchordrq/src/prewarm.rs b/crates/vchordrq/src/prewarm.rs index d56314e4..bfc8cb73 100644 --- a/crates/vchordrq/src/prewarm.rs +++ b/crates/vchordrq/src/prewarm.rs @@ -17,9 +17,9 @@ use crate::operator::Operator; use crate::tape::{by_directory, by_next}; use crate::tuples::*; use crate::{Opaque, centroids, tape}; -use index::accessor::FunctionalAccessor; use index::prefetcher::PrefetcherSequenceFamily; use index::relation::{Page, RelationRead}; +use index_accessor::FunctionalAccessor; use std::fmt::Write; pub fn prewarm<'b, R: RelationRead, O: Operator>( diff --git a/crates/vchordrq/src/rerank.rs b/crates/vchordrq/src/rerank.rs index 53b1adb5..40905842 100644 --- a/crates/vchordrq/src/rerank.rs +++ b/crates/vchordrq/src/rerank.rs @@ -18,11 +18,11 @@ use crate::tuples::{MetaTuple, WithReader}; use crate::{RerankMethod, vectors}; use always_equal::AlwaysEqual; use distance::Distance; -use index::accessor::{Accessor2, DefaultWithDimension, LTryAccess}; use index::fetch::BorrowedIter; use index::packed::PackedRefMut; use index::prefetcher::Prefetcher; use index::relation::{Page, RelationRead}; +use index_accessor::{Accessor2, DefaultWithDimension, LTryAccess}; use std::cmp::Reverse; use std::collections::BinaryHeap; use std::marker::PhantomData; diff --git a/crates/vchordrq/src/search.rs b/crates/vchordrq/src/search.rs index 4855c61f..9bd0409c 100644 --- a/crates/vchordrq/src/search.rs +++ b/crates/vchordrq/src/search.rs @@ -20,12 +20,12 @@ use crate::tuples::*; use crate::{Opaque, centroids, tape}; use always_equal::AlwaysEqual; use distance::Distance; -use index::accessor::{DefaultWithDimension, FunctionalAccessor, LAccess}; use index::bump::Bump; use index::fetch::BorrowedIter; use index::packed::{PackedRefMut4, PackedRefMut8}; use index::prefetcher::{Prefetcher, PrefetcherHeapFamily, PrefetcherSequenceFamily}; use index::relation::{Page, RelationRead}; +use index_accessor::{DefaultWithDimension, FunctionalAccessor, LAccess}; use std::cmp::Reverse; use std::collections::BinaryHeap; use std::num::NonZero; diff --git a/crates/vchordrq/src/tape.rs b/crates/vchordrq/src/tape.rs index aa135dd2..16502785 100644 --- a/crates/vchordrq/src/tape.rs +++ b/crates/vchordrq/src/tape.rs @@ -14,9 +14,9 @@ use crate::tuples::*; use crate::{Opaque, freepages}; -use index::accessor::Accessor1; use index::prefetcher::{Prefetcher, PrefetcherSequenceFamily}; use index::relation::{Page, PageGuard, RelationRead, RelationWrite}; +use index_accessor::Accessor1; use std::marker::PhantomData; use std::num::NonZero; diff --git a/crates/vchordrq/src/vectors.rs b/crates/vchordrq/src/vectors.rs index 0767425c..d48150c0 100644 --- a/crates/vchordrq/src/vectors.rs +++ b/crates/vchordrq/src/vectors.rs @@ -15,8 +15,8 @@ use crate::operator::*; use crate::tuples::*; use crate::{Opaque, tape}; -use index::accessor::TryAccessor1; use index::relation::{Page, PageGuard, RelationRead, RelationWrite}; +use index_accessor::TryAccessor1; use std::num::NonZero; use vector::VectorOwned; diff --git a/src/index/vchordg/am/am_build.rs b/src/index/vchordg/am/am_build.rs index d1c3c465..0349acc5 100644 --- a/src/index/vchordg/am/am_build.rs +++ b/src/index/vchordg/am/am_build.rs @@ -593,7 +593,7 @@ unsafe fn options( v: opfamily.vector_kind(), d: opfamily.distance_kind(), }; - // get indexing, segment, optimizing + // get indexing options let indexing_options = { let reloption = unsafe { (*index_relation).rd_options as *const Reloption }; let s = unsafe { Reloption::options(reloption, c"") }.to_string_lossy(); diff --git a/src/index/vchordg/dispatch.rs b/src/index/vchordg/dispatch.rs index 548a77c6..6f1dbff8 100644 --- a/src/index/vchordg/dispatch.rs +++ b/src/index/vchordg/dispatch.rs @@ -13,12 +13,12 @@ // Copyright (c) 2025 TensorChord Inc. use crate::index::vchordg::opclass::Opfamily; -use index::accessor::{Dot, L2S}; use index::fetch::Fetch; use index::prefetcher::*; use index::relation::{ Hints, Page, RelationPrefetch, RelationRead, RelationReadStream, RelationWrite, }; +use index_accessor::{Dot, L2S}; use simd::f16; use std::num::NonZero; use vchordg::operator::Op; diff --git a/src/index/vchordg/scanners/default.rs b/src/index/vchordg/scanners/default.rs index 31582979..a5bebc42 100644 --- a/src/index/vchordg/scanners/default.rs +++ b/src/index/vchordg/scanners/default.rs @@ -20,9 +20,9 @@ use crate::index::vchordg::opclass::Opfamily; use crate::index::vchordg::scanners::SearchOptions; use crate::recorder::{Recorder, text}; use distance::Distance; -use index::accessor::{Dot, L2S}; use index::bump::Bump; use index::relation::{Hints, Page, RelationPrefetch, RelationRead, RelationReadStream}; +use index_accessor::{Dot, L2S}; use simd::f16; use std::num::NonZero; use vchordg::operator::{self}; diff --git a/src/index/vchordrq/am/am_build.rs b/src/index/vchordrq/am/am_build.rs index a33434ca..1c504537 100644 --- a/src/index/vchordrq/am/am_build.rs +++ b/src/index/vchordrq/am/am_build.rs @@ -1245,7 +1245,7 @@ unsafe fn options( v: opfamily.vector_kind(), d: opfamily.distance_kind(), }; - // get indexing, segment, optimizing + // get indexing options let indexing_options = { let reloption = unsafe { (*index_relation).rd_options as *const Reloption }; let s = unsafe { Reloption::options(reloption, c"") }.to_string_lossy(); diff --git a/src/index/vchordrq/am/mod.rs b/src/index/vchordrq/am/mod.rs index d69d1328..e75f95c7 100644 --- a/src/index/vchordrq/am/mod.rs +++ b/src/index/vchordrq/am/mod.rs @@ -401,15 +401,6 @@ pub unsafe extern "C-unwind" fn aminsert( _check_unique: pgrx::pg_sys::IndexUniqueCheck::Type, _index_unchanged: bool, _index_info: *mut pgrx::pg_sys::IndexInfo, -) -> bool { - unsafe { aminsertinner(index_relation, values, is_null, heap_tid) } -} - -unsafe fn aminsertinner( - index_relation: pgrx::pg_sys::Relation, - values: *mut Datum, - is_null: *mut bool, - ctid: pgrx::pg_sys::ItemPointer, ) -> bool { struct RngChooser(T); impl InsertChooser for RngChooser { @@ -421,7 +412,7 @@ unsafe fn aminsertinner( let opfamily = unsafe { opfamily(index_relation) }; let index = unsafe { PostgresRelation::new(index_relation) }; let datum = unsafe { (!is_null.add(0).read()).then_some(values.add(0).read()) }; - let ctid = unsafe { ctid.read() }; + let ctid = unsafe { heap_tid.read() }; if let Some(store) = unsafe { datum.and_then(|x| opfamily.store(x)) } { for (vector, extra) in store { let key = ctid_to_key(ctid); diff --git a/src/index/vchordrq/dispatch.rs b/src/index/vchordrq/dispatch.rs index c4a80fd7..550c1b61 100644 --- a/src/index/vchordrq/dispatch.rs +++ b/src/index/vchordrq/dispatch.rs @@ -14,13 +14,13 @@ use crate::index::vchordrq::build::{Normalize, Normalized}; use crate::index::vchordrq::opclass::Opfamily; -use index::accessor::{Dot, L2S}; use index::bump::Bump; use index::fetch::Fetch; use index::prefetcher::*; use index::relation::{ Hints, Page, RelationPrefetch, RelationRead, RelationReadStream, RelationWrite, }; +use index_accessor::{Dot, L2S}; use simd::f16; use std::collections::BinaryHeap; use std::num::NonZero; diff --git a/src/index/vchordrq/scanners/default.rs b/src/index/vchordrq/scanners/default.rs index ba94953b..9c6719ea 100644 --- a/src/index/vchordrq/scanners/default.rs +++ b/src/index/vchordrq/scanners/default.rs @@ -22,11 +22,11 @@ use crate::index::vchordrq::scanners::SearchOptions; use crate::recorder::{Recorder, text}; use always_equal::AlwaysEqual; use dary_heap::QuaternaryHeap as Heap; -use index::accessor::{Dot, L2S}; use index::bump::Bump; use index::packed::PackedRefMut4; use index::prefetcher::*; use index::relation::{Hints, Page, RelationPrefetch, RelationRead, RelationReadStream}; +use index_accessor::{Dot, L2S}; use simd::f16; use std::num::NonZero; use vchordrq::types::{DistanceKind, OwnedVector, VectorKind}; diff --git a/src/index/vchordrq/scanners/maxsim.rs b/src/index/vchordrq/scanners/maxsim.rs index 460d137a..c63e91b0 100644 --- a/src/index/vchordrq/scanners/maxsim.rs +++ b/src/index/vchordrq/scanners/maxsim.rs @@ -22,11 +22,11 @@ use crate::recorder::Recorder; use always_equal::AlwaysEqual; use dary_heap::QuaternaryHeap as Heap; use distance::Distance; -use index::accessor::Dot; use index::bump::Bump; use index::packed::PackedRefMut8; use index::prefetcher::*; use index::relation::{Hints, Page, RelationPrefetch, RelationRead, RelationReadStream}; +use index_accessor::Dot; use simd::f16; use std::cmp::Reverse; use std::collections::BinaryHeap;