use scirs2_core::ndarray::{Array1, Array2};
use serde::{Deserialize, Serialize};
use std::collections::{HashMap, VecDeque};
use std::time::{Duration, SystemTime};
use super::hardware::DecoherenceRates;
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct DeviceMetrics {
pub timestamp: SystemTime,
pub cpu_utilization: f64,
pub memory_utilization: f64,
pub network_utilization: f64,
pub hardware_metrics: HardwareMetrics,
pub quantum_metrics: QuantumMetrics,
pub environmental_metrics: EnvironmentalMetrics,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct HardwareMetrics {
pub temperatures: HashMap<String, f64>,
pub power_consumption: f64,
pub vibration_levels: HashMap<String, f64>,
pub magnetic_fields: HashMap<String, f64>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct QuantumMetrics {
pub gate_fidelities: HashMap<String, f64>,
pub measurement_fidelities: HashMap<usize, f64>,
pub coherence_measurements: HashMap<usize, DecoherenceRates>,
pub crosstalk_matrix: Option<Array2<f64>>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct EnvironmentalMetrics {
pub ambient_temperature: f64,
pub humidity: f64,
pub pressure: f64,
pub air_quality: Option<f64>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct CalibrationData {
pub last_calibration: SystemTime,
pub calibration_results: CalibrationResults,
pub calibration_schedule: CalibrationSchedule,
pub drift_monitoring: DriftMonitoring,
}
impl Default for CalibrationData {
fn default() -> Self {
Self {
last_calibration: SystemTime::now(),
calibration_results: CalibrationResults {
gate_calibrations: HashMap::new(),
measurement_calibrations: HashMap::new(),
crosstalk_calibration: None,
overall_score: 0.95,
},
calibration_schedule: CalibrationSchedule {
regular_interval: Duration::from_secs(24 * 3600), next_calibration: SystemTime::now() + Duration::from_secs(24 * 3600),
trigger_conditions: vec![],
maintenance_integration: true,
},
drift_monitoring: DriftMonitoring {
drift_parameters: HashMap::new(),
prediction_model: None,
drift_thresholds: HashMap::new(),
},
}
}
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct CalibrationResults {
pub gate_calibrations: HashMap<String, GateCalibration>,
pub measurement_calibrations: HashMap<usize, MeasurementCalibration>,
pub crosstalk_calibration: Option<CrosstalkCalibration>,
pub overall_score: f64,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct GateCalibration {
pub gate_name: String,
pub target_qubits: Vec<usize>,
pub fidelity: f64,
pub parameters: HashMap<String, f64>,
pub calibration_time: Duration,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct MeasurementCalibration {
pub qubit_index: usize,
pub fidelity: f64,
pub readout_parameters: ReadoutParameters,
pub calibration_matrices: Option<Array2<f64>>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct ReadoutParameters {
pub pulse_parameters: HashMap<String, f64>,
pub integration_weights: Option<Array1<f64>>,
pub discrimination_threshold: f64,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct CrosstalkCalibration {
pub crosstalk_matrix: Array2<f64>,
pub mitigation_strategy: CrosstalkMitigation,
pub effectiveness_score: f64,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub enum CrosstalkMitigation {
None,
StaticCompensation,
DynamicCompensation,
PostProcessing,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct CalibrationSchedule {
pub regular_interval: Duration,
pub next_calibration: SystemTime,
pub trigger_conditions: Vec<CalibrationTrigger>,
pub maintenance_integration: bool,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub enum CalibrationTrigger {
TimeInterval(Duration),
PerformanceDegradation(f64),
EnvironmentalChange(f64),
UserRequest,
MaintenanceEvent,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct DriftMonitoring {
pub drift_parameters: HashMap<String, DriftParameter>,
pub prediction_model: Option<DriftPredictionModel>,
pub drift_thresholds: HashMap<String, f64>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct DriftParameter {
pub parameter_name: String,
pub current_value: f64,
pub baseline_value: f64,
pub drift_rate: f64,
pub value_history: VecDeque<(SystemTime, f64)>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct DriftPredictionModel {
pub model_type: String,
pub parameters: HashMap<String, f64>,
pub accuracy: f64,
pub last_update: SystemTime,
}