nodedb_vector/hnsw/graph/index/
neighbors.rs1use super::state::HnswIndex;
11
12impl HnswIndex {
13 #[inline]
16 pub(crate) fn neighbors_at(&self, node_id: u32, layer: usize) -> &[u32] {
17 if let Some(ref flat) = self.flat_neighbors {
18 return flat.neighbors_at(node_id, layer);
19 }
20 let node = &self.nodes[node_id as usize];
21 if layer < node.neighbors.len() {
22 &node.neighbors[layer]
23 } else {
24 &[]
25 }
26 }
27
28 #[inline]
30 pub(crate) fn node_num_layers(&self, node_id: u32) -> usize {
31 if let Some(ref flat) = self.flat_neighbors {
32 return flat.num_layers(node_id);
33 }
34 self.nodes[node_id as usize].neighbors.len()
35 }
36
37 pub(crate) fn ensure_mutable_neighbors(&mut self) {
40 if let Some(flat) = self.flat_neighbors.take() {
41 let nested = flat.to_nested(self.nodes.len());
42 for (i, layers) in nested.into_iter().enumerate() {
43 self.nodes[i].neighbors = layers;
44 }
45 }
46 }
47
48 pub fn export_neighbors(&self) -> Vec<Vec<Vec<u32>>> {
50 self.nodes.iter().map(|n| n.neighbors.clone()).collect()
51 }
52}