Skip to main content

weavatrix_search_vector/storage/
mapped_owned.rs

1use super::MappedVectorIndex;
2use super::format::to_usize;
3use crate::error::SearchError;
4use crate::hnsw::{Graph, NodeLinks, RoutingIndex, VectorIndex};
5use crate::vector::VectorStore;
6
7impl MappedVectorIndex {
8    /// Materializes the mapped index without rebuilding its graph.
9    ///
10    /// # Errors
11    ///
12    /// Returns an allocation, integrity, or config error.
13    pub fn to_owned(&self) -> Result<VectorIndex, SearchError> {
14        let vectors = VectorStore::from_values(
15            self.header.config.dimensions,
16            self.header.config.metric,
17            self.key_slice().to_vec(),
18            self.vector_slice().to_vec(),
19        )?;
20        let graphs = self.materialize_graphs()?;
21        let routing = RoutingIndex {
22            entries: self
23                .routing_codes()
24                .iter()
25                .copied()
26                .zip(self.routing_nodes().iter().copied())
27                .collect(),
28        };
29        VectorIndex::from_parts(self.header.config.clone(), vectors, graphs, routing)
30    }
31
32    fn materialize_graphs(&self) -> Result<Vec<Graph>, SearchError> {
33        let mut graphs = Vec::new();
34        graphs
35            .try_reserve_exact(self.graphs.len())
36            .map_err(|_| SearchError::AllocationFailed)?;
37        for graph in &self.graphs {
38            let node_layers = graph.node_layers(&self.mapping);
39            let layer_neighbors = graph.layer_neighbors(&self.mapping);
40            let neighbors = graph.neighbors(&self.mapping);
41            let mut nodes = Vec::new();
42            nodes
43                .try_reserve_exact(self.len())
44                .map_err(|_| SearchError::AllocationFailed)?;
45            for node in 0..self.len() {
46                let layer_start = to_usize(node_layers[node])?;
47                let layer_end = to_usize(node_layers[node + 1])?;
48                let mut layers = Vec::new();
49                layers
50                    .try_reserve_exact(layer_end.saturating_sub(layer_start))
51                    .map_err(|_| SearchError::AllocationFailed)?;
52                for layer in layer_start..layer_end {
53                    let start = to_usize(layer_neighbors[layer])?;
54                    let end = to_usize(layer_neighbors[layer + 1])?;
55                    layers.push(neighbors[start..end].to_vec());
56                }
57                nodes.push(NodeLinks { layers });
58            }
59            graphs.push(Graph {
60                entry: graph.entry,
61                max_level: graph.max_level,
62                nodes,
63            });
64        }
65        Ok(graphs)
66    }
67}