trustformers_debug/interpretability/
counterfactual.rs1use chrono::{DateTime, Utc};
7use serde::{Deserialize, Serialize};
8use std::collections::HashMap;
9
10#[derive(Debug, Clone, Serialize, Deserialize)]
12pub struct CounterfactualResult {
13 pub timestamp: DateTime<Utc>,
15 pub counterfactuals: Vec<Counterfactual>,
17 pub quality_metrics: CounterfactualQualityMetrics,
19 pub feature_sensitivity: FeatureSensitivityAnalysis,
21 pub decision_boundary: DecisionBoundaryAnalysis,
23 pub actionable_insights: Vec<ActionableInsight>,
25}
26
27#[derive(Debug, Clone, Serialize, Deserialize)]
29pub struct Counterfactual {
30 pub id: String,
32 pub original_instance: HashMap<String, f64>,
34 pub counterfactual_instance: HashMap<String, f64>,
36 pub changed_features: Vec<FeatureChange>,
38 pub original_prediction: f64,
40 pub counterfactual_prediction: f64,
42 pub distance: f64,
44 pub plausibility: f64,
46 pub actionability: f64,
48}
49
50#[derive(Debug, Clone, Serialize, Deserialize)]
52pub struct FeatureChange {
53 pub feature_name: String,
55 pub original_value: f64,
57 pub new_value: f64,
59 pub change_magnitude: f64,
61 pub change_direction: ChangeDirection,
63 pub change_cost: f64,
65}
66
67#[derive(Debug, Clone, Serialize, Deserialize)]
69pub enum ChangeDirection {
70 Increase,
71 Decrease,
72 Categorical,
73}
74
75#[derive(Debug, Clone, Serialize, Deserialize)]
77pub struct CounterfactualQualityMetrics {
78 pub avg_distance: f64,
80 pub avg_plausibility: f64,
82 pub avg_actionability: f64,
84 pub diversity: f64,
86 pub coverage: f64,
88 pub sparsity: f64,
90}
91
92#[derive(Debug, Clone, Serialize, Deserialize)]
94pub struct FeatureSensitivityAnalysis {
95 pub feature_sensitivities: HashMap<String, f64>,
97 pub most_sensitive: Vec<String>,
99 pub least_sensitive: Vec<String>,
101 pub interaction_effects: Vec<InteractionEffect>,
103 pub threshold_analysis: ThresholdAnalysis,
105}
106
107#[derive(Debug, Clone, Serialize, Deserialize)]
109pub struct InteractionEffect {
110 pub features: Vec<String>,
112 pub effect_magnitude: f64,
114 pub effect_type: InteractionEffectType,
116}
117
118#[derive(Debug, Clone, Serialize, Deserialize)]
120pub enum InteractionEffectType {
121 Synergistic,
123 Antagonistic,
125 Independent,
127}
128
129#[derive(Debug, Clone, Serialize, Deserialize)]
131pub struct ThresholdAnalysis {
132 pub feature_thresholds: HashMap<String, f64>,
134 pub threshold_confidence: HashMap<String, (f64, f64)>,
136 pub critical_features: Vec<String>,
138 pub robust_features: Vec<String>,
140}
141
142#[derive(Debug, Clone, Serialize, Deserialize)]
144pub struct DecisionBoundaryAnalysis {
145 pub boundary_curvature: f64,
147 pub boundary_complexity: f64,
149 pub distance_to_boundary: f64,
151 pub crossing_points: Vec<BoundaryCrossingPoint>,
153 pub local_linearity: f64,
155}
156
157#[derive(Debug, Clone, Serialize, Deserialize)]
159pub struct BoundaryCrossingPoint {
160 pub coordinates: HashMap<String, f64>,
162 pub distance: f64,
164 pub boundary_prediction: f64,
166 pub crossing_direction: Vec<f64>,
168}
169
170#[derive(Debug, Clone, Serialize, Deserialize)]
172pub struct ActionableInsight {
173 pub description: String,
175 pub required_changes: Vec<FeatureChange>,
177 pub expected_outcome: f64,
179 pub confidence: f64,
181 pub difficulty: ImplementationDifficulty,
183 pub time_horizon: TimeHorizon,
185}
186
187#[derive(Debug, Clone, Serialize, Deserialize)]
189pub enum ImplementationDifficulty {
190 Easy,
191 Moderate,
192 Hard,
193 VeryHard,
194 Impossible,
195}
196
197#[derive(Debug, Clone, Serialize, Deserialize)]
199pub enum TimeHorizon {
200 Immediate,
201 ShortTerm,
202 MediumTerm,
203 LongTerm,
204}