capability_feature_measurement/
level_skipping.rs

1// ---------------- [ File: capability-feature-measurement/src/level_skipping.rs ]
2crate::ix!();
3
4/// ---------------------------------------------------------------------------
5/// 6) Level Skipping
6/// ---------------------------------------------------------------------------
7
8/// Exposes how many nodes at each level are leaves, so we can compare to the config skip probabilities.
9pub trait TreeLevelSkippingMeasurer {
10    /// For each level, returns stats about how many nodes exist vs. how many are leaves.
11    fn measure_tree_level_skipping(&self) -> HashMap<u8, TreeLevelSkippingStats>;
12}
13
14/// Describes skip-related stats at a given level. No public fields.
15#[derive(Debug, Clone, PartialEq, Builder, Getters)]
16#[builder(pattern = "owned", setter(into), build_fn(skip))]
17#[getset(get = "pub")]
18pub struct TreeLevelSkippingStats {
19    #[builder(default)]
20    level: u8,
21
22    #[builder(default)]
23    total_node_count: u64,
24
25    #[builder(default)]
26    total_leaf_count: u64,
27}
28
29impl Default for TreeLevelSkippingStats {
30    fn default() -> Self {
31        Self {
32            level: 0,
33            total_node_count: 0,
34            total_leaf_count: 0,
35        }
36    }
37}
38
39impl TreeLevelSkippingStatsBuilder {
40    pub fn build(&self) -> Result<TreeLevelSkippingStats, derive_builder::UninitializedFieldError> {
41        let stats = TreeLevelSkippingStats {
42            level: self.level.unwrap_or_default(),
43            total_node_count: self.total_node_count.unwrap_or_default(),
44            total_leaf_count: self.total_leaf_count.unwrap_or_default(),
45        };
46        Ok(stats)
47    }
48}