use super::state::HnswIndex;
impl HnswIndex {
#[inline]
pub(crate) fn neighbors_at(&self, node_id: u32, layer: usize) -> &[u32] {
if let Some(ref flat) = self.flat_neighbors {
return flat.neighbors_at(node_id, layer);
}
let node = &self.nodes[node_id as usize];
if layer < node.neighbors.len() {
&node.neighbors[layer]
} else {
&[]
}
}
#[inline]
pub(crate) fn node_num_layers(&self, node_id: u32) -> usize {
if let Some(ref flat) = self.flat_neighbors {
return flat.num_layers(node_id);
}
self.nodes[node_id as usize].neighbors.len()
}
pub(crate) fn ensure_mutable_neighbors(&mut self) {
if let Some(flat) = self.flat_neighbors.take() {
let nested = flat.to_nested(self.nodes.len());
for (i, layers) in nested.into_iter().enumerate() {
self.nodes[i].neighbors = layers;
}
}
}
pub fn export_neighbors(&self) -> Vec<Vec<Vec<u32>>> {
self.nodes.iter().map(|n| n.neighbors.clone()).collect()
}
}