weavatrix_search_vector/storage/
mapped_owned.rs1use 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 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}