pub struct TreeSlot { /* private fields */ }alloc only.Expand description
Manages the lifecycle of a single tree in the ensemble.
When the drift detector signals DriftSignal::Warning, an alternate tree
begins training alongside the active tree. When DriftSignal::Drift is
confirmed, the alternate replaces the active tree (or a fresh tree is
created if no alternate exists). The drift detector is then reset via
clone_fresh to monitor the new tree.
Implementations§
Source§impl TreeSlot
impl TreeSlot
Sourcepub fn new(
tree_config: TreeConfig,
detector: Box<dyn DriftDetector>,
max_tree_samples: Option<u64>,
) -> Self
pub fn new( tree_config: TreeConfig, detector: Box<dyn DriftDetector>, max_tree_samples: Option<u64>, ) -> Self
Create a new TreeSlot with a fresh tree and drift detector.
The active tree starts as a single-leaf tree (prediction = 0.0). No alternate tree is created until a Warning signal is received.
Sourcepub fn with_shadow_warmup(
tree_config: TreeConfig,
detector: Box<dyn DriftDetector>,
max_tree_samples: Option<u64>,
shadow_warmup: usize,
) -> Self
pub fn with_shadow_warmup( tree_config: TreeConfig, detector: Box<dyn DriftDetector>, max_tree_samples: Option<u64>, shadow_warmup: usize, ) -> Self
Create a new TreeSlot with graduated tree handoff enabled.
When shadow_warmup > 0, an always-on shadow tree is spawned immediately
and trained alongside the active tree. After shadow_warmup samples, the
shadow begins contributing to predict_graduated() predictions.
Sourcepub fn from_trees(
active: HoeffdingTree,
alternate: Option<HoeffdingTree>,
tree_config: TreeConfig,
detector: Box<dyn DriftDetector>,
max_tree_samples: Option<u64>,
) -> Self
pub fn from_trees( active: HoeffdingTree, alternate: Option<HoeffdingTree>, tree_config: TreeConfig, detector: Box<dyn DriftDetector>, max_tree_samples: Option<u64>, ) -> Self
Reconstruct a TreeSlot from pre-built trees and a fresh drift detector.
Used during model deserialization to restore tree state without replaying the training stream.
Sourcepub fn train_and_predict(
&mut self,
features: &[f64],
gradient: f64,
hessian: f64,
) -> f64
pub fn train_and_predict( &mut self, features: &[f64], gradient: f64, hessian: f64, ) -> f64
Train the active tree (and alternate if it exists) on a single sample.
The absolute value of the gradient is fed to the drift detector as an error proxy (gradient = derivative of loss = prediction error signal).
§Returns
The prediction from the active tree before training on this sample. This ensures the prediction reflects only previously seen data, which is critical for unbiased gradient computation in the boosting loop.
§Drift handling
DriftSignal::Stable: no action.DriftSignal::Warning: spawn an alternate tree if one is not already being trained. The alternate receives the same training sample.DriftSignal::Drift: replace the active tree with the alternate (or a fresh tree if no alternate exists). The drift detector is reset viaclone_freshso it monitors the new tree from a clean state.
Sourcepub fn predict(&self, features: &[f64]) -> f64
pub fn predict(&self, features: &[f64]) -> f64
Predict without training.
Routes the feature vector through the active tree and returns the leaf value. Does not update any state.
Sourcepub fn predict_with_variance(&self, features: &[f64]) -> (f64, f64)
pub fn predict_with_variance(&self, features: &[f64]) -> (f64, f64)
Predict with variance for confidence estimation.
Returns (leaf_value, variance) where variance = 1 / (H_sum + lambda).
Sourcepub fn predict_smooth(&self, features: &[f64], bandwidth: f64) -> f64
pub fn predict_smooth(&self, features: &[f64], bandwidth: f64) -> f64
Predict using sigmoid-blended soft routing for smooth interpolation.
See crate::tree::hoeffding::HoeffdingTree::predict_smooth for details.
Sourcepub fn predict_smooth_auto(&self, features: &[f64], bandwidths: &[f64]) -> f64
pub fn predict_smooth_auto(&self, features: &[f64], bandwidths: &[f64]) -> f64
Predict using per-feature auto-calibrated bandwidths.
Sourcepub fn predict_interpolated(&self, features: &[f64]) -> f64
pub fn predict_interpolated(&self, features: &[f64]) -> f64
Predict with parent-leaf linear interpolation.
Sourcepub fn predict_sibling_interpolated(
&self,
features: &[f64],
bandwidths: &[f64],
) -> f64
pub fn predict_sibling_interpolated( &self, features: &[f64], bandwidths: &[f64], ) -> f64
Predict with sibling-based interpolation for feature-continuous predictions.
Sourcepub fn predict_graduated(&self, features: &[f64]) -> f64
pub fn predict_graduated(&self, features: &[f64]) -> f64
Predict with graduated active-shadow blending.
When shadow_warmup > 0, blends the active tree’s prediction with the
shadow’s prediction based on relative maturity:
- Active weight decays from 1.0 to 0.0 as it ages from 80% to 120% of
max_tree_samples - Shadow weight ramps from 0.0 to 1.0 over
shadow_warmupsamples after warmup
When shadow_warmup == 0 or no shadow exists, returns the active prediction.
Sourcepub fn predict_graduated_sibling_interpolated(
&self,
features: &[f64],
bandwidths: &[f64],
) -> f64
pub fn predict_graduated_sibling_interpolated( &self, features: &[f64], bandwidths: &[f64], ) -> f64
Predict with graduated blending + sibling interpolation (premium path).
Combines graduated active-shadow handoff with feature-continuous sibling interpolation for the smoothest possible prediction surface.
Sourcepub fn shadow_warmup(&self) -> usize
pub fn shadow_warmup(&self) -> usize
Shadow warmup configuration (0 = disabled).
Sourcepub fn replacements(&self) -> u64
pub fn replacements(&self) -> u64
Total number of tree replacements (drift or time-based).
Sourcepub fn prediction_mean(&self) -> f64
pub fn prediction_mean(&self) -> f64
Running mean of predictions from the active tree.
Sourcepub fn prediction_std(&self) -> f64
pub fn prediction_std(&self) -> f64
Running standard deviation of predictions from the active tree.
Sourcepub fn n_samples_seen(&self) -> u64
pub fn n_samples_seen(&self) -> u64
Total samples the active tree has seen.
Sourcepub fn has_alternate(&self) -> bool
pub fn has_alternate(&self) -> bool
Whether an alternate tree is currently being trained.
Sourcepub fn split_gains(&self) -> &[f64]
pub fn split_gains(&self) -> &[f64]
Accumulated split gains per feature from the active tree.
Sourcepub fn active_tree(&self) -> &HoeffdingTree
pub fn active_tree(&self) -> &HoeffdingTree
Immutable access to the active tree.
Sourcepub fn alternate_tree(&self) -> Option<&HoeffdingTree>
pub fn alternate_tree(&self) -> Option<&HoeffdingTree>
Immutable access to the alternate tree (if one is being trained).
Sourcepub fn tree_config(&self) -> &TreeConfig
pub fn tree_config(&self) -> &TreeConfig
Immutable access to the tree configuration.
Sourcepub fn detector(&self) -> &dyn DriftDetector
pub fn detector(&self) -> &dyn DriftDetector
Immutable access to the drift detector.
Sourcepub fn detector_mut(&mut self) -> &mut dyn DriftDetector
pub fn detector_mut(&mut self) -> &mut dyn DriftDetector
Mutable access to the drift detector.
Sourcepub fn alt_detector(&self) -> Option<&dyn DriftDetector>
pub fn alt_detector(&self) -> Option<&dyn DriftDetector>
Immutable access to the alternate drift detector (always None in
the current architecture – the alternate tree shares the main detector).
Reserved for future use.
Sourcepub fn alt_detector_mut(&mut self) -> Option<&mut dyn DriftDetector>
pub fn alt_detector_mut(&mut self) -> Option<&mut dyn DriftDetector>
Mutable access to the alternate drift detector.