pub enum Strategy<S> {
Broadcast(S),
Collection(Box<[S]>),
Indexable(Box<dyn Indexable<S> + Send + Sync>),
}Expand description
A dynamic strategy (e.g. diskann::graph::glue::SearchStrategy) manager for built-in
searcher such as super::KNN, super::Range, and super::MultiHop.
This provides an efficient means for either broadcasting a single strategy to all search queries, or maintaining a collection of strategies, one for each query.
Variants§
Broadcast(S)
Use the same strategy for all queries.
Collection(Box<[S]>)
Use a custom strategy for each query.
Indexable(Box<dyn Indexable<S> + Send + Sync>)
Use a custom strategy for each query via an Indexable trait object.
Implementations§
Source§impl<S> Strategy<S>
impl<S> Strategy<S>
Sourcepub fn broadcast(strategy: S) -> Self
pub fn broadcast(strategy: S) -> Self
Create a strategy that broadcasts strategy to all queries.
Sourcepub fn collection<I>(itr: I) -> Selfwhere
I: IntoIterator<Item = S>,
pub fn collection<I>(itr: I) -> Selfwhere
I: IntoIterator<Item = S>,
Create a strategy that uses the strategies in itr for each query.
Sourcepub fn from_indexable<I>(indexable: I) -> Self
pub fn from_indexable<I>(indexable: I) -> Self
Create a strategy that uses indexable for each query’s strategy.
This method is most useful when the strategies are stored in a custom data structure and can avoid the cost of rematerializing a collection.
Sourcepub fn len(&self) -> Option<usize>
pub fn len(&self) -> Option<usize>
Return the number of strategies contained in self, or None if there are
an unbounded number of strategies.
use diskann_benchmark_core::search::graph::Strategy;
let strategy = Strategy::broadcast(42usize);
assert_eq!(*strategy.get(0).unwrap(), 42);
assert!(
strategy.len().is_none(),
"broadcasted strategies can be retrieved from any index",
);
let strategy = Strategy::collection([42usize, 128usize]);
assert_eq!(*strategy.get(0).unwrap(), 42);
assert_eq!(*strategy.get(1).unwrap(), 128);
assert_eq!(strategy.len(), Some(2));Sourcepub fn is_empty(&self) -> bool
pub fn is_empty(&self) -> bool
Return true only if the number of strategies is bounded and equal to zero.
Sourcepub fn length_compatible(
&self,
expected: usize,
) -> Result<(), LengthIncompatible>
pub fn length_compatible( &self, expected: usize, ) -> Result<(), LengthIncompatible>
Check if the number of strategies in self is compatible with expected.
Self::Broadcast is always compatible. Otherwise, the number of strategies must
exactly match expected.