use serde::{Deserialize, Serialize};
use std::collections::{HashMap, VecDeque};
use std::time::{Duration, Instant, SystemTime};
use super::config::MonitorConfig;
use super::metrics::{CalibrationData, DeviceMetrics};
use super::types::{
AuthenticationType, ComponentStatus, ConnectionStatus, ConnectivityType, DeviceType,
IssueSeverity, IssueType, MaintenanceType, MeasurementBasis, OverallStatus, WarningType,
};
#[allow(dead_code)]
pub struct HardwareMonitor {
pub(crate) device_info: DeviceInfo,
pub(crate) current_status: DeviceStatus,
pub(crate) metrics_history: VecDeque<DeviceMetrics>,
pub(crate) calibration_data: CalibrationData,
pub(crate) monitor_config: MonitorConfig,
pub(crate) last_update: Instant,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct DeviceInfo {
pub device_id: String,
pub device_type: DeviceType,
pub capabilities: DeviceCapabilities,
pub location: LocationInfo,
pub connection: ConnectionInfo,
pub specifications: DeviceSpecifications,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct DeviceCapabilities {
pub num_qubits: usize,
pub supported_gates: Vec<String>,
pub connectivity: ConnectivityGraph,
pub max_circuit_depth: usize,
pub measurement_capabilities: MeasurementCapabilities,
pub error_rates: ErrorRates,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct ConnectivityGraph {
pub adjacency_matrix: Vec<Vec<bool>>,
pub connectivity_type: ConnectivityType,
pub coupling_strengths: HashMap<(usize, usize), f64>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct MeasurementCapabilities {
pub measurement_bases: Vec<MeasurementBasis>,
pub measurement_fidelity: f64,
pub readout_time: Duration,
pub simultaneous_measurements: bool,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct ErrorRates {
pub single_qubit_gate_error: f64,
pub two_qubit_gate_error: f64,
pub measurement_error: f64,
pub decoherence_rates: DecoherenceRates,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct DecoherenceRates {
pub t1_time: Duration,
pub t2_time: Duration,
pub t2_star_time: Duration,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct LocationInfo {
pub physical_location: String,
pub timezone: String,
pub coordinates: Option<(f64, f64)>,
pub network_latency: Duration,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct ConnectionInfo {
pub endpoint: String,
pub auth_type: AuthenticationType,
pub connection_status: ConnectionStatus,
pub api_version: String,
pub rate_limits: RateLimits,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct RateLimits {
pub requests_per_minute: usize,
pub concurrent_requests: usize,
pub data_transfer_limits: DataTransferLimits,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct DataTransferLimits {
pub max_upload_size: usize,
pub max_download_size: usize,
pub bandwidth_limit: usize,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct DeviceSpecifications {
pub operating_temperature: f64,
pub frequency_range: (f64, f64),
pub power_consumption: f64,
pub dimensions: PhysicalDimensions,
pub environmental_requirements: EnvironmentalRequirements,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct PhysicalDimensions {
pub length: f64,
pub width: f64,
pub height: f64,
pub weight: f64,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct EnvironmentalRequirements {
pub temperature_range: (f64, f64),
pub humidity_range: (f64, f64),
pub vibration_tolerance: f64,
pub em_shielding_required: bool,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct DeviceStatus {
pub overall_status: OverallStatus,
pub availability: Availability,
pub current_load: f64,
pub queue_status: QueueStatus,
pub health_indicators: HealthIndicators,
pub last_maintenance: SystemTime,
pub next_maintenance: Option<SystemTime>,
}
impl Default for DeviceStatus {
fn default() -> Self {
Self {
overall_status: OverallStatus::Online,
availability: Availability {
available: true,
expected_available_time: None,
availability_percentage: 0.99,
planned_downtime: vec![],
},
current_load: 0.5,
queue_status: QueueStatus {
jobs_in_queue: 0,
estimated_wait_time: Duration::ZERO,
next_job_position: 0,
processing_rate: 1.0,
},
health_indicators: HealthIndicators {
system_temperature: 22.0,
error_rate: 0.001,
performance_metrics: PerformanceIndicators {
gate_fidelity: 0.99,
measurement_fidelity: 0.95,
coherence_times: DecoherenceRates {
t1_time: Duration::from_micros(100),
t2_time: Duration::from_micros(50),
t2_star_time: Duration::from_micros(30),
},
throughput: 1000.0,
latency: Duration::from_millis(10),
},
component_health: HashMap::new(),
warning_flags: vec![],
},
last_maintenance: SystemTime::now(),
next_maintenance: None,
}
}
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct Availability {
pub available: bool,
pub expected_available_time: Option<SystemTime>,
pub availability_percentage: f64,
pub planned_downtime: Vec<MaintenanceWindow>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct MaintenanceWindow {
pub start_time: SystemTime,
pub end_time: SystemTime,
pub maintenance_type: MaintenanceType,
pub description: String,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct QueueStatus {
pub jobs_in_queue: usize,
pub estimated_wait_time: Duration,
pub next_job_position: usize,
pub processing_rate: f64,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct HealthIndicators {
pub system_temperature: f64,
pub error_rate: f64,
pub performance_metrics: PerformanceIndicators,
pub component_health: HashMap<String, ComponentHealth>,
pub warning_flags: Vec<WarningFlag>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct PerformanceIndicators {
pub gate_fidelity: f64,
pub measurement_fidelity: f64,
pub coherence_times: DecoherenceRates,
pub throughput: f64,
pub latency: Duration,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct ComponentHealth {
pub component_name: String,
pub health_score: f64,
pub status: ComponentStatus,
pub last_checked: SystemTime,
pub issues: Vec<ComponentIssue>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct ComponentIssue {
pub issue_type: IssueType,
pub severity: IssueSeverity,
pub description: String,
pub first_occurrence: SystemTime,
pub frequency: f64,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct WarningFlag {
pub warning_type: WarningType,
pub message: String,
pub timestamp: SystemTime,
pub acknowledged: bool,
}
impl HardwareMonitor {
pub fn new(device_info: DeviceInfo) -> Self {
Self {
device_info,
current_status: DeviceStatus::default(),
metrics_history: VecDeque::new(),
calibration_data: CalibrationData::default(),
monitor_config: MonitorConfig::default(),
last_update: Instant::now(),
}
}
pub fn update_metrics(&mut self) -> Result<(), String> {
use super::metrics::{EnvironmentalMetrics, HardwareMetrics, QuantumMetrics};
let metrics = DeviceMetrics {
timestamp: SystemTime::now(),
cpu_utilization: 0.5,
memory_utilization: 0.6,
network_utilization: 0.3,
hardware_metrics: HardwareMetrics {
temperatures: {
let mut temps = HashMap::new();
temps.insert("cpu".to_string(), 45.0);
temps.insert("quantum_chip".to_string(), 0.01);
temps
},
power_consumption: 150.0,
vibration_levels: HashMap::new(),
magnetic_fields: HashMap::new(),
},
quantum_metrics: QuantumMetrics {
gate_fidelities: HashMap::new(),
measurement_fidelities: HashMap::new(),
coherence_measurements: HashMap::new(),
crosstalk_matrix: None,
},
environmental_metrics: EnvironmentalMetrics {
ambient_temperature: 22.0,
humidity: 45.0,
pressure: 1013.25,
air_quality: None,
},
};
self.metrics_history.push_back(metrics);
if self.metrics_history.len() > 1000 {
self.metrics_history.pop_front();
}
self.last_update = Instant::now();
Ok(())
}
pub fn get_current_status(&self) -> DeviceStatus {
self.current_status.clone()
}
}