trustformers_debug/simulation_tools/
what_if_analysis.rs

1//! What-If Analysis for Model Behavior Exploration
2//!
3//! This module provides comprehensive what-if analysis capabilities including
4//! scenario generation, feature sensitivity analysis, counterfactual insights,
5//! and decision boundary exploration.
6
7use super::types::*;
8use chrono::{DateTime, Utc};
9use serde::{Deserialize, Serialize};
10use std::collections::HashMap;
11
12/// What-if analysis result
13#[derive(Debug, Clone, Serialize, Deserialize)]
14pub struct WhatIfAnalysisResult {
15    /// Analysis timestamp
16    pub timestamp: DateTime<Utc>,
17    /// Base scenario (original input)
18    pub base_scenario: Scenario,
19    /// Generated what-if scenarios
20    pub scenarios: Vec<Scenario>,
21    /// Scenario impact analysis
22    pub impact_analysis: ScenarioImpactAnalysis,
23    /// Feature sensitivity analysis
24    pub sensitivity_analysis: FeatureSensitivityAnalysis,
25    /// Counterfactual insights
26    pub counterfactual_insights: Vec<CounterfactualInsight>,
27    /// Decision boundary exploration
28    pub decision_boundary_exploration: DecisionBoundaryExploration,
29}
30
31/// Individual scenario for what-if analysis
32#[derive(Debug, Clone, Serialize, Deserialize)]
33pub struct Scenario {
34    /// Scenario ID
35    pub id: String,
36    /// Scenario description
37    pub description: String,
38    /// Input features for this scenario
39    pub features: HashMap<String, f64>,
40    /// Model prediction for this scenario
41    pub prediction: f64,
42    /// Prediction confidence
43    pub confidence: f64,
44    /// Changed features from base scenario
45    pub changed_features: Vec<FeatureChange>,
46    /// Distance from base scenario
47    pub distance_from_base: f64,
48    /// Scenario plausibility
49    pub plausibility: f64,
50}
51
52/// Change made to a feature in a scenario
53#[derive(Debug, Clone, Serialize, Deserialize)]
54pub struct FeatureChange {
55    /// Feature name
56    pub feature_name: String,
57    /// Original value
58    pub original_value: f64,
59    /// New value
60    pub new_value: f64,
61    /// Change magnitude
62    pub change_magnitude: f64,
63    /// Change direction
64    pub change_direction: ChangeDirection,
65    /// Change type
66    pub change_type: ChangeType,
67}
68
69/// Analysis of scenario impacts
70#[derive(Debug, Clone, Serialize, Deserialize)]
71pub struct ScenarioImpactAnalysis {
72    /// Most impactful scenarios
73    pub high_impact_scenarios: Vec<String>,
74    /// Scenarios with prediction flips
75    pub prediction_flip_scenarios: Vec<String>,
76    /// Average prediction change
77    pub avg_prediction_change: f64,
78    /// Maximum prediction change
79    pub max_prediction_change: f64,
80    /// Prediction stability analysis
81    pub stability_analysis: PredictionStabilityAnalysis,
82    /// Feature importance ranking from scenarios
83    pub feature_importance_ranking: Vec<FeatureImportanceRank>,
84}
85
86/// Analysis of prediction stability across scenarios
87#[derive(Debug, Clone, Serialize, Deserialize)]
88pub struct PredictionStabilityAnalysis {
89    /// Stability score (0-1, higher is more stable)
90    pub stability_score: f64,
91    /// Prediction variance across scenarios
92    pub prediction_variance: f64,
93    /// Number of prediction flips
94    pub prediction_flips: usize,
95    /// Stability by feature change magnitude
96    pub stability_by_magnitude: HashMap<String, f64>,
97}
98
99/// Feature importance rank from scenario analysis
100#[derive(Debug, Clone, Serialize, Deserialize)]
101pub struct FeatureImportanceRank {
102    /// Feature name
103    pub feature_name: String,
104    /// Importance score
105    pub importance_score: f64,
106    /// Rank (1 = most important)
107    pub rank: usize,
108    /// Average impact when changed
109    pub avg_impact: f64,
110    /// Number of scenarios where this feature was changed
111    pub change_frequency: usize,
112}
113
114/// Feature sensitivity analysis from what-if scenarios
115#[derive(Debug, Clone, Serialize, Deserialize)]
116pub struct FeatureSensitivityAnalysis {
117    /// Sensitivity scores for each feature
118    pub feature_sensitivities: HashMap<String, f64>,
119    /// Most sensitive features
120    pub most_sensitive_features: Vec<String>,
121    /// Least sensitive features
122    pub least_sensitive_features: Vec<String>,
123    /// Non-linear sensitivity detection
124    pub non_linear_features: Vec<String>,
125    /// Feature interaction sensitivities
126    pub interaction_sensitivities: Vec<FeatureInteractionSensitivity>,
127}
128
129/// Sensitivity of feature interactions
130#[derive(Debug, Clone, Serialize, Deserialize)]
131pub struct FeatureInteractionSensitivity {
132    /// First feature
133    pub feature1: String,
134    /// Second feature
135    pub feature2: String,
136    /// Interaction sensitivity score
137    pub sensitivity_score: f64,
138    /// Interaction type
139    pub interaction_type: InteractionType,
140}
141
142/// Counterfactual insight from what-if analysis
143#[derive(Debug, Clone, Serialize, Deserialize)]
144pub struct CounterfactualInsight {
145    /// Insight description
146    pub description: String,
147    /// Required feature changes for desired outcome
148    pub required_changes: Vec<FeatureChange>,
149    /// Predicted outcome
150    pub predicted_outcome: f64,
151    /// Confidence in prediction
152    pub confidence: f64,
153    /// Implementation feasibility
154    pub feasibility: ImplementationFeasibility,
155}
156
157/// Decision boundary exploration from what-if analysis
158#[derive(Debug, Clone, Serialize, Deserialize)]
159pub struct DecisionBoundaryExploration {
160    /// Points near decision boundary
161    pub boundary_points: Vec<BoundaryPoint>,
162    /// Boundary complexity assessment
163    pub boundary_complexity: BoundaryComplexity,
164    /// Local linearity analysis
165    pub local_linearity: LocalLinearityAnalysis,
166    /// Boundary crossing analysis
167    pub crossing_analysis: BoundaryCrossingAnalysis,
168}
169
170/// Point near decision boundary
171#[derive(Debug, Clone, Serialize, Deserialize)]
172pub struct BoundaryPoint {
173    /// Point coordinates
174    pub coordinates: HashMap<String, f64>,
175    /// Distance to boundary
176    pub distance_to_boundary: f64,
177    /// Prediction at this point
178    pub prediction: f64,
179    /// Gradient direction
180    pub gradient_direction: HashMap<String, f64>,
181}
182
183/// Assessment of decision boundary complexity
184#[derive(Debug, Clone, Serialize, Deserialize)]
185pub struct BoundaryComplexity {
186    /// Complexity score
187    pub complexity_score: f64,
188    /// Boundary curvature
189    pub curvature: f64,
190    /// Number of inflection points
191    pub inflection_points: usize,
192    /// Complexity classification
193    pub complexity_class: ComplexityClass,
194}
195
196/// Local linearity analysis of decision boundary
197#[derive(Debug, Clone, Serialize, Deserialize)]
198pub struct LocalLinearityAnalysis {
199    /// Average local linearity score
200    pub avg_linearity: f64,
201    /// Linearity by region
202    pub linearity_by_region: HashMap<String, f64>,
203    /// Most linear regions
204    pub most_linear_regions: Vec<String>,
205    /// Most non-linear regions
206    pub most_nonlinear_regions: Vec<String>,
207}
208
209/// Analysis of decision boundary crossings
210#[derive(Debug, Clone, Serialize, Deserialize)]
211pub struct BoundaryCrossingAnalysis {
212    /// Number of boundary crossings found
213    pub crossing_count: usize,
214    /// Average crossing distance
215    pub avg_crossing_distance: f64,
216    /// Crossing directions
217    pub crossing_directions: Vec<CrossingDirection>,
218    /// Most common crossing features
219    pub common_crossing_features: Vec<String>,
220}
221
222/// Direction of boundary crossing
223#[derive(Debug, Clone, Serialize, Deserialize)]
224pub struct CrossingDirection {
225    /// Direction vector
226    pub direction: HashMap<String, f64>,
227    /// Direction magnitude
228    pub magnitude: f64,
229    /// Frequency of this direction
230    pub frequency: usize,
231}