use crate::{
backend_traits::{query_backend_capabilities, BackendCapabilities},
calibration::{CalibrationManager, DeviceCalibration},
hardware_parallelization::{HardwareParallelizationEngine, ParallelizationConfig},
integrated_device_manager::{DeviceInfo, IntegratedQuantumDeviceManager},
job_scheduling::{JobPriority, QuantumJobScheduler, SchedulingStrategy},
translation::HardwareBackend,
vqa_support::{ObjectiveFunction, VQAConfig, VQAExecutor},
CircuitResult, DeviceError, DeviceResult,
};
use quantrs2_circuit::prelude::Circuit;
use quantrs2_core::{
error::{QuantRS2Error, QuantRS2Result},
gate::GateOp,
qubit::QubitId,
};
use scirs2_core::ndarray::{Array1, Array2, ArrayView1, ArrayView2};
#[cfg(feature = "scirs2")]
use scirs2_graph::{dijkstra_path, minimum_spanning_tree, Graph};
#[cfg(feature = "scirs2")]
use scirs2_optimize::{differential_evolution, minimize, OptimizeResult};
#[cfg(feature = "scirs2")]
use scirs2_stats::{corrcoef, mean, pearsonr, spearmanr, std};
use serde::{Deserialize, Serialize};
use std::collections::{BTreeMap, HashMap, VecDeque};
use std::sync::{Arc, Mutex, RwLock};
use std::time::{Duration, Instant, SystemTime};
use tokio::sync::{Mutex as AsyncMutex, RwLock as AsyncRwLock, Semaphore};
use super::types::*;
use super::types::HybridOptimizer as LocalHybridOptimizer;
use LocalHybridOptimizer as HybridOptimizer;
pub trait RecoveryStrategy {
fn can_handle(&self, error: &DeviceError) -> bool;
fn recover(
&self,
error: &DeviceError,
context: &HashMap<String, String>,
) -> DeviceResult<RecoveryAction>;
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_hybrid_loop_config_default() {
let config = HybridLoopConfig::default();
assert_eq!(config.strategy, HybridLoopStrategy::VariationalOptimization);
assert_eq!(config.optimization_config.optimizer, HybridOptimizer::Adam);
assert!(config.optimization_config.enable_scirs2_optimization);
}
#[test]
fn test_convergence_criteria() {
let criteria = vec![
ConvergenceCriterion::ValueTolerance(1e-6),
ConvergenceCriterion::MaxIterations(1000),
];
for criterion in criteria {
match criterion {
ConvergenceCriterion::ValueTolerance(tol) => assert!(tol > 0.0),
ConvergenceCriterion::MaxIterations(max_iter) => assert!(max_iter > 0),
_ => {}
}
}
}
#[test]
fn test_hybrid_optimizer_types() {
let optimizers = [
HybridOptimizer::Adam,
HybridOptimizer::GradientDescent,
HybridOptimizer::SPSA,
HybridOptimizer::SciRS2Optimized,
];
assert_eq!(optimizers.len(), 4);
assert!(optimizers.contains(&HybridOptimizer::Adam));
assert!(optimizers.contains(&HybridOptimizer::GradientDescent));
assert!(optimizers.contains(&HybridOptimizer::SPSA));
assert!(optimizers.contains(&HybridOptimizer::SciRS2Optimized));
}
#[test]
fn test_hybrid_executor_creation() {
let config = HybridLoopConfig::default();
let devices = HashMap::new();
let cal_mgr = crate::calibration::CalibrationManager::new();
let device_manager = Arc::new(RwLock::new(
crate::integrated_device_manager::IntegratedQuantumDeviceManager::new(
Default::default(),
devices,
cal_mgr.clone(),
)
.expect("Failed to create IntegratedQuantumDeviceManager in test"),
));
let calibration_manager = Arc::new(RwLock::new(cal_mgr));
let parallelization_engine = Arc::new(
crate::hardware_parallelization::HardwareParallelizationEngine::new(
Default::default(),
device_manager.clone(),
calibration_manager.clone(),
Arc::new(RwLock::new(
crate::routing_advanced::AdvancedQubitRouter::new(
Default::default(),
crate::routing_advanced::AdvancedRoutingStrategy::Hybrid,
42,
),
)),
),
);
let scheduler = Arc::new(crate::job_scheduling::QuantumJobScheduler::new(
Default::default(),
));
{
let _executor = HybridQuantumClassicalExecutor::new(
config,
device_manager,
calibration_manager,
parallelization_engine,
scheduler,
);
}
}
}