#![allow(clippy::pedantic, clippy::field_reassign_with_default)]
use std::collections::HashMap;
use std::sync::Arc;
use std::time::{Duration, SystemTime};
use quantrs2_circuit::prelude::Circuit;
use quantrs2_core::qubit::QubitId;
use quantrs2_device::DeviceError;
use quantrs2_device::{
advanced_scheduling::JobRequirements,
advanced_scheduling::*,
job_scheduling::{
create_cost_optimized_config, create_deadline_config, create_energy_efficient_config,
create_ml_training_config, create_realtime_config, create_simulation_config,
create_sla_aware_config, AllocationStrategy, FeatureParams, GAParameters, JobPriority,
JobStatus, MLAlgorithm, MultiObjectiveWeights, QuantumJob, QuantumJobScheduler,
RLParameters, ResourceRequirements, SLATier, SchedulingParams, SchedulingStrategy,
SciRS2SchedulingParams,
},
translation::HardwareBackend,
};
#[tokio::test]
async fn test_advanced_scheduler_initialization() {
let scheduler = create_test_scheduler().await;
let queue_predictions = scheduler.predict_queue_times().await;
assert!(queue_predictions.is_ok());
}
#[tokio::test]
async fn test_ml_enhanced_job_configuration() {
let scheduler = create_test_scheduler().await;
let mut circuit: Circuit<16> = Circuit::new();
let _ = circuit.h(0);
let _ = circuit.cx(0, 1);
let _ = circuit.measure_all();
let config = create_ml_training_config();
let job_result = scheduler
.submit_intelligent_job(circuit, 1000, config, "test_user".to_string())
.await;
match job_result {
Ok(_) => {}
Err(e) => panic!("Job submission failed: {e:?}"),
}
}
#[tokio::test]
async fn test_multi_objective_backend_selection() {
let scheduler = create_test_scheduler().await;
let requirements = JobRequirements {
min_qubits: 5,
max_execution_time: Duration::from_secs(300),
priority: JobPriority::High,
};
let preferences = "cost_sensitive".to_string();
let selected_backend = scheduler
.select_optimal_backend(&requirements, &preferences)
.await;
match selected_backend {
Ok(_) => {}
Err(e) => panic!("Backend selection failed: {e:?}"),
}
}
#[tokio::test]
async fn test_predictive_queue_time_estimation() {
let scheduler = create_test_scheduler().await;
let queue_predictions = scheduler.predict_queue_times().await.unwrap();
assert!(queue_predictions.contains_key(&HardwareBackend::IBMQuantum));
assert!(queue_predictions.contains_key(&HardwareBackend::AmazonBraket));
for (backend, prediction) in queue_predictions {
assert!(prediction.as_secs() < 3600); println!("Backend {backend:?}: predicted queue time {prediction:?}");
}
}
#[tokio::test]
async fn test_sla_compliance_monitoring() {
let scheduler = create_test_scheduler().await;
let compliance_report = scheduler.monitor_sla_compliance().await;
assert!(compliance_report.is_ok());
let report = compliance_report.unwrap();
assert!(report.current_compliance >= 0.0 && report.current_compliance <= 1.0);
println!("SLA Compliance: {:.2}%", report.current_compliance * 100.0);
println!(
"Predicted violations: {}",
report.predicted_violations.len()
);
println!(
"Mitigation strategies: {}",
report.mitigation_strategies.len()
);
}
#[tokio::test]
async fn test_cost_optimization() {
let scheduler = create_test_scheduler().await;
let cost_report = scheduler.optimize_costs().await;
assert!(cost_report.is_ok());
let report = cost_report.unwrap();
assert!(report.savings_potential >= 0.0);
println!("Potential savings: ${:.2}", report.savings_potential);
println!("Optimization opportunities: {}", report.optimizations.len());
}
#[tokio::test]
async fn test_energy_optimization() {
let scheduler = create_test_scheduler().await;
let energy_report = scheduler.optimize_energy_consumption().await;
assert!(energy_report.is_ok());
let report = energy_report.unwrap();
assert!(report.sustainability_score >= 0.0 && report.sustainability_score <= 1.0);
assert!(report.carbon_reduction_potential >= 0.0);
println!("Sustainability score: {:.2}", report.sustainability_score);
println!(
"Carbon reduction potential: {:.2} kg CO2",
report.carbon_reduction_potential
);
println!(
"Efficiency recommendations: {}",
report.efficiency_recommendations.len()
);
}
#[tokio::test]
async fn test_fairness_and_game_theory() {
let scheduler = create_test_scheduler().await;
let fairness_report = scheduler.apply_fair_scheduling().await;
assert!(fairness_report.is_ok());
let report = fairness_report.unwrap();
println!(
"User satisfaction scores: {:?}",
report.user_satisfaction_scores
);
println!(
"Incentive mechanisms: {}",
report.incentive_mechanisms.len()
);
}
#[tokio::test]
async fn test_dynamic_load_balancing() {
let scheduler = create_test_scheduler().await;
let load_balance_result = scheduler.dynamic_load_balance().await;
assert!(load_balance_result.is_ok());
}
#[tokio::test]
async fn test_job_configuration_templates() {
let gold_config = create_sla_aware_config(SLATier::Gold);
assert_eq!(gold_config.priority, JobPriority::Critical);
assert_eq!(gold_config.retry_attempts, 5);
let bronze_config = create_sla_aware_config(SLATier::Bronze);
assert_eq!(bronze_config.priority, JobPriority::Normal);
assert_eq!(bronze_config.retry_attempts, 2);
let cost_config = create_cost_optimized_config(100.0);
assert_eq!(cost_config.priority, JobPriority::BestEffort);
assert_eq!(cost_config.cost_limit, Some(100.0));
let energy_config = create_energy_efficient_config();
assert_eq!(energy_config.priority, JobPriority::Low);
assert!(energy_config.tags.contains_key("energy_profile"));
let ml_config = create_ml_training_config();
assert_eq!(ml_config.resource_requirements.min_qubits, 20);
assert_eq!(ml_config.resource_requirements.memory_mb, Some(16384));
let sim_config = create_simulation_config(30);
assert_eq!(sim_config.resource_requirements.min_qubits, 30);
assert_eq!(sim_config.resource_requirements.memory_mb, Some(8192));
let deadline = SystemTime::now() + Duration::from_secs(3600);
let deadline_config = create_deadline_config(deadline);
assert_eq!(deadline_config.priority, JobPriority::High);
assert_eq!(deadline_config.deadline, Some(deadline));
}
#[tokio::test]
async fn test_advanced_scheduling_strategies() {
let strategies = vec![
SchedulingStrategy::MLOptimized,
SchedulingStrategy::MultiObjectiveOptimized,
SchedulingStrategy::ReinforcementLearning,
SchedulingStrategy::GeneticAlgorithm,
SchedulingStrategy::GameTheoreticFair,
SchedulingStrategy::EnergyAware,
SchedulingStrategy::DeadlineAwareSLA,
];
for strategy in strategies {
let params = SchedulingParams {
strategy: strategy.clone(),
allocation_strategy: AllocationStrategy::SciRS2Optimized,
scirs2_params: SciRS2SchedulingParams {
enabled: true,
ml_algorithm: MLAlgorithm::EnsembleMethod,
..Default::default()
},
..Default::default()
};
let scheduler = AdvancedQuantumScheduler::new(params);
println!("Successfully initialized scheduler with strategy: {strategy:?}");
}
}
#[tokio::test]
async fn test_resource_allocation_strategies() {
let strategies = vec![
AllocationStrategy::SciRS2Optimized,
AllocationStrategy::MultiObjectiveOptimized,
AllocationStrategy::PredictiveAllocation,
AllocationStrategy::EnergyEfficient,
AllocationStrategy::CostOptimized,
AllocationStrategy::PerformanceOptimized,
AllocationStrategy::FaultTolerant,
AllocationStrategy::LocalityAware,
];
for strategy in strategies {
let params = SchedulingParams {
strategy: SchedulingStrategy::MLOptimized,
allocation_strategy: strategy.clone(),
..Default::default()
};
let scheduler = AdvancedQuantumScheduler::new(params);
println!("Successfully initialized scheduler with allocation strategy: {strategy:?}");
}
}
#[tokio::test]
async fn test_ml_algorithm_configurations() {
let algorithms = vec![
MLAlgorithm::LinearRegression,
MLAlgorithm::SVM,
MLAlgorithm::RandomForest,
MLAlgorithm::GradientBoosting,
MLAlgorithm::NeuralNetwork,
MLAlgorithm::EnsembleMethod,
MLAlgorithm::DeepRL,
MLAlgorithm::GraphNN,
];
for algorithm in algorithms {
let params = SchedulingParams {
strategy: SchedulingStrategy::MLOptimized,
scirs2_params: SciRS2SchedulingParams {
enabled: true,
ml_algorithm: algorithm.clone(),
enable_prediction: true,
..Default::default()
},
..Default::default()
};
let scheduler = AdvancedQuantumScheduler::new(params);
println!("Successfully initialized scheduler with ML algorithm: {algorithm:?}");
}
}
#[tokio::test]
async fn test_comprehensive_workflow() {
let scheduler = create_test_scheduler().await;
let mut job_ids = Vec::new();
let mut circuit1 = Circuit::<4>::new();
let _ = circuit1.h(0);
let _ = circuit1.measure_all();
let job1 = scheduler
.submit_intelligent_job(circuit1, 100, create_realtime_config(), "user1".to_string())
.await
.unwrap();
job_ids.push(job1);
let mut circuit2 = Circuit::<16>::new();
for i in 0..10 {
let _ = circuit2.h(i);
if i > 0 {
let _ = circuit2.cx(i - 1, i);
}
}
let _ = circuit2.measure_all();
let job2 = scheduler
.submit_intelligent_job(
circuit2,
1000,
create_ml_training_config(),
"user2".to_string(),
)
.await
.unwrap();
job_ids.push(job2);
let mut circuit3 = Circuit::<8>::new();
let _ = circuit3.h(0);
let _ = circuit3.rx(QubitId::from(1), std::f64::consts::PI / 4.0);
let _ = circuit3.measure_all();
let job3 = scheduler
.submit_intelligent_job(
circuit3,
5000,
create_cost_optimized_config(50.0),
"user3".to_string(),
)
.await
.unwrap();
job_ids.push(job3);
let mut circuit4 = Circuit::<4>::new();
for i in 0..5 {
let _ = circuit4.ry(QubitId::from(i), std::f64::consts::PI / 8.0);
}
let _ = circuit4.measure_all();
let job4 = scheduler
.submit_intelligent_job(
circuit4,
2000,
create_energy_efficient_config(),
"user4".to_string(),
)
.await
.unwrap();
job_ids.push(job4);
println!("Successfully submitted {} jobs", job_ids.len());
let queue_predictions = scheduler.predict_queue_times().await.unwrap();
println!("Queue predictions: {queue_predictions:?}");
let compliance_report = scheduler.monitor_sla_compliance().await.unwrap();
println!(
"SLA compliance: {:.2}%",
compliance_report.current_compliance * 100.0
);
let cost_report = scheduler.optimize_costs().await.unwrap();
println!(
"Cost optimization savings potential: ${:.2}",
cost_report.savings_potential
);
let energy_report = scheduler.optimize_energy_consumption().await.unwrap();
println!(
"Sustainability score: {:.2}",
energy_report.sustainability_score
);
let fairness_report = scheduler.apply_fair_scheduling().await.unwrap();
println!(
"Fairness mechanisms: {}",
fairness_report.incentive_mechanisms.len()
);
scheduler.dynamic_load_balance().await.unwrap();
println!("Dynamic load balancing applied successfully");
assert_eq!(job_ids.len(), 4);
}
async fn create_test_scheduler() -> AdvancedQuantumScheduler {
let params = SchedulingParams {
strategy: SchedulingStrategy::MLOptimized,
allocation_strategy: AllocationStrategy::SciRS2Optimized,
scirs2_params: SciRS2SchedulingParams {
enabled: true,
objective_weights: HashMap::new(),
learning_window: Duration::from_secs(1800),
optimization_frequency: Duration::from_secs(30), model_params: HashMap::new(),
ml_algorithm: MLAlgorithm::EnsembleMethod,
multi_objective_weights: MultiObjectiveWeights::default(),
rl_params: RLParameters::default(),
ga_params: GAParameters::default(),
enable_prediction: true,
retrain_frequency: Duration::from_secs(300), feature_params: FeatureParams::default(),
},
..Default::default()
};
let scheduler = AdvancedQuantumScheduler::new(params);
scheduler
.register_backend(HardwareBackend::IBMQuantum)
.await
.unwrap();
scheduler
.register_backend(HardwareBackend::AmazonBraket)
.await
.unwrap();
scheduler
.register_backend(HardwareBackend::AzureQuantum)
.await
.unwrap();
scheduler
}
#[derive(Debug, Clone)]
struct UserPreferences {
cost_sensitivity: f64,
performance_priority: f64,
energy_preference: f64,
latency_tolerance: Duration,
}
#[tokio::test]
async fn test_performance_under_load() {
let scheduler = create_test_scheduler().await;
let num_jobs = 100;
let mut handles = Vec::new();
for i in 0..num_jobs {
let handle: tokio::task::JoinHandle<Result<String, DeviceError>> =
tokio::spawn(async move {
let mut circuit: Circuit<16> = Circuit::new();
let _ = circuit.h(0);
let _ = circuit.measure_all();
let config = if i % 4 == 0 {
create_realtime_config()
} else if i % 4 == 1 {
create_ml_training_config()
} else if i % 4 == 2 {
create_cost_optimized_config(100.0)
} else {
create_energy_efficient_config()
};
Ok(format!("job_{i}"))
});
handles.push(handle);
}
let start_time = std::time::Instant::now();
let mut successful_submissions = 0;
for handle in handles {
if let Ok(result) = handle.await {
if result.is_ok() {
successful_submissions += 1;
}
}
}
let elapsed = start_time.elapsed();
println!("Submitted {successful_submissions} jobs in {elapsed:?}");
println!("Average submission time: {:?}", elapsed / num_jobs);
assert!(successful_submissions > 0);
assert!(elapsed.as_secs() < 60);
}