use chrono::{DateTime, Utc};
use serde::{Deserialize, Serialize};
use std::collections::HashMap;
use super::config::AttributionMethod;
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct FeatureAttributionResult {
pub timestamp: DateTime<Utc>,
pub attribution_by_method: HashMap<AttributionMethod, AttributionMethodResult>,
pub consensus_attribution: Vec<FeatureAttribution>,
pub method_agreement: MethodAgreementAnalysis,
pub top_features: Vec<TopFeature>,
pub visualization_data: AttributionVisualizationData,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct AttributionMethodResult {
pub method: AttributionMethod,
pub attributions: Vec<FeatureAttribution>,
pub method_parameters: HashMap<String, f64>,
pub reliability_score: f64,
pub computation_time_ms: f64,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct FeatureAttribution {
pub feature_id: String,
pub feature_name: String,
pub attribution_value: f64,
pub confidence: f64,
pub feature_value: f64,
pub normalized_attribution: f64,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct MethodAgreementAnalysis {
pub method_correlations: HashMap<(AttributionMethod, AttributionMethod), f64>,
pub overall_agreement: f64,
pub consistent_features: Vec<String>,
pub divergent_features: Vec<String>,
pub method_reliability: Vec<(AttributionMethod, f64)>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct TopFeature {
pub feature: FeatureAttribution,
pub overall_rank: usize,
pub method_ranks: HashMap<AttributionMethod, usize>,
pub stability: f64,
pub interpretation: String,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct AttributionVisualizationData {
pub heatmap_data: Vec<Vec<f64>>,
pub feature_names: Vec<String>,
pub method_names: Vec<String>,
pub timeline_data: Option<Vec<TimelinePoint>>,
pub interaction_data: Vec<FeatureInteraction>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct TimelinePoint {
pub time_point: usize,
pub attributions: Vec<FeatureAttribution>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct FeatureInteraction {
pub feature1: String,
pub feature2: String,
pub interaction_strength: f64,
pub interaction_type: InteractionType,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub enum InteractionType {
Positive,
Negative,
Conditional,
Independent,
}