pub trait Shard: Send + Sync {
fn dim(&self) -> usize;
fn fetch_fp32(&self, idx: usize) -> Option<Vec<f32>>;
}
pub struct LocalShard {
pub dim: usize,
pub vectors: Vec<Vec<f32>>,
}
impl LocalShard {
pub fn new(dim: usize, vectors: Vec<Vec<f32>>) -> Self {
Self { dim, vectors }
}
}
impl Shard for LocalShard {
fn dim(&self) -> usize {
self.dim
}
fn fetch_fp32(&self, idx: usize) -> Option<Vec<f32>> {
self.vectors.get(idx).cloned()
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn local_shard_returns_correct_vector() {
let vecs = vec![
vec![1.0_f32, 2.0, 3.0],
vec![4.0_f32, 5.0, 6.0],
vec![7.0_f32, 8.0, 9.0],
];
let shard = LocalShard::new(3, vecs.clone());
assert_eq!(shard.dim(), 3);
assert_eq!(shard.fetch_fp32(0), Some(vecs[0].clone()));
assert_eq!(shard.fetch_fp32(1), Some(vecs[1].clone()));
assert_eq!(shard.fetch_fp32(2), Some(vecs[2].clone()));
}
#[test]
fn local_shard_out_of_range_returns_none() {
let shard = LocalShard::new(2, vec![vec![1.0, 2.0]]);
assert!(shard.fetch_fp32(1).is_none());
assert!(shard.fetch_fp32(100).is_none());
}
#[test]
fn local_shard_empty_returns_none() {
let shard = LocalShard::new(4, vec![]);
assert!(shard.fetch_fp32(0).is_none());
}
}