1use serde::{Deserialize, Serialize};
6use std::collections::{HashMap, VecDeque};
7use std::time::{Duration, Instant, SystemTime};
8
9use super::config::MonitorConfig;
10use super::metrics::{CalibrationData, DeviceMetrics};
11use super::types::{
12 AuthenticationType, ComponentStatus, ConnectionStatus, ConnectivityType, DeviceType,
13 IssueSeverity, IssueType, MaintenanceType, MeasurementBasis, OverallStatus, WarningType,
14};
15
16#[allow(dead_code)]
18pub struct HardwareMonitor {
19 pub(crate) device_info: DeviceInfo,
21 pub(crate) current_status: DeviceStatus,
23 pub(crate) metrics_history: VecDeque<DeviceMetrics>,
25 pub(crate) calibration_data: CalibrationData,
27 pub(crate) monitor_config: MonitorConfig,
29 pub(crate) last_update: Instant,
31}
32
33#[derive(Debug, Clone, Serialize, Deserialize)]
35pub struct DeviceInfo {
36 pub device_id: String,
38 pub device_type: DeviceType,
40 pub capabilities: DeviceCapabilities,
42 pub location: LocationInfo,
44 pub connection: ConnectionInfo,
46 pub specifications: DeviceSpecifications,
48}
49
50#[derive(Debug, Clone, Serialize, Deserialize)]
52pub struct DeviceCapabilities {
53 pub num_qubits: usize,
55 pub supported_gates: Vec<String>,
57 pub connectivity: ConnectivityGraph,
59 pub max_circuit_depth: usize,
61 pub measurement_capabilities: MeasurementCapabilities,
63 pub error_rates: ErrorRates,
65}
66
67#[derive(Debug, Clone, Serialize, Deserialize)]
69pub struct ConnectivityGraph {
70 pub adjacency_matrix: Vec<Vec<bool>>,
72 pub connectivity_type: ConnectivityType,
74 pub coupling_strengths: HashMap<(usize, usize), f64>,
76}
77
78#[derive(Debug, Clone, Serialize, Deserialize)]
80pub struct MeasurementCapabilities {
81 pub measurement_bases: Vec<MeasurementBasis>,
83 pub measurement_fidelity: f64,
85 pub readout_time: Duration,
87 pub simultaneous_measurements: bool,
89}
90
91#[derive(Debug, Clone, Serialize, Deserialize)]
93pub struct ErrorRates {
94 pub single_qubit_gate_error: f64,
96 pub two_qubit_gate_error: f64,
98 pub measurement_error: f64,
100 pub decoherence_rates: DecoherenceRates,
102}
103
104#[derive(Debug, Clone, Serialize, Deserialize)]
106pub struct DecoherenceRates {
107 pub t1_time: Duration,
109 pub t2_time: Duration,
111 pub t2_star_time: Duration,
113}
114
115#[derive(Debug, Clone, Serialize, Deserialize)]
117pub struct LocationInfo {
118 pub physical_location: String,
120 pub timezone: String,
122 pub coordinates: Option<(f64, f64)>,
124 pub network_latency: Duration,
126}
127
128#[derive(Debug, Clone, Serialize, Deserialize)]
130pub struct ConnectionInfo {
131 pub endpoint: String,
133 pub auth_type: AuthenticationType,
135 pub connection_status: ConnectionStatus,
137 pub api_version: String,
139 pub rate_limits: RateLimits,
141}
142
143#[derive(Debug, Clone, Serialize, Deserialize)]
145pub struct RateLimits {
146 pub requests_per_minute: usize,
148 pub concurrent_requests: usize,
150 pub data_transfer_limits: DataTransferLimits,
152}
153
154#[derive(Debug, Clone, Serialize, Deserialize)]
156pub struct DataTransferLimits {
157 pub max_upload_size: usize,
159 pub max_download_size: usize,
161 pub bandwidth_limit: usize,
163}
164
165#[derive(Debug, Clone, Serialize, Deserialize)]
167pub struct DeviceSpecifications {
168 pub operating_temperature: f64,
170 pub frequency_range: (f64, f64),
172 pub power_consumption: f64,
174 pub dimensions: PhysicalDimensions,
176 pub environmental_requirements: EnvironmentalRequirements,
178}
179
180#[derive(Debug, Clone, Serialize, Deserialize)]
182pub struct PhysicalDimensions {
183 pub length: f64,
185 pub width: f64,
187 pub height: f64,
189 pub weight: f64,
191}
192
193#[derive(Debug, Clone, Serialize, Deserialize)]
195pub struct EnvironmentalRequirements {
196 pub temperature_range: (f64, f64),
198 pub humidity_range: (f64, f64),
200 pub vibration_tolerance: f64,
202 pub em_shielding_required: bool,
204}
205
206#[derive(Debug, Clone, Serialize, Deserialize)]
208pub struct DeviceStatus {
209 pub overall_status: OverallStatus,
211 pub availability: Availability,
213 pub current_load: f64,
215 pub queue_status: QueueStatus,
217 pub health_indicators: HealthIndicators,
219 pub last_maintenance: SystemTime,
221 pub next_maintenance: Option<SystemTime>,
223}
224
225impl Default for DeviceStatus {
226 fn default() -> Self {
227 Self {
228 overall_status: OverallStatus::Online,
229 availability: Availability {
230 available: true,
231 expected_available_time: None,
232 availability_percentage: 0.99,
233 planned_downtime: vec![],
234 },
235 current_load: 0.5,
236 queue_status: QueueStatus {
237 jobs_in_queue: 0,
238 estimated_wait_time: Duration::ZERO,
239 next_job_position: 0,
240 processing_rate: 1.0,
241 },
242 health_indicators: HealthIndicators {
243 system_temperature: 22.0,
244 error_rate: 0.001,
245 performance_metrics: PerformanceIndicators {
246 gate_fidelity: 0.99,
247 measurement_fidelity: 0.95,
248 coherence_times: DecoherenceRates {
249 t1_time: Duration::from_micros(100),
250 t2_time: Duration::from_micros(50),
251 t2_star_time: Duration::from_micros(30),
252 },
253 throughput: 1000.0,
254 latency: Duration::from_millis(10),
255 },
256 component_health: HashMap::new(),
257 warning_flags: vec![],
258 },
259 last_maintenance: SystemTime::now(),
260 next_maintenance: None,
261 }
262 }
263}
264
265#[derive(Debug, Clone, Serialize, Deserialize)]
267pub struct Availability {
268 pub available: bool,
270 pub expected_available_time: Option<SystemTime>,
272 pub availability_percentage: f64,
274 pub planned_downtime: Vec<MaintenanceWindow>,
276}
277
278#[derive(Debug, Clone, Serialize, Deserialize)]
280pub struct MaintenanceWindow {
281 pub start_time: SystemTime,
283 pub end_time: SystemTime,
285 pub maintenance_type: MaintenanceType,
287 pub description: String,
289}
290
291#[derive(Debug, Clone, Serialize, Deserialize)]
293pub struct QueueStatus {
294 pub jobs_in_queue: usize,
296 pub estimated_wait_time: Duration,
298 pub next_job_position: usize,
300 pub processing_rate: f64,
302}
303
304#[derive(Debug, Clone, Serialize, Deserialize)]
306pub struct HealthIndicators {
307 pub system_temperature: f64,
309 pub error_rate: f64,
311 pub performance_metrics: PerformanceIndicators,
313 pub component_health: HashMap<String, ComponentHealth>,
315 pub warning_flags: Vec<WarningFlag>,
317}
318
319#[derive(Debug, Clone, Serialize, Deserialize)]
321pub struct PerformanceIndicators {
322 pub gate_fidelity: f64,
324 pub measurement_fidelity: f64,
326 pub coherence_times: DecoherenceRates,
328 pub throughput: f64,
330 pub latency: Duration,
332}
333
334#[derive(Debug, Clone, Serialize, Deserialize)]
336pub struct ComponentHealth {
337 pub component_name: String,
339 pub health_score: f64,
341 pub status: ComponentStatus,
343 pub last_checked: SystemTime,
345 pub issues: Vec<ComponentIssue>,
347}
348
349#[derive(Debug, Clone, Serialize, Deserialize)]
351pub struct ComponentIssue {
352 pub issue_type: IssueType,
354 pub severity: IssueSeverity,
356 pub description: String,
358 pub first_occurrence: SystemTime,
360 pub frequency: f64,
362}
363
364#[derive(Debug, Clone, Serialize, Deserialize)]
366pub struct WarningFlag {
367 pub warning_type: WarningType,
369 pub message: String,
371 pub timestamp: SystemTime,
373 pub acknowledged: bool,
375}
376
377impl HardwareMonitor {
379 pub fn new(device_info: DeviceInfo) -> Self {
381 Self {
382 device_info,
383 current_status: DeviceStatus::default(),
384 metrics_history: VecDeque::new(),
385 calibration_data: CalibrationData::default(),
386 monitor_config: MonitorConfig::default(),
387 last_update: Instant::now(),
388 }
389 }
390
391 pub fn update_metrics(&mut self) -> Result<(), String> {
393 use super::metrics::{EnvironmentalMetrics, HardwareMetrics, QuantumMetrics};
394
395 let metrics = DeviceMetrics {
397 timestamp: SystemTime::now(),
398 cpu_utilization: 0.5,
399 memory_utilization: 0.6,
400 network_utilization: 0.3,
401 hardware_metrics: HardwareMetrics {
402 temperatures: {
403 let mut temps = HashMap::new();
404 temps.insert("cpu".to_string(), 45.0);
405 temps.insert("quantum_chip".to_string(), 0.01);
406 temps
407 },
408 power_consumption: 150.0,
409 vibration_levels: HashMap::new(),
410 magnetic_fields: HashMap::new(),
411 },
412 quantum_metrics: QuantumMetrics {
413 gate_fidelities: HashMap::new(),
414 measurement_fidelities: HashMap::new(),
415 coherence_measurements: HashMap::new(),
416 crosstalk_matrix: None,
417 },
418 environmental_metrics: EnvironmentalMetrics {
419 ambient_temperature: 22.0,
420 humidity: 45.0,
421 pressure: 1013.25,
422 air_quality: None,
423 },
424 };
425
426 self.metrics_history.push_back(metrics);
427 if self.metrics_history.len() > 1000 {
428 self.metrics_history.pop_front();
429 }
430
431 self.last_update = Instant::now();
432 Ok(())
433 }
434
435 pub fn get_current_status(&self) -> DeviceStatus {
437 self.current_status.clone()
438 }
439}