quantrs2_device/mid_circuit_measurements/
executor.rs

1//! Main executor for mid-circuit measurements
2
3use std::collections::{HashMap, VecDeque};
4use std::sync::{Arc, RwLock};
5use std::time::{Duration, Instant};
6
7use quantrs2_circuit::{
8    classical::{ClassicalCondition, ClassicalValue, ComparisonOp},
9    measurement::{CircuitOp, FeedForward, Measurement, MeasurementCircuit},
10};
11use quantrs2_core::{error::QuantRS2Result, gate::GateOp, qubit::QubitId};
12use tokio::sync::Mutex as AsyncMutex;
13
14use crate::{
15    calibration::CalibrationManager,
16    translation::{GateTranslator, HardwareBackend},
17    DeviceError, DeviceResult,
18};
19
20use super::analytics::AdvancedAnalyticsEngine;
21use super::config::MidCircuitConfig;
22use super::ml::{AdaptiveMeasurementManager, MLOptimizer, MeasurementPredictor};
23use super::monitoring::{OptimizationCache, PerformanceMonitor};
24use super::results::*;
25
26/// Trait for device-specific mid-circuit measurement execution
27#[async_trait::async_trait]
28pub trait MidCircuitDeviceExecutor {
29    /// Get device identifier
30    fn device_id(&self) -> &str;
31
32    /// Execute a quantum gate
33    async fn execute_gate(&self, gate: &dyn GateOp) -> DeviceResult<()>;
34
35    /// Measure a specific qubit
36    async fn measure_qubit(&self, qubit: QubitId) -> DeviceResult<u8>;
37
38    /// Measure all qubits
39    async fn measure_all(&self) -> DeviceResult<HashMap<String, usize>>;
40
41    /// Synchronize execution (barrier)
42    async fn synchronize(&self) -> DeviceResult<()>;
43
44    /// Reset a qubit to |0⟩ state
45    async fn reset_qubit(&self, qubit: QubitId) -> DeviceResult<()>;
46}
47
48/// Validation result for circuits
49#[derive(Debug, Clone)]
50pub struct ValidationResult {
51    pub is_valid: bool,
52    pub warnings: Vec<String>,
53    pub errors: Vec<String>,
54    pub recommendations: Vec<String>,
55}
56
57/// Advanced SciRS2-powered mid-circuit measurement executor
58pub struct MidCircuitExecutor {
59    config: MidCircuitConfig,
60    calibration_manager: CalibrationManager,
61    capabilities: Option<MidCircuitCapabilities>,
62    gate_translator: GateTranslator,
63
64    // Advanced analytics components
65    analytics_engine: Arc<RwLock<AdvancedAnalyticsEngine>>,
66    ml_optimizer: Arc<AsyncMutex<MLOptimizer>>,
67    predictor: Arc<AsyncMutex<MeasurementPredictor>>,
68    adaptive_manager: Arc<AsyncMutex<AdaptiveMeasurementManager>>,
69
70    // Performance monitoring
71    performance_monitor: Arc<RwLock<PerformanceMonitor>>,
72    measurement_history: Arc<RwLock<VecDeque<MeasurementEvent>>>,
73    optimization_cache: Arc<RwLock<OptimizationCache>>,
74}
75
76impl MidCircuitExecutor {
77    /// Create a new advanced mid-circuit measurement executor
78    pub fn new(config: MidCircuitConfig, calibration_manager: CalibrationManager) -> Self {
79        Self {
80            config: config.clone(),
81            calibration_manager,
82            capabilities: None,
83            gate_translator: GateTranslator::new(),
84            analytics_engine: Arc::new(RwLock::new(AdvancedAnalyticsEngine::new(
85                &config.analytics_config,
86            ))),
87            ml_optimizer: Arc::new(AsyncMutex::new(MLOptimizer::new(
88                &config.ml_optimization_config,
89            ))),
90            predictor: Arc::new(AsyncMutex::new(MeasurementPredictor::new(
91                &config.prediction_config,
92            ))),
93            adaptive_manager: Arc::new(AsyncMutex::new(AdaptiveMeasurementManager::new(
94                &config.adaptive_config,
95            ))),
96            performance_monitor: Arc::new(RwLock::new(PerformanceMonitor::new())),
97            measurement_history: Arc::new(RwLock::new(VecDeque::with_capacity(10000))),
98            optimization_cache: Arc::new(RwLock::new(OptimizationCache::new())),
99        }
100    }
101
102    /// Query and cache device capabilities for mid-circuit measurements
103    pub fn query_capabilities(
104        &mut self,
105        backend: HardwareBackend,
106        device_id: &str,
107    ) -> DeviceResult<&MidCircuitCapabilities> {
108        let backend_caps = self.query_backend_capabilities(backend);
109
110        let capabilities = MidCircuitCapabilities {
111            max_measurements: backend_caps.max_mid_circuit_measurements,
112            supported_measurement_types: self.get_supported_measurement_types(backend)?,
113            classical_register_capacity: backend_caps.classical_register_size.unwrap_or(64),
114            max_classical_processing_time: 1000.0, // 1ms default
115            realtime_feedback: backend_caps.supports_real_time_feedback.unwrap_or(false),
116            parallel_measurements: backend_caps.supports_parallel_execution.unwrap_or(false),
117            native_protocols: self.get_native_protocols(backend),
118            timing_constraints: self.get_timing_constraints(backend, device_id)?,
119        };
120
121        self.capabilities = Some(capabilities);
122        // Safe to expect: we just set capabilities to Some above
123        Ok(self.capabilities.as_ref().expect("capabilities just set"))
124    }
125
126    /// Validate a measurement circuit against device capabilities
127    pub fn validate_circuit<const N: usize>(
128        &self,
129        circuit: &MeasurementCircuit<N>,
130        device_id: &str,
131    ) -> DeviceResult<ValidationResult> {
132        let mut validation_result = ValidationResult {
133            is_valid: true,
134            warnings: Vec::new(),
135            errors: Vec::new(),
136            recommendations: Vec::new(),
137        };
138
139        if !self.config.validation_config.validate_capabilities {
140            return Ok(validation_result);
141        }
142
143        let capabilities = self
144            .capabilities
145            .as_ref()
146            .ok_or_else(|| DeviceError::APIError("Capabilities not queried".into()))?;
147
148        // Check measurement count limits
149        let measurement_count = circuit
150            .operations()
151            .iter()
152            .filter(|op| matches!(op, CircuitOp::Measure(_)))
153            .count();
154
155        if let Some(max_measurements) = capabilities.max_measurements {
156            if measurement_count > max_measurements {
157                validation_result.errors.push(format!(
158                    "Circuit requires {measurement_count} measurements but device supports maximum {max_measurements}"
159                ));
160                validation_result.is_valid = false;
161            }
162        }
163
164        // Validate classical register usage
165        if self.config.validation_config.validate_register_sizes {
166            self.validate_classical_registers(circuit, capabilities, &mut validation_result)?;
167        }
168
169        // Check timing constraints
170        if self.config.validation_config.check_timing_constraints {
171            self.validate_timing_constraints(circuit, capabilities, &mut validation_result)?;
172        }
173
174        // Validate feed-forward operations
175        if self.config.validation_config.validate_feedforward {
176            self.validate_feedforward_operations(circuit, capabilities, &mut validation_result)?;
177        }
178
179        // Check for measurement conflicts
180        if self.config.validation_config.check_measurement_conflicts {
181            self.check_measurement_conflicts(circuit, &mut validation_result)?;
182        }
183
184        Ok(validation_result)
185    }
186
187    /// Execute a circuit with mid-circuit measurements
188    pub async fn execute_circuit<const N: usize>(
189        &self,
190        circuit: &MeasurementCircuit<N>,
191        device_executor: &dyn MidCircuitDeviceExecutor,
192        shots: usize,
193    ) -> DeviceResult<MidCircuitExecutionResult> {
194        let start_time = Instant::now();
195
196        // Validate circuit before execution
197        let validation = self.validate_circuit(circuit, device_executor.device_id())?;
198        if !validation.is_valid {
199            return Err(DeviceError::APIError(format!(
200                "Circuit validation failed: {:?}",
201                validation.errors
202            )));
203        }
204
205        // Optimize circuit for hardware
206        let optimized_circuit = self.optimize_for_hardware(circuit, device_executor).await?;
207
208        // Execute with measurement tracking
209        let mut measurement_history = Vec::new();
210        let mut classical_registers = HashMap::new();
211        let mut execution_stats = ExecutionStats {
212            total_execution_time: Duration::from_millis(0),
213            quantum_time: Duration::from_millis(0),
214            measurement_time: Duration::from_millis(0),
215            classical_time: Duration::from_millis(0),
216            num_measurements: 0,
217            num_conditional_ops: 0,
218            avg_measurement_latency: 0.0,
219            max_measurement_latency: 0.0,
220        };
221
222        // Execute the optimized circuit
223        let final_measurements = self
224            .execute_with_tracking(
225                optimized_circuit,
226                device_executor,
227                shots,
228                &mut measurement_history,
229                &mut classical_registers,
230                &mut execution_stats,
231            )
232            .await?;
233
234        // Calculate performance metrics
235        let performance_metrics =
236            self.calculate_performance_metrics(&measurement_history, &execution_stats)?;
237
238        // Perform error analysis
239        let error_analysis = if self.config.enable_measurement_mitigation {
240            Some(self.analyze_measurement_errors(&measurement_history, circuit)?)
241        } else {
242            None
243        };
244
245        // Perform advanced analytics
246        let analytics_results = self
247            .perform_advanced_analytics(&measurement_history, &execution_stats)
248            .await?;
249
250        // Generate predictions if enabled
251        let prediction_results = if self.config.prediction_config.enable_prediction {
252            Some(
253                self.predict_measurements(
254                    &measurement_history,
255                    self.config.prediction_config.prediction_horizon,
256                )
257                .await?,
258            )
259        } else {
260            None
261        };
262
263        // Generate optimization recommendations
264        let optimization_recommendations = self
265            .generate_optimization_recommendations(
266                &performance_metrics,
267                &analytics_results,
268                &measurement_history,
269            )
270            .await?;
271
272        // Generate adaptive learning insights
273        let adaptive_insights = self
274            .generate_adaptive_insights(&performance_metrics, &measurement_history)
275            .await?;
276
277        execution_stats.total_execution_time = start_time.elapsed();
278
279        let execution_result = MidCircuitExecutionResult {
280            final_measurements,
281            classical_registers,
282            measurement_history: measurement_history.clone(),
283            execution_stats,
284            performance_metrics,
285            error_analysis,
286            analytics_results,
287            prediction_results,
288            optimization_recommendations,
289            adaptive_insights,
290        };
291
292        // Update performance monitoring
293        self.update_performance_monitoring(&execution_result)
294            .await?;
295
296        Ok(execution_result)
297    }
298
299    /// Optimize circuit for specific hardware backend
300    async fn optimize_for_hardware<'a, const N: usize>(
301        &self,
302        circuit: &'a MeasurementCircuit<N>,
303        device_executor: &dyn MidCircuitDeviceExecutor,
304    ) -> DeviceResult<&'a MeasurementCircuit<N>> {
305        // Since optimization methods are currently placeholders that don't modify the circuit,
306        // we can just return the input reference for now
307        // TODO: Implement actual optimization that creates new circuits
308
309        if self.config.hardware_optimizations.batch_measurements {
310            // self.batch_measurements(circuit)?;
311        }
312
313        if self.config.hardware_optimizations.optimize_scheduling {
314            // self.optimize_measurement_scheduling(circuit)?;
315        }
316
317        if self.config.hardware_optimizations.precompile_conditions {
318            // self.precompile_classical_conditions(circuit)?;
319        }
320
321        Ok(circuit)
322    }
323
324    /// Execute circuit with detailed tracking
325    async fn execute_with_tracking<const N: usize>(
326        &self,
327        circuit: &MeasurementCircuit<N>,
328        device_executor: &dyn MidCircuitDeviceExecutor,
329        shots: usize,
330        measurement_history: &mut Vec<MeasurementEvent>,
331        classical_registers: &mut HashMap<String, Vec<u8>>,
332        execution_stats: &mut ExecutionStats,
333    ) -> DeviceResult<HashMap<String, usize>> {
334        let mut final_measurements = HashMap::new();
335        let execution_start = Instant::now();
336
337        // Process each shot
338        for shot in 0..shots {
339            let shot_start = Instant::now();
340
341            // Reset classical registers for this shot
342            classical_registers.clear();
343
344            // Execute operations sequentially
345            for (op_index, operation) in circuit.operations().iter().enumerate() {
346                match operation {
347                    CircuitOp::Gate(gate) => {
348                        let gate_start = Instant::now();
349                        device_executor.execute_gate(gate.as_ref()).await?;
350                        execution_stats.quantum_time += gate_start.elapsed();
351                    }
352                    CircuitOp::Measure(measurement) => {
353                        let measurement_start = Instant::now();
354                        let result = self
355                            .execute_measurement(
356                                measurement,
357                                device_executor,
358                                measurement_history,
359                                execution_start.elapsed().as_micros() as f64,
360                            )
361                            .await?;
362
363                        // Store result in classical register
364                        self.store_measurement_result(measurement, result, classical_registers)?;
365
366                        execution_stats.num_measurements += 1;
367                        let latency = measurement_start.elapsed().as_micros() as f64;
368                        execution_stats.measurement_time += measurement_start.elapsed();
369
370                        if latency > execution_stats.max_measurement_latency {
371                            execution_stats.max_measurement_latency = latency;
372                        }
373                    }
374                    CircuitOp::FeedForward(feedforward) => {
375                        let classical_start = Instant::now();
376
377                        // Evaluate condition
378                        let condition_met = self.evaluate_classical_condition(
379                            &feedforward.condition,
380                            classical_registers,
381                        )?;
382
383                        if condition_met {
384                            device_executor.execute_gate(&*feedforward.gate).await?;
385                            execution_stats.num_conditional_ops += 1;
386                        }
387
388                        execution_stats.classical_time += classical_start.elapsed();
389                    }
390                    CircuitOp::Barrier(_) => {
391                        // Synchronization point - ensure all previous operations complete
392                        device_executor.synchronize().await?;
393                    }
394                    CircuitOp::Reset(qubit) => {
395                        device_executor.reset_qubit(*qubit).await?;
396                    }
397                }
398            }
399
400            // Final measurements for this shot
401            let final_result = device_executor.measure_all().await?;
402            for (qubit_str, result) in final_result {
403                *final_measurements.entry(qubit_str).or_insert(0) += result;
404            }
405        }
406
407        // Calculate average measurement latency
408        if execution_stats.num_measurements > 0 {
409            execution_stats.avg_measurement_latency = execution_stats.measurement_time.as_micros()
410                as f64
411                / execution_stats.num_measurements as f64;
412        }
413
414        Ok(final_measurements)
415    }
416
417    /// Execute a single measurement with tracking
418    async fn execute_measurement(
419        &self,
420        measurement: &Measurement,
421        device_executor: &dyn MidCircuitDeviceExecutor,
422        measurement_history: &mut Vec<MeasurementEvent>,
423        timestamp: f64,
424    ) -> DeviceResult<u8> {
425        let measurement_start = Instant::now();
426
427        let result = device_executor.measure_qubit(measurement.qubit).await?;
428
429        let latency = measurement_start.elapsed().as_micros() as f64;
430
431        // Calculate measurement confidence based on calibration data
432        let confidence = self.calculate_measurement_confidence(measurement.qubit)?;
433
434        measurement_history.push(MeasurementEvent {
435            timestamp,
436            qubit: measurement.qubit,
437            result,
438            storage_location: StorageLocation::ClassicalBit(measurement.target_bit),
439            latency,
440            confidence,
441        });
442
443        Ok(result)
444    }
445
446    /// Store measurement result in classical registers
447    fn store_measurement_result(
448        &self,
449        measurement: &Measurement,
450        result: u8,
451        classical_registers: &mut HashMap<String, Vec<u8>>,
452    ) -> DeviceResult<()> {
453        // For now, store in a default register
454        let register = classical_registers
455            .entry("measurements".to_string())
456            .or_insert_with(|| vec![0; 64]); // 64-bit default register
457
458        if measurement.target_bit < register.len() {
459            register[measurement.target_bit] = result;
460        }
461
462        Ok(())
463    }
464
465    /// Evaluate classical condition
466    fn evaluate_classical_condition(
467        &self,
468        condition: &ClassicalCondition,
469        classical_registers: &HashMap<String, Vec<u8>>,
470    ) -> DeviceResult<bool> {
471        // Evaluate the classical condition using the struct fields
472        match (&condition.lhs, &condition.rhs) {
473            (ClassicalValue::Bit(lhs_bit), ClassicalValue::Bit(rhs_bit)) => {
474                Ok(match condition.op {
475                    ComparisonOp::Equal => lhs_bit == rhs_bit,
476                    ComparisonOp::NotEqual => lhs_bit != rhs_bit,
477                    _ => false, // Other comparisons not meaningful for bits
478                })
479            }
480            (ClassicalValue::Register(reg_name), ClassicalValue::Integer(expected)) => {
481                Ok(classical_registers.get(reg_name).map_or(false, |register| {
482                    // Compare first few bits with expected value
483                    let actual_value = register
484                        .iter()
485                        .take(8) // Take first 8 bits
486                        .enumerate()
487                        .fold(0u8, |acc, (i, &bit)| acc | (bit << i));
488                    actual_value == *expected as u8
489                }))
490            }
491            // Add other condition types as needed
492            _ => Ok(false),
493        }
494    }
495
496    /// Calculate measurement confidence based on calibration
497    const fn calculate_measurement_confidence(&self, qubit: QubitId) -> DeviceResult<f64> {
498        // Use calibration data to estimate measurement fidelity
499        // This is a simplified implementation
500        Ok(0.99) // 99% confidence default
501    }
502
503    /// Calculate performance metrics
504    fn calculate_performance_metrics(
505        &self,
506        measurement_history: &[MeasurementEvent],
507        execution_stats: &ExecutionStats,
508    ) -> DeviceResult<PerformanceMetrics> {
509        let total_measurements = measurement_history.len() as f64;
510
511        // Calculate measurement success rate (simplified)
512        let high_confidence_measurements = measurement_history
513            .iter()
514            .filter(|event| event.confidence > 0.95)
515            .count() as f64;
516
517        let measurement_success_rate = if total_measurements > 0.0 {
518            high_confidence_measurements / total_measurements
519        } else {
520            1.0
521        };
522
523        // Calculate timing efficiency
524        let total_time = execution_stats.total_execution_time.as_micros() as f64;
525        let useful_time = execution_stats.quantum_time.as_micros() as f64;
526        let timing_overhead = if useful_time > 0.0 {
527            (total_time - useful_time) / useful_time
528        } else {
529            0.0
530        };
531
532        // Resource utilization
533        let resource_utilization = ResourceUtilization {
534            quantum_utilization: if total_time > 0.0 {
535                useful_time / total_time
536            } else {
537                0.0
538            },
539            classical_utilization: if total_time > 0.0 {
540                execution_stats.classical_time.as_micros() as f64 / total_time
541            } else {
542                0.0
543            },
544            memory_usage: total_measurements as usize * 32, // Estimate 32 bytes per measurement
545            communication_overhead: execution_stats.measurement_time.as_micros() as f64
546                / total_time,
547        };
548
549        Ok(PerformanceMetrics {
550            measurement_success_rate,
551            classical_efficiency: 0.95, // Placeholder
552            circuit_fidelity: measurement_success_rate * 0.98, // Estimate
553            measurement_error_rate: 1.0 - measurement_success_rate,
554            timing_overhead,
555            resource_utilization,
556        })
557    }
558
559    /// Analyze measurement errors
560    fn analyze_measurement_errors<const N: usize>(
561        &self,
562        measurement_history: &[MeasurementEvent],
563        circuit: &MeasurementCircuit<N>,
564    ) -> DeviceResult<ErrorAnalysis> {
565        let mut measurement_errors = HashMap::new();
566
567        // Calculate error statistics for each qubit
568        for event in measurement_history {
569            let error_stats =
570                measurement_errors
571                    .entry(event.qubit)
572                    .or_insert(MeasurementErrorStats {
573                        readout_error_rate: 0.01,
574                        spam_error: 0.02,
575                        thermal_relaxation: 0.005,
576                        dephasing: 0.008,
577                    });
578
579            // Update error statistics based on measurement confidence
580            if event.confidence < 0.95 {
581                error_stats.readout_error_rate += 0.001;
582            }
583        }
584
585        Ok(ErrorAnalysis {
586            measurement_errors,
587            classical_errors: Vec::new(),
588            timing_violations: Vec::new(),
589            error_correlations: scirs2_core::ndarray::Array2::zeros((0, 0)),
590        })
591    }
592
593    // Placeholder methods for analytics and other components
594    async fn perform_advanced_analytics(
595        &self,
596        measurement_history: &[MeasurementEvent],
597        execution_stats: &ExecutionStats,
598    ) -> DeviceResult<AdvancedAnalyticsResults> {
599        // This would call the analytics engine
600        // For now, return a default result
601        Ok(AdvancedAnalyticsResults::default())
602    }
603
604    async fn predict_measurements(
605        &self,
606        measurement_history: &[MeasurementEvent],
607        horizon: usize,
608    ) -> DeviceResult<MeasurementPredictionResults> {
609        // This would call the predictor
610        Ok(MeasurementPredictionResults::default())
611    }
612
613    async fn generate_optimization_recommendations(
614        &self,
615        performance_metrics: &PerformanceMetrics,
616        analytics_results: &AdvancedAnalyticsResults,
617        measurement_history: &[MeasurementEvent],
618    ) -> DeviceResult<OptimizationRecommendations> {
619        Ok(OptimizationRecommendations::default())
620    }
621
622    async fn generate_adaptive_insights(
623        &self,
624        performance_metrics: &PerformanceMetrics,
625        measurement_history: &[MeasurementEvent],
626    ) -> DeviceResult<AdaptiveLearningInsights> {
627        Ok(AdaptiveLearningInsights::default())
628    }
629
630    async fn update_performance_monitoring(
631        &self,
632        execution_result: &MidCircuitExecutionResult,
633    ) -> DeviceResult<()> {
634        // Update performance monitoring
635        Ok(())
636    }
637
638    // Helper methods for validation
639    const fn validate_classical_registers<const N: usize>(
640        &self,
641        circuit: &MeasurementCircuit<N>,
642        capabilities: &MidCircuitCapabilities,
643        validation_result: &mut ValidationResult,
644    ) -> DeviceResult<()> {
645        // Implementation for classical register validation
646        Ok(())
647    }
648
649    const fn validate_timing_constraints<const N: usize>(
650        &self,
651        circuit: &MeasurementCircuit<N>,
652        capabilities: &MidCircuitCapabilities,
653        validation_result: &mut ValidationResult,
654    ) -> DeviceResult<()> {
655        // Implementation for timing constraint validation
656        Ok(())
657    }
658
659    const fn validate_feedforward_operations<const N: usize>(
660        &self,
661        circuit: &MeasurementCircuit<N>,
662        capabilities: &MidCircuitCapabilities,
663        validation_result: &mut ValidationResult,
664    ) -> DeviceResult<()> {
665        // Implementation for feedforward validation
666        Ok(())
667    }
668
669    const fn check_measurement_conflicts<const N: usize>(
670        &self,
671        circuit: &MeasurementCircuit<N>,
672        validation_result: &mut ValidationResult,
673    ) -> DeviceResult<()> {
674        // Implementation for measurement conflict checking
675        Ok(())
676    }
677
678    // Helper methods for capabilities
679    fn query_backend_capabilities(&self, backend: HardwareBackend) -> BackendCapabilities {
680        // Mock implementation
681        BackendCapabilities::default()
682    }
683
684    fn get_supported_measurement_types(
685        &self,
686        backend: HardwareBackend,
687    ) -> DeviceResult<Vec<MeasurementType>> {
688        Ok(vec![MeasurementType::ZBasis])
689    }
690
691    fn get_native_protocols(&self, backend: HardwareBackend) -> Vec<String> {
692        vec!["standard".to_string()]
693    }
694
695    fn get_timing_constraints(
696        &self,
697        backend: HardwareBackend,
698        device_id: &str,
699    ) -> DeviceResult<TimingConstraints> {
700        Ok(TimingConstraints {
701            min_measurement_spacing: 100.0,
702            max_measurement_duration: 1000.0,
703            classical_deadline: 500.0,
704            coherence_limits: HashMap::new(),
705        })
706    }
707}
708
709// Placeholder backend capabilities
710#[derive(Debug, Clone, Default)]
711pub struct BackendCapabilities {
712    pub max_mid_circuit_measurements: Option<usize>,
713    pub classical_register_size: Option<usize>,
714    pub supports_real_time_feedback: Option<bool>,
715    pub supports_parallel_execution: Option<bool>,
716}
717
718// Default implementations for result types
719impl Default for DescriptiveStatistics {
720    fn default() -> Self {
721        Self {
722            mean_latency: 0.0,
723            std_latency: 0.0,
724            median_latency: 0.0,
725            latency_percentiles: vec![],
726            success_rate_stats: MeasurementSuccessStats::default(),
727            error_rate_distribution: ErrorRateDistribution::default(),
728        }
729    }
730}
731
732impl Default for MeasurementSuccessStats {
733    fn default() -> Self {
734        Self {
735            overall_success_rate: 1.0,
736            per_qubit_success_rate: HashMap::new(),
737            temporal_success_rate: vec![],
738            success_rate_ci: (0.95, 1.0),
739        }
740    }
741}
742
743impl Default for ErrorRateDistribution {
744    fn default() -> Self {
745        Self {
746            histogram: vec![],
747            best_fit_distribution: "normal".to_string(),
748            distribution_parameters: vec![],
749            goodness_of_fit: 0.95,
750        }
751    }
752}
753
754impl Default for ConfidenceIntervals {
755    fn default() -> Self {
756        Self {
757            confidence_level: 0.95,
758            mean_intervals: HashMap::new(),
759            bootstrap_intervals: HashMap::new(),
760            prediction_intervals: HashMap::new(),
761        }
762    }
763}
764
765impl Default for CorrelationAnalysisResults {
766    fn default() -> Self {
767        Self {
768            pearson_correlations: scirs2_core::ndarray::Array2::zeros((0, 0)),
769            spearman_correlations: scirs2_core::ndarray::Array2::zeros((0, 0)),
770            kendall_correlations: scirs2_core::ndarray::Array2::zeros((0, 0)),
771            significant_correlations: vec![],
772            partial_correlations: scirs2_core::ndarray::Array2::zeros((0, 0)),
773            network_analysis: CorrelationNetworkAnalysis::default(),
774        }
775    }
776}
777
778impl Default for CorrelationNetworkAnalysis {
779    fn default() -> Self {
780        Self {
781            adjacency_matrix: scirs2_core::ndarray::Array2::zeros((0, 0)),
782            centrality_measures: NodeCentralityMeasures::default(),
783            communities: vec![],
784            network_density: 0.0,
785            clustering_coefficient: 0.0,
786        }
787    }
788}
789
790impl Default for NormalityAssessment {
791    fn default() -> Self {
792        Self {
793            shapiro_wilk: StatisticalTest::default(),
794            anderson_darling: StatisticalTest::default(),
795            jarque_bera: StatisticalTest::default(),
796            is_normal: true,
797            normality_confidence: 0.95,
798        }
799    }
800}
801
802impl Default for MeasurementPredictionResults {
803    fn default() -> Self {
804        Self {
805            predictions: scirs2_core::ndarray::Array1::zeros(0),
806            confidence_intervals: scirs2_core::ndarray::Array2::zeros((0, 0)),
807            timestamps: vec![],
808            model_performance: PredictionModelPerformance::default(),
809            uncertainty: PredictionUncertainty::default(),
810        }
811    }
812}
813
814impl Default for PredictionModelPerformance {
815    fn default() -> Self {
816        Self {
817            mae: 0.0,
818            mse: 0.0,
819            rmse: 0.0,
820            mape: 0.0,
821            r2_score: 1.0,
822            accuracy: 1.0,
823        }
824    }
825}
826
827impl Default for PredictionUncertainty {
828    fn default() -> Self {
829        Self {
830            aleatoric_uncertainty: scirs2_core::ndarray::Array1::zeros(0),
831            epistemic_uncertainty: scirs2_core::ndarray::Array1::zeros(0),
832            total_uncertainty: scirs2_core::ndarray::Array1::zeros(0),
833            uncertainty_bounds: scirs2_core::ndarray::Array2::zeros((0, 0)),
834        }
835    }
836}
837
838impl Default for OptimizationRecommendations {
839    fn default() -> Self {
840        Self {
841            scheduling_optimizations: vec![],
842            protocol_optimizations: vec![],
843            resource_optimizations: vec![],
844            performance_improvements: vec![],
845        }
846    }
847}
848
849impl Default for AdaptiveLearningInsights {
850    fn default() -> Self {
851        Self {
852            learning_progress: LearningProgress::default(),
853            adaptation_history: vec![],
854            performance_trends: PerformanceTrends::default(),
855            drift_detection: DriftDetectionResults::default(),
856            transfer_learning: TransferLearningInsights::default(),
857        }
858    }
859}
860
861impl Default for LearningProgress {
862    fn default() -> Self {
863        Self {
864            iterations_completed: 0,
865            current_learning_rate: 0.001,
866            loss_history: scirs2_core::ndarray::Array1::zeros(0),
867            accuracy_history: scirs2_core::ndarray::Array1::zeros(0),
868            convergence_status: ConvergenceStatus::NotStarted,
869        }
870    }
871}
872
873impl Default for PerformanceTrends {
874    fn default() -> Self {
875        Self {
876            short_term_trend: TrendDirection::Stable,
877            long_term_trend: TrendDirection::Stable,
878            trend_strength: 0.0,
879            seasonal_patterns: None,
880            volatility: 0.0,
881        }
882    }
883}
884
885impl Default for DriftDetectionResults {
886    fn default() -> Self {
887        Self {
888            drift_detected: false,
889            drift_type: None,
890            drift_magnitude: 0.0,
891            detection_confidence: 0.95,
892            recommended_actions: vec![],
893        }
894    }
895}
896
897impl Default for TransferLearningInsights {
898    fn default() -> Self {
899        Self {
900            transfer_effectiveness: 0.8,
901            domain_similarity: 0.9,
902            feature_transferability: scirs2_core::ndarray::Array1::zeros(0),
903            adaptation_requirements: vec![],
904            recommendations: vec![],
905        }
906    }
907}