1use 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#[async_trait::async_trait]
28pub trait MidCircuitDeviceExecutor {
29 fn device_id(&self) -> &str;
31
32 async fn execute_gate(&self, gate: &dyn GateOp) -> DeviceResult<()>;
34
35 async fn measure_qubit(&self, qubit: QubitId) -> DeviceResult<u8>;
37
38 async fn measure_all(&self) -> DeviceResult<HashMap<String, usize>>;
40
41 async fn synchronize(&self) -> DeviceResult<()>;
43
44 async fn reset_qubit(&self, qubit: QubitId) -> DeviceResult<()>;
46}
47
48#[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
57pub struct MidCircuitExecutor {
59 config: MidCircuitConfig,
60 calibration_manager: CalibrationManager,
61 capabilities: Option<MidCircuitCapabilities>,
62 gate_translator: GateTranslator,
63
64 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_monitor: Arc<RwLock<PerformanceMonitor>>,
72 measurement_history: Arc<RwLock<VecDeque<MeasurementEvent>>>,
73 optimization_cache: Arc<RwLock<OptimizationCache>>,
74}
75
76impl MidCircuitExecutor {
77 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 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, 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 Ok(self.capabilities.as_ref().expect("capabilities just set"))
124 }
125
126 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 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 if self.config.validation_config.validate_register_sizes {
166 self.validate_classical_registers(circuit, capabilities, &mut validation_result)?;
167 }
168
169 if self.config.validation_config.check_timing_constraints {
171 self.validate_timing_constraints(circuit, capabilities, &mut validation_result)?;
172 }
173
174 if self.config.validation_config.validate_feedforward {
176 self.validate_feedforward_operations(circuit, capabilities, &mut validation_result)?;
177 }
178
179 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 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 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 let optimized_circuit = self.optimize_for_hardware(circuit, device_executor).await?;
207
208 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 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 let performance_metrics =
236 self.calculate_performance_metrics(&measurement_history, &execution_stats)?;
237
238 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 let analytics_results = self
247 .perform_advanced_analytics(&measurement_history, &execution_stats)
248 .await?;
249
250 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 let optimization_recommendations = self
265 .generate_optimization_recommendations(
266 &performance_metrics,
267 &analytics_results,
268 &measurement_history,
269 )
270 .await?;
271
272 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 self.update_performance_monitoring(&execution_result)
294 .await?;
295
296 Ok(execution_result)
297 }
298
299 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 if self.config.hardware_optimizations.batch_measurements {
310 }
312
313 if self.config.hardware_optimizations.optimize_scheduling {
314 }
316
317 if self.config.hardware_optimizations.precompile_conditions {
318 }
320
321 Ok(circuit)
322 }
323
324 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 for shot in 0..shots {
339 let shot_start = Instant::now();
340
341 classical_registers.clear();
343
344 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 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 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 device_executor.synchronize().await?;
393 }
394 CircuitOp::Reset(qubit) => {
395 device_executor.reset_qubit(*qubit).await?;
396 }
397 }
398 }
399
400 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 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 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 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 fn store_measurement_result(
448 &self,
449 measurement: &Measurement,
450 result: u8,
451 classical_registers: &mut HashMap<String, Vec<u8>>,
452 ) -> DeviceResult<()> {
453 let register = classical_registers
455 .entry("measurements".to_string())
456 .or_insert_with(|| vec![0; 64]); if measurement.target_bit < register.len() {
459 register[measurement.target_bit] = result;
460 }
461
462 Ok(())
463 }
464
465 fn evaluate_classical_condition(
467 &self,
468 condition: &ClassicalCondition,
469 classical_registers: &HashMap<String, Vec<u8>>,
470 ) -> DeviceResult<bool> {
471 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, })
479 }
480 (ClassicalValue::Register(reg_name), ClassicalValue::Integer(expected)) => {
481 Ok(classical_registers.get(reg_name).map_or(false, |register| {
482 let actual_value = register
484 .iter()
485 .take(8) .enumerate()
487 .fold(0u8, |acc, (i, &bit)| acc | (bit << i));
488 actual_value == *expected as u8
489 }))
490 }
491 _ => Ok(false),
493 }
494 }
495
496 const fn calculate_measurement_confidence(&self, qubit: QubitId) -> DeviceResult<f64> {
498 Ok(0.99) }
502
503 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 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 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 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, 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, circuit_fidelity: measurement_success_rate * 0.98, measurement_error_rate: 1.0 - measurement_success_rate,
554 timing_overhead,
555 resource_utilization,
556 })
557 }
558
559 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 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 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 async fn perform_advanced_analytics(
595 &self,
596 measurement_history: &[MeasurementEvent],
597 execution_stats: &ExecutionStats,
598 ) -> DeviceResult<AdvancedAnalyticsResults> {
599 Ok(AdvancedAnalyticsResults::default())
602 }
603
604 async fn predict_measurements(
605 &self,
606 measurement_history: &[MeasurementEvent],
607 horizon: usize,
608 ) -> DeviceResult<MeasurementPredictionResults> {
609 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 Ok(())
636 }
637
638 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 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 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 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 Ok(())
676 }
677
678 fn query_backend_capabilities(&self, backend: HardwareBackend) -> BackendCapabilities {
680 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#[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
718impl 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}