Skip to main content

weavatrix_graph/traversal_cache/
ergonomics.rs

1use super::{TraversalCache, TraversalStorage};
2use crate::{Graph, Topology};
3
4impl Topology {
5    /// Derives a speed-oriented traversal cache and compresses it when useful.
6    #[must_use]
7    pub fn traversal_cache(&self) -> TraversalCache {
8        TraversalCache::from_topology(self)
9    }
10
11    /// Derives a traversal cache with an explicit speed/space policy.
12    #[must_use]
13    pub fn traversal_cache_with(&self, storage: TraversalStorage) -> TraversalCache {
14        TraversalCache::with_storage(self, storage)
15    }
16}
17
18impl Graph {
19    /// Derives an optional traversal cache without changing evidence storage.
20    #[must_use]
21    pub fn traversal_cache(&self) -> TraversalCache {
22        self.topology().traversal_cache()
23    }
24
25    /// Derives a traversal cache with an explicit speed/space policy.
26    #[must_use]
27    pub fn traversal_cache_with(&self, storage: TraversalStorage) -> TraversalCache {
28        self.topology().traversal_cache_with(storage)
29    }
30}
31
32impl TraversalCache {
33    /// Encoded bytes saved against a dual direct-`u32` traversal CSR.
34    #[must_use]
35    pub fn storage_savings_bytes(&self) -> usize {
36        self.fast_equivalent_bytes()
37            .saturating_sub(self.storage_bytes())
38    }
39
40    /// Encoded cache size divided by the equivalent direct cache size.
41    #[must_use]
42    #[allow(clippy::cast_precision_loss)]
43    pub fn storage_ratio(&self) -> f64 {
44        let direct = self.fast_equivalent_bytes();
45        if direct == 0 {
46            1.0
47        } else {
48            self.storage_bytes() as f64 / direct as f64
49        }
50    }
51}
52
53impl From<&Topology> for TraversalCache {
54    fn from(topology: &Topology) -> Self {
55        Self::from_topology(topology)
56    }
57}
58
59impl From<&Graph> for TraversalCache {
60    fn from(graph: &Graph) -> Self {
61        graph.traversal_cache()
62    }
63}