mod codec;
mod format;
mod io;
mod mutable_api;
mod reader;
mod validation;
mod writer;
use crate::error::SearchError;
use crate::mutable::MutableVectorIndex;
use crate::quantized::QuantizedIndex;
use std::path::Path;
#[derive(Debug)]
pub struct IndexBundle {
mutable: MutableVectorIndex,
quantized: Option<QuantizedIndex>,
}
impl IndexBundle {
pub fn new(
mutable: MutableVectorIndex,
quantized: Option<QuantizedIndex>,
) -> Result<Self, SearchError> {
validation::validate_quantized(&mutable.snapshot(), quantized.as_ref())?;
Ok(Self { mutable, quantized })
}
#[must_use]
pub const fn mutable(&self) -> &MutableVectorIndex {
&self.mutable
}
#[must_use]
pub const fn mutable_mut(&mut self) -> &mut MutableVectorIndex {
&mut self.mutable
}
#[must_use]
pub const fn quantized(&self) -> Option<&QuantizedIndex> {
self.quantized.as_ref()
}
pub fn set_quantized(&mut self, quantized: Option<QuantizedIndex>) -> Result<(), SearchError> {
validation::validate_quantized(&self.mutable.snapshot(), quantized.as_ref())?;
self.quantized = quantized;
Ok(())
}
#[must_use]
pub fn into_parts(self) -> (MutableVectorIndex, Option<QuantizedIndex>) {
(self.mutable, self.quantized)
}
pub fn save(&self, path: impl AsRef<Path>) -> Result<(), SearchError> {
writer::save_complete(&self.mutable, self.quantized.as_ref(), path.as_ref())
}
pub fn load(path: impl AsRef<Path>) -> Result<Self, SearchError> {
let (mutable, quantized) = reader::load_complete(path.as_ref())?;
Self::new(mutable, quantized)
}
}