diff --git a/diskann-garnet/src/provider.rs b/diskann-garnet/src/provider.rs index e2522b147..0be5be9a4 100644 --- a/diskann-garnet/src/provider.rs +++ b/diskann-garnet/src/provider.rs @@ -808,7 +808,7 @@ impl DefaultPostProcessor, &[T], GarnetId> for impl PruneStrategy> for FullPrecision { type PruneAccessor<'a> = FullAccessor<'a, T>; type PruneAccessorError = GarnetProviderError; - type DistanceComputer = T::Distance; + type DistanceComputer<'a> = T::Distance; type WorkingSet = WorkingSet; fn prune_accessor<'a>( diff --git a/diskann-providers/src/model/graph/provider/async_/bf_tree/provider.rs b/diskann-providers/src/model/graph/provider/async_/bf_tree/provider.rs index f7289e146..8fde6f465 100644 --- a/diskann-providers/src/model/graph/provider/async_/bf_tree/provider.rs +++ b/diskann-providers/src/model/graph/provider/async_/bf_tree/provider.rs @@ -1525,7 +1525,7 @@ where D: AsyncFriendly, { type WorkingSet = map::Map, map::Ref<[T]>>; - type DistanceComputer = T::Distance; + type DistanceComputer<'a> = T::Distance; type PruneAccessor<'a> = FullAccessor<'a, T, Q, D>; type PruneAccessorError = diskann::error::Infallible; @@ -1548,7 +1548,7 @@ where D: AsyncFriendly, { type WorkingSet = distances::pq::HybridMap; - type DistanceComputer = distances::pq::HybridComputer; + type DistanceComputer<'a> = distances::pq::HybridComputer; type PruneAccessor<'a> = HybridAccessor<'a, T, D>; type PruneAccessorError = diskann::error::Infallible; diff --git a/diskann-providers/src/model/graph/provider/async_/caching/provider.rs b/diskann-providers/src/model/graph/provider/async_/caching/provider.rs index f60ea100e..e73bd4187 100644 --- a/diskann-providers/src/model/graph/provider/async_/caching/provider.rs +++ b/diskann-providers/src/model/graph/provider/async_/caching/provider.rs @@ -977,7 +977,7 @@ where E: StandardError, { type WorkingSet = Cached; - type DistanceComputer = S::DistanceComputer; + type DistanceComputer<'a> = S::DistanceComputer<'a>; type PruneAccessor<'a> = CachingAccessor< PruneAccessor<'a, S, DP>, >>::Accessor, diff --git a/diskann-providers/src/model/graph/provider/async_/inmem/full_precision.rs b/diskann-providers/src/model/graph/provider/async_/inmem/full_precision.rs index 4f60b9510..e72f323ef 100644 --- a/diskann-providers/src/model/graph/provider/async_/inmem/full_precision.rs +++ b/diskann-providers/src/model/graph/provider/async_/inmem/full_precision.rs @@ -441,7 +441,7 @@ where D: AsyncFriendly, Ctx: ExecutionContext, { - type DistanceComputer = T::Distance; + type DistanceComputer<'a> = T::Distance; type PruneAccessor<'a> = FullAccessor<'a, T, Q, D, Ctx>; type PruneAccessorError = diskann::error::Infallible; type WorkingSet = PassThrough; diff --git a/diskann-providers/src/model/graph/provider/async_/inmem/product.rs b/diskann-providers/src/model/graph/provider/async_/inmem/product.rs index 4f3f931ba..b3867ad85 100644 --- a/diskann-providers/src/model/graph/provider/async_/inmem/product.rs +++ b/diskann-providers/src/model/graph/provider/async_/inmem/product.rs @@ -546,7 +546,7 @@ where D: AsyncFriendly + DeletionCheck, Ctx: ExecutionContext, { - type DistanceComputer = distances::pq::HybridComputer; + type DistanceComputer<'a> = distances::pq::HybridComputer; type PruneAccessor<'a> = HybridAccessor<'a, T, D, Ctx>; type PruneAccessorError = diskann::error::Infallible; type WorkingSet = FullPrecisionTracker; @@ -692,7 +692,7 @@ where D: AsyncFriendly + DeletionCheck, Ctx: ExecutionContext, { - type DistanceComputer = pq::distance::DistanceComputer>; + type DistanceComputer<'a> = pq::distance::DistanceComputer>; type PruneAccessor<'a> = QuantAccessor<'a, NoStore, D, Ctx>; type PruneAccessorError = diskann::error::Infallible; type WorkingSet = PassThrough; diff --git a/diskann-providers/src/model/graph/provider/async_/inmem/scalar.rs b/diskann-providers/src/model/graph/provider/async_/inmem/scalar.rs index 0e1f5954c..a69344691 100644 --- a/diskann-providers/src/model/graph/provider/async_/inmem/scalar.rs +++ b/diskann-providers/src/model/graph/provider/async_/inmem/scalar.rs @@ -674,7 +674,7 @@ where Unsigned: Representation, DistanceComputer: for<'a, 'b> DistanceFunction, CVRef<'b, NBITS>, f32>, { - type DistanceComputer = DistanceComputer; + type DistanceComputer<'a> = DistanceComputer; type PruneAccessor<'a> = QuantAccessor<'a, NBITS, V, D, Ctx>; type PruneAccessorError = diskann::error::Infallible; type WorkingSet = PassThrough; diff --git a/diskann-providers/src/model/graph/provider/async_/inmem/spherical.rs b/diskann-providers/src/model/graph/provider/async_/inmem/spherical.rs index 5c6f7d85a..11f489aa4 100644 --- a/diskann-providers/src/model/graph/provider/async_/inmem/spherical.rs +++ b/diskann-providers/src/model/graph/provider/async_/inmem/spherical.rs @@ -614,7 +614,7 @@ where D: AsyncFriendly + DeletionCheck, Ctx: ExecutionContext, { - type DistanceComputer = + type DistanceComputer<'a> = UnwrapErr; type PruneAccessor<'a> = QuantAccessor<'a, V, D, Ctx>; type PruneAccessorError = diskann::error::Infallible; diff --git a/diskann-providers/src/model/graph/provider/async_/inmem/test.rs b/diskann-providers/src/model/graph/provider/async_/inmem/test.rs index bfb18c3c1..2493a5ce2 100644 --- a/diskann-providers/src/model/graph/provider/async_/inmem/test.rs +++ b/diskann-providers/src/model/graph/provider/async_/inmem/test.rs @@ -268,7 +268,7 @@ static START_COUNT: Mutex = Mutex::new(STATIC_PRUNE_THRESHOLD); type WorkingSet = map::Map, map::Ref<[f32]>>; impl PruneStrategy for Flaky { - type DistanceComputer = as BuildDistanceComputer>::DistanceComputer; + type DistanceComputer<'a> = as BuildDistanceComputer>::DistanceComputer; type PruneAccessor<'a> = FlakyAccessor<'a>; type PruneAccessorError = diskann::error::Infallible; type WorkingSet = WorkingSet; diff --git a/diskann/src/graph/glue.rs b/diskann/src/graph/glue.rs index f796a5054..cb098b85c 100644 --- a/diskann/src/graph/glue.rs +++ b/diskann/src/graph/glue.rs @@ -613,13 +613,12 @@ where /// /// We could grab this type from the `PruneAccessor` associated type, but it's /// useful enough that we move it up here. - type DistanceComputer: for<'a, 'b, 'c, 'd> DistanceFunction< + type DistanceComputer<'computer>: for<'a, 'b, 'c, 'd> DistanceFunction< as Accessor>::ElementRef<'b>, as Accessor>::ElementRef<'d>, f32, > + Send - + Sync - + 'static; + + Sync; /// The concrete type of the accessor that is used to access `Self` during pruning. /// @@ -630,7 +629,7 @@ where /// Implementations are encouraged to have [`Accessor::get_element`] return the /// highest-precision applicable value for a given element type. type PruneAccessor<'a>: Accessor - + BuildDistanceComputer + + BuildDistanceComputer> + AsNeighborMut + workingset::Fill; diff --git a/diskann/src/graph/test/provider.rs b/diskann/src/graph/test/provider.rs index 62a4a45be..ae46a6e5a 100644 --- a/diskann/src/graph/test/provider.rs +++ b/diskann/src/graph/test/provider.rs @@ -1188,7 +1188,7 @@ impl glue::DefaultPostProcessor for Strategy { impl glue::PruneStrategy for Strategy { type WorkingSet = workingset::Map, workingset::map::Ref<[f32]>>; - type DistanceComputer = ::Distance; + type DistanceComputer<'a> = ::Distance; type PruneAccessor<'a> = Accessor<'a>; type PruneAccessorError = Infallible; diff --git a/diskann/src/provider.rs b/diskann/src/provider.rs index b4a652e6b..82906be75 100644 --- a/diskann/src/provider.rs +++ b/diskann/src/provider.rs @@ -511,8 +511,7 @@ pub trait BuildDistanceComputer: Accessor { /// of elements yielded by the [`Accessor`]. type DistanceComputer: for<'a, 'b> DistanceFunction, Self::ElementRef<'b>> + Send - + Sync - + 'static; + + Sync; /// Build the random-access distance computer for this accessor. ///