use std::collections::HashMap;
use std::time::{Duration, Instant};
use super::compilation::CompilationResult;
use super::config::{OptimizationLevel, ResourceAllocationStrategy, SchedulingPriority};
use super::platform::QuantumPlatform;
#[derive(Debug, Clone)]
pub struct UniversalExecutionResult {
pub problem_id: String,
pub optimal_platform: QuantumPlatform,
pub compilation_results: HashMap<QuantumPlatform, CompilationResult>,
pub performance_predictions: HashMap<QuantumPlatform, PlatformPerformancePrediction>,
pub execution_result: PlatformExecutionResult,
pub total_time: Duration,
pub metadata: UniversalExecutionMetadata,
}
#[derive(Debug, Clone)]
pub struct PlatformPerformancePrediction {
pub platform: QuantumPlatform,
pub predicted_performance: PredictedPerformance,
pub confidence_score: f64,
pub prediction_metadata: PredictionMetadata,
}
#[derive(Debug, Clone)]
pub struct PredictedPerformance {
pub execution_time: Duration,
pub solution_quality: f64,
pub success_probability: f64,
pub cost: f64,
pub reliability_score: f64,
}
#[derive(Debug, Clone)]
pub struct PredictionMetadata {
pub model_version: String,
pub prediction_timestamp: Instant,
pub features_used: Vec<String>,
pub model_accuracy: f64,
}
#[derive(Debug, Clone)]
pub struct OptimalPlatformSelection {
pub platform: QuantumPlatform,
pub selection_score: f64,
pub selection_rationale: String,
pub alternatives: Vec<QuantumPlatform>,
pub selection_metadata: SelectionMetadata,
}
#[derive(Debug, Clone)]
pub struct SelectionMetadata {
pub selection_timestamp: Instant,
pub strategy_used: ResourceAllocationStrategy,
pub confidence: f64,
}
#[derive(Debug, Clone)]
pub struct ExecutionPlan {
pub platform: QuantumPlatform,
pub scheduled_start_time: Instant,
pub estimated_duration: Duration,
pub resource_allocation: PlatformResourceAllocation,
pub execution_parameters: ExecutionParameters,
}
#[derive(Debug, Clone)]
pub struct PlatformResourceAllocation {
pub qubits: Vec<usize>,
pub execution_priority: SchedulingPriority,
pub resource_reservation: ResourceReservationInfo,
}
#[derive(Debug, Clone)]
pub struct ResourceReservationInfo {
pub reservation_id: String,
pub reserved_until: Instant,
}
#[derive(Debug, Clone)]
pub struct ExecutionParameters {
pub shots: usize,
pub optimization_level: OptimizationLevel,
pub error_mitigation: bool,
}
#[derive(Debug, Clone)]
pub struct PlatformExecutionResult {
pub platform: QuantumPlatform,
pub execution_id: String,
pub solution: Vec<i32>,
pub objective_value: f64,
pub execution_time: Duration,
pub success: bool,
pub quality_metrics: ExecutionQualityMetrics,
pub resource_usage: ExecutionResourceUsage,
pub metadata: ExecutionMetadata,
}
#[derive(Debug, Clone)]
pub struct ExecutionQualityMetrics {
pub solution_quality: f64,
pub fidelity: f64,
pub success_probability: f64,
}
#[derive(Debug, Clone)]
pub struct ExecutionResourceUsage {
pub qubits_used: usize,
pub shots_executed: usize,
pub classical_compute_time: Duration,
pub cost_incurred: f64,
}
#[derive(Debug, Clone)]
pub struct ExecutionMetadata {
pub execution_timestamp: Instant,
pub platform_version: String,
pub execution_environment: String,
}
#[derive(Debug, Clone)]
pub struct UniversalExecutionMetadata {
pub compiler_version: String,
pub platforms_considered: usize,
pub optimization_level: OptimizationLevel,
pub cost_savings: f64,
pub performance_improvement: f64,
}
#[derive(Debug, Default)]
pub struct PerformancePredictor {
history: HashMap<QuantumPlatform, Vec<PlatformExecutionResult>>,
}
impl PerformancePredictor {
#[must_use]
pub fn new() -> Self {
Self {
history: HashMap::new(),
}
}
pub fn record_result(&mut self, result: &PlatformExecutionResult) {
self.history
.entry(result.platform.clone())
.or_default()
.push(result.clone());
}
#[must_use]
pub fn sample_count(&self, platform: &QuantumPlatform) -> usize {
self.history.get(platform).map_or(0, Vec::len)
}
#[must_use]
pub fn predict(&self, platform: &QuantumPlatform) -> Option<PredictedPerformance> {
let results = self.history.get(platform)?;
if results.is_empty() {
return None;
}
let n = results.len() as f64;
let mean_time_secs = results
.iter()
.map(|r| r.execution_time.as_secs_f64())
.sum::<f64>()
/ n;
let mean_quality = results
.iter()
.map(|r| r.quality_metrics.solution_quality)
.sum::<f64>()
/ n;
let mean_success_probability = results
.iter()
.map(|r| r.quality_metrics.success_probability)
.sum::<f64>()
/ n;
let mean_cost = results
.iter()
.map(|r| r.resource_usage.cost_incurred)
.sum::<f64>()
/ n;
let success_rate = results.iter().filter(|r| r.success).count() as f64 / n;
Some(PredictedPerformance {
execution_time: Duration::from_secs_f64(mean_time_secs.max(0.0)),
solution_quality: mean_quality,
success_probability: mean_success_probability,
cost: mean_cost,
reliability_score: success_rate,
})
}
#[must_use]
pub fn model_accuracy(&self, platform: &QuantumPlatform) -> f64 {
let Some(results) = self.history.get(platform) else {
return 0.0;
};
if results.len() < 2 {
return 0.0;
}
let n = results.len() as f64;
let mean = results
.iter()
.map(|r| r.quality_metrics.solution_quality)
.sum::<f64>()
/ n;
if mean.abs() < 1e-12 {
return 0.0;
}
let variance = results
.iter()
.map(|r| (r.quality_metrics.solution_quality - mean).powi(2))
.sum::<f64>()
/ n;
let coefficient_of_variation = variance.sqrt() / mean.abs();
(1.0 - coefficient_of_variation).clamp(0.0, 1.0)
}
#[must_use]
pub fn confidence_score(&self, platform: &QuantumPlatform) -> f64 {
let n = self.sample_count(platform) as f64;
n / (n + 5.0)
}
}
#[derive(Debug, Default)]
pub struct CostOptimizer {
cost_history: HashMap<QuantumPlatform, Vec<f64>>,
}
impl CostOptimizer {
#[must_use]
pub fn new() -> Self {
Self {
cost_history: HashMap::new(),
}
}
pub fn record_cost(&mut self, platform: QuantumPlatform, cost: f64) {
self.cost_history.entry(platform).or_default().push(cost);
}
#[must_use]
pub fn estimate_cost(&self, platform: &QuantumPlatform) -> Option<f64> {
let costs = self.cost_history.get(platform)?;
if costs.is_empty() {
return None;
}
Some(costs.iter().sum::<f64>() / costs.len() as f64)
}
#[must_use]
pub fn recommend_cheapest<'a>(
&self,
candidates: &'a [QuantumPlatform],
) -> Option<&'a QuantumPlatform> {
candidates
.iter()
.filter_map(|platform| self.estimate_cost(platform).map(|cost| (platform, cost)))
.min_by(|(_, a), (_, b)| a.partial_cmp(b).unwrap_or(std::cmp::Ordering::Equal))
.map(|(platform, _)| platform)
}
}
#[cfg(test)]
mod tests {
use super::*;
fn make_result(
platform: QuantumPlatform,
quality: f64,
cost: f64,
success: bool,
) -> PlatformExecutionResult {
PlatformExecutionResult {
platform,
execution_id: "test".to_string(),
solution: vec![1, 0, 1],
objective_value: -1.0,
execution_time: Duration::from_millis(100),
success,
quality_metrics: ExecutionQualityMetrics {
solution_quality: quality,
fidelity: 0.95,
success_probability: if success { 0.9 } else { 0.1 },
},
resource_usage: ExecutionResourceUsage {
qubits_used: 4,
shots_executed: 100,
classical_compute_time: Duration::from_millis(10),
cost_incurred: cost,
},
metadata: ExecutionMetadata {
execution_timestamp: Instant::now(),
platform_version: "1.0".to_string(),
execution_environment: "test".to_string(),
},
}
}
#[test]
fn performance_predictor_has_no_prediction_without_real_history() {
let predictor = PerformancePredictor::new();
assert!(predictor.predict(&QuantumPlatform::DWave).is_none());
assert_eq!(predictor.model_accuracy(&QuantumPlatform::DWave), 0.0);
assert_eq!(predictor.confidence_score(&QuantumPlatform::DWave), 0.0);
}
#[test]
fn performance_predictor_derives_real_predictions_from_recorded_history() {
let mut predictor = PerformancePredictor::new();
predictor.record_result(&make_result(QuantumPlatform::DWave, 0.8, 1.0, true));
predictor.record_result(&make_result(QuantumPlatform::DWave, 0.9, 2.0, true));
predictor.record_result(&make_result(QuantumPlatform::DWave, 0.7, 3.0, false));
let prediction = predictor
.predict(&QuantumPlatform::DWave)
.expect("prediction should exist once history has been recorded");
assert!((prediction.solution_quality - 0.8).abs() < 1e-9);
assert!((prediction.cost - 2.0).abs() < 1e-9);
assert!((prediction.reliability_score - (2.0 / 3.0)).abs() < 1e-9);
let confidence_after_3 = predictor.confidence_score(&QuantumPlatform::DWave);
predictor.record_result(&make_result(QuantumPlatform::DWave, 0.85, 1.5, true));
let confidence_after_4 = predictor.confidence_score(&QuantumPlatform::DWave);
assert!(confidence_after_4 > confidence_after_3);
}
#[test]
fn performance_predictor_accuracy_reflects_real_outcome_consistency() {
let mut consistent = PerformancePredictor::new();
consistent.record_result(&make_result(QuantumPlatform::IBM, 0.9, 1.0, true));
consistent.record_result(&make_result(QuantumPlatform::IBM, 0.91, 1.0, true));
consistent.record_result(&make_result(QuantumPlatform::IBM, 0.89, 1.0, true));
let mut erratic = PerformancePredictor::new();
erratic.record_result(&make_result(QuantumPlatform::IBM, 0.1, 1.0, true));
erratic.record_result(&make_result(QuantumPlatform::IBM, 0.9, 1.0, true));
erratic.record_result(&make_result(QuantumPlatform::IBM, 0.2, 1.0, false));
let consistent_accuracy = consistent.model_accuracy(&QuantumPlatform::IBM);
let erratic_accuracy = erratic.model_accuracy(&QuantumPlatform::IBM);
assert!(
consistent_accuracy > erratic_accuracy,
"a platform with consistent real outcomes must score higher accuracy than an erratic one \
(consistent={consistent_accuracy}, erratic={erratic_accuracy})"
);
}
#[test]
fn cost_optimizer_recommends_the_real_cheapest_platform() {
let mut optimizer = CostOptimizer::new();
optimizer.record_cost(QuantumPlatform::DWave, 5.0);
optimizer.record_cost(QuantumPlatform::DWave, 7.0);
optimizer.record_cost(QuantumPlatform::IBM, 1.0);
optimizer.record_cost(QuantumPlatform::IBM, 2.0);
assert!((optimizer.estimate_cost(&QuantumPlatform::DWave).unwrap() - 6.0).abs() < 1e-9);
assert!((optimizer.estimate_cost(&QuantumPlatform::IBM).unwrap() - 1.5).abs() < 1e-9);
let candidates = vec![QuantumPlatform::DWave, QuantumPlatform::IBM];
let cheapest = optimizer
.recommend_cheapest(&candidates)
.expect("a cheapest platform should be found");
assert_eq!(*cheapest, QuantumPlatform::IBM);
}
#[test]
fn cost_optimizer_skips_platforms_with_no_recorded_history() {
let mut optimizer = CostOptimizer::new();
optimizer.record_cost(QuantumPlatform::IBM, 3.0);
assert!(optimizer.estimate_cost(&QuantumPlatform::DWave).is_none());
let candidates = vec![QuantumPlatform::DWave, QuantumPlatform::IBM];
let cheapest = optimizer
.recommend_cheapest(&candidates)
.expect("should still find the one platform with real history");
assert_eq!(*cheapest, QuantumPlatform::IBM);
}
}