Skip to main content

entrenar/monitor/inference/counterfactual/
feature_change.rs

1//! Feature change tracking for counterfactual explanations.
2
3use serde::{Deserialize, Serialize};
4
5/// A single feature change in a counterfactual
6#[derive(Clone, Debug, Serialize, Deserialize)]
7pub struct FeatureChange {
8    /// Feature index
9    pub feature_idx: usize,
10    /// Optional human-readable feature name
11    pub feature_name: Option<String>,
12    /// Original value
13    pub original_value: f32,
14    /// Counterfactual value (value that would flip the decision)
15    pub counterfactual_value: f32,
16    /// Change amount (counterfactual - original)
17    pub delta: f32,
18}
19
20impl FeatureChange {
21    /// Create a new feature change
22    pub fn new(feature_idx: usize, original: f32, counterfactual: f32) -> Self {
23        Self {
24            feature_idx,
25            feature_name: None,
26            original_value: original,
27            counterfactual_value: counterfactual,
28            delta: counterfactual - original,
29        }
30    }
31
32    /// Set the feature name
33    pub fn with_name(mut self, name: impl Into<String>) -> Self {
34        self.feature_name = Some(name.into());
35        self
36    }
37
38    /// Get the absolute change
39    pub fn abs_delta(&self) -> f32 {
40        self.delta.abs()
41    }
42}