weavatrix-search-vector 0.3.1

Persistent, mutable, bounded vector candidate search for Rust and Weavatrix
Documentation
use super::SearchScratch;
use crate::error::SearchError;
use std::collections::BinaryHeap;

impl SearchScratch {
    pub(super) fn new(nodes: usize) -> Result<Self, SearchError> {
        let mut marks = Vec::new();
        marks
            .try_reserve_exact(nodes)
            .map_err(|_| SearchError::AllocationFailed)?;
        marks.resize(nodes, 0);
        Ok(Self {
            marks,
            generation: 0,
            candidates: BinaryHeap::new(),
            results: BinaryHeap::new(),
            routing_probes: Vec::new(),
            routing_probe_heap: BinaryHeap::new(),
            routing_nodes: Vec::new(),
            merged: Vec::new(),
        })
    }

    pub(super) fn begin(&mut self) {
        self.candidates.clear();
        self.results.clear();
        if self.generation == u32::MAX {
            self.marks.fill(0);
            self.generation = 1;
        } else {
            self.generation += 1;
        }
    }

    pub(super) fn mark(&mut self, index: usize) -> bool {
        if self.marks[index] == self.generation {
            false
        } else {
            self.marks[index] = self.generation;
            true
        }
    }
}