use super::types::*;
use chrono::{DateTime, Utc};
use serde::{Deserialize, Serialize};
use std::collections::HashMap;
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct WhatIfAnalysisResult {
pub timestamp: DateTime<Utc>,
pub base_scenario: Scenario,
pub scenarios: Vec<Scenario>,
pub impact_analysis: ScenarioImpactAnalysis,
pub sensitivity_analysis: FeatureSensitivityAnalysis,
pub counterfactual_insights: Vec<CounterfactualInsight>,
pub decision_boundary_exploration: DecisionBoundaryExploration,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct Scenario {
pub id: String,
pub description: String,
pub features: HashMap<String, f64>,
pub prediction: f64,
pub confidence: f64,
pub changed_features: Vec<FeatureChange>,
pub distance_from_base: f64,
pub plausibility: f64,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct FeatureChange {
pub feature_name: String,
pub original_value: f64,
pub new_value: f64,
pub change_magnitude: f64,
pub change_direction: ChangeDirection,
pub change_type: ChangeType,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct ScenarioImpactAnalysis {
pub high_impact_scenarios: Vec<String>,
pub prediction_flip_scenarios: Vec<String>,
pub avg_prediction_change: f64,
pub max_prediction_change: f64,
pub stability_analysis: PredictionStabilityAnalysis,
pub feature_importance_ranking: Vec<FeatureImportanceRank>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct PredictionStabilityAnalysis {
pub stability_score: f64,
pub prediction_variance: f64,
pub prediction_flips: usize,
pub stability_by_magnitude: HashMap<String, f64>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct FeatureImportanceRank {
pub feature_name: String,
pub importance_score: f64,
pub rank: usize,
pub avg_impact: f64,
pub change_frequency: usize,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct FeatureSensitivityAnalysis {
pub feature_sensitivities: HashMap<String, f64>,
pub most_sensitive_features: Vec<String>,
pub least_sensitive_features: Vec<String>,
pub non_linear_features: Vec<String>,
pub interaction_sensitivities: Vec<FeatureInteractionSensitivity>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct FeatureInteractionSensitivity {
pub feature1: String,
pub feature2: String,
pub sensitivity_score: f64,
pub interaction_type: InteractionType,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct CounterfactualInsight {
pub description: String,
pub required_changes: Vec<FeatureChange>,
pub predicted_outcome: f64,
pub confidence: f64,
pub feasibility: ImplementationFeasibility,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct DecisionBoundaryExploration {
pub boundary_points: Vec<BoundaryPoint>,
pub boundary_complexity: BoundaryComplexity,
pub local_linearity: LocalLinearityAnalysis,
pub crossing_analysis: BoundaryCrossingAnalysis,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct BoundaryPoint {
pub coordinates: HashMap<String, f64>,
pub distance_to_boundary: f64,
pub prediction: f64,
pub gradient_direction: HashMap<String, f64>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct BoundaryComplexity {
pub complexity_score: f64,
pub curvature: f64,
pub inflection_points: usize,
pub complexity_class: ComplexityClass,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct LocalLinearityAnalysis {
pub avg_linearity: f64,
pub linearity_by_region: HashMap<String, f64>,
pub most_linear_regions: Vec<String>,
pub most_nonlinear_regions: Vec<String>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct BoundaryCrossingAnalysis {
pub crossing_count: usize,
pub avg_crossing_distance: f64,
pub crossing_directions: Vec<CrossingDirection>,
pub common_crossing_features: Vec<String>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct CrossingDirection {
pub direction: HashMap<String, f64>,
pub magnitude: f64,
pub frequency: usize,
}