1use std::collections::{BTreeMap, HashMap, HashSet, VecDeque};
8use std::sync::{Arc, Mutex, RwLock};
9use std::time::{Duration, Instant, SystemTime};
10
11use quantrs2_circuit::prelude::*;
12use quantrs2_core::{
13 error::{QuantRS2Error, QuantRS2Result},
14 gate::GateOp,
15 qubit::QubitId,
16};
17
18#[cfg(feature = "scirs2")]
20use scirs2_graph::{dijkstra_path, minimum_spanning_tree, Graph};
21#[cfg(feature = "scirs2")]
22use scirs2_optimize::{differential_evolution, minimize, OptimizeResult};
23#[cfg(feature = "scirs2")]
24use scirs2_stats::{corrcoef, mean, pearsonr, spearmanr, std};
25
26use scirs2_core::ndarray::{Array1, Array2, ArrayView1, ArrayView2};
27use serde::{Deserialize, Serialize};
28use tokio::sync::{Mutex as AsyncMutex, RwLock as AsyncRwLock};
29
30use crate::{
31 backend_traits::{query_backend_capabilities, BackendCapabilities},
32 job_scheduling::{JobPriority, QuantumJobScheduler, SchedulingStrategy},
33 translation::HardwareBackend,
34 DeviceError, DeviceResult,
35};
36
37#[derive(Debug, Clone, Serialize, Deserialize)]
39pub struct CostOptimizationConfig {
40 pub budget_config: BudgetConfig,
42 pub estimation_config: CostEstimationConfig,
44 pub optimization_strategy: CostOptimizationStrategy,
46 pub provider_comparison: ProviderComparisonConfig,
48 pub predictive_modeling: PredictiveModelingConfig,
50 pub resource_optimization: ResourceOptimizationConfig,
52 pub monitoring_config: CostMonitoringConfig,
54 pub alert_config: CostAlertConfig,
56}
57
58#[derive(Debug, Clone, Serialize, Deserialize)]
60pub struct BudgetConfig {
61 pub total_budget: f64,
63 pub daily_budget: Option<f64>,
65 pub monthly_budget: Option<f64>,
67 pub provider_budgets: HashMap<HardwareBackend, f64>,
69 pub circuit_type_budgets: HashMap<String, f64>,
71 pub auto_budget_management: bool,
73 pub rollover_policy: BudgetRolloverPolicy,
75}
76
77#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
79pub enum BudgetRolloverPolicy {
80 NoRollover,
82 FullRollover,
84 PercentageRollover(f64),
86 FixedAmountRollover(f64),
88 CappedRollover { percentage: f64, max_amount: f64 },
90}
91
92#[derive(Debug, Clone, Serialize, Deserialize)]
94pub struct CostEstimationConfig {
95 pub provider_models: HashMap<HardwareBackend, CostModel>,
97 pub include_queue_time: bool,
99 pub include_overhead_costs: bool,
101 pub accuracy_target: f64,
103 pub model_update_frequency: Duration,
105 pub enable_ml_estimation: bool,
107 pub data_retention_period: Duration,
109}
110
111#[derive(Debug, Clone, Serialize, Deserialize)]
113pub struct CostModel {
114 pub model_type: CostModelType,
116 pub base_cost_per_shot: f64,
118 pub cost_per_qubit: f64,
120 pub cost_per_gate: f64,
122 pub cost_per_second: f64,
124 pub setup_cost: f64,
126 pub queue_time_multiplier: f64,
128 pub time_based_pricing: Option<TimeBasedPricing>,
130 pub volume_discounts: Vec<VolumeDiscount>,
132 pub custom_factors: HashMap<String, f64>,
134}
135
136#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
138pub enum CostModelType {
139 Linear,
141 StepBased,
143 Exponential,
145 Custom(String),
147 MachineLearning,
149 Hybrid(Vec<CostModelType>),
151}
152
153#[derive(Debug, Clone, Serialize, Deserialize)]
155pub struct TimeBasedPricing {
156 pub peak_multiplier: f64,
158 pub off_peak_multiplier: f64,
160 pub peak_hours: Vec<(u8, u8)>, pub weekend_multiplier: Option<f64>,
164 pub holiday_multiplier: Option<f64>,
166}
167
168#[derive(Debug, Clone, Serialize, Deserialize)]
170pub struct VolumeDiscount {
171 pub min_volume: f64,
173 pub max_volume: Option<f64>,
175 pub discount_percentage: f64,
177 pub discount_type: DiscountType,
179}
180
181#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
183pub enum DiscountType {
184 Percentage,
186 FixedAmount,
188 TieredPricing,
190 Custom(String),
192}
193
194#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
196pub enum CostOptimizationStrategy {
197 MinimizeCost,
199 MaximizeCostPerformance,
201 BudgetConstrained,
203 MetricOptimized {
205 cost_weight: f64,
206 time_weight: f64,
207 quality_weight: f64,
208 },
209 MLOptimized,
211 SciRS2Optimized {
213 objectives: Vec<String>,
214 constraints: Vec<String>,
215 },
216}
217
218#[derive(Debug, Clone, Serialize, Deserialize)]
220pub struct ProviderComparisonConfig {
221 pub comparison_metrics: Vec<ComparisonMetric>,
223 pub normalization_method: NormalizationMethod,
225 pub metric_weights: HashMap<ComparisonMetric, f64>,
227 pub real_time_comparison: bool,
229 pub update_frequency: Duration,
231 pub include_reliability: bool,
233}
234
235#[derive(Debug, Clone, PartialEq, Eq, Hash, Serialize, Deserialize)]
237pub enum ComparisonMetric {
238 TotalCost,
240 CostPerShot,
242 CostPerQubit,
244 QueueTime,
246 ExecutionTime,
248 Fidelity,
250 Availability,
252 Reliability,
254 Custom(String),
256}
257
258#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
260pub enum NormalizationMethod {
261 MinMax,
263 ZScore,
265 Robust,
267 Percentile(f64),
269 Custom(String),
271}
272
273#[derive(Debug, Clone, Serialize, Deserialize)]
275pub struct PredictiveModelingConfig {
276 pub enabled: bool,
278 pub prediction_horizon: Duration,
280 pub model_types: Vec<PredictiveModelType>,
282 pub feature_engineering: FeatureEngineeringConfig,
284 pub training_frequency: Duration,
286 pub confidence_threshold: f64,
288 pub enable_ensemble: bool,
290}
291
292#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
294pub enum PredictiveModelType {
295 LinearRegression,
297 RandomForest,
299 NeuralNetwork,
301 ARIMA,
303 SVM,
305 GradientBoosting,
307 SciRS2Enhanced,
309}
310
311#[derive(Debug, Clone, Serialize, Deserialize)]
313pub struct FeatureEngineeringConfig {
314 pub time_features: Vec<TimeFeature>,
316 pub circuit_features: Vec<CircuitFeature>,
318 pub provider_features: Vec<ProviderFeature>,
320 pub usage_features: Vec<UsageFeature>,
322 pub feature_selection: FeatureSelectionMethod,
324}
325
326#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
328pub enum TimeFeature {
329 HourOfDay,
330 DayOfWeek,
331 DayOfMonth,
332 Month,
333 Season,
334 IsWeekend,
335 IsHoliday,
336 TimeToDeadline,
337}
338
339#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
341pub enum CircuitFeature {
342 QubitCount,
343 GateCount,
344 CircuitDepth,
345 GateComplexity,
346 ConnectivityRequirements,
347 EstimatedFidelity,
348 CircuitType,
349}
350
351#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
353pub enum ProviderFeature {
354 ProviderType,
355 QueueLength,
356 SystemLoad,
357 ErrorRates,
358 Calibration,
359 Availability,
360 PastPerformance,
361}
362
363#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
365pub enum UsageFeature {
366 HistoricalCosts,
367 UsagePatterns,
368 PeakUsageTimes,
369 VolumeDiscounts,
370 BudgetUtilization,
371 CostTrends,
372}
373
374#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
376pub enum FeatureSelectionMethod {
377 All,
379 Correlation(f64),
381 MutualInformation,
383 RecursiveElimination,
385 L1Regularization,
387 Custom(Vec<String>),
389}
390
391#[derive(Debug, Clone, Serialize, Deserialize)]
393pub struct ResourceOptimizationConfig {
394 pub enabled: bool,
396 pub algorithms: Vec<ResourceOptimizationAlgorithm>,
398 pub constraints: Vec<ResourceConstraint>,
400 pub optimization_frequency: Duration,
402 pub enable_parallel_optimization: bool,
404 pub multi_objective_config: MultiObjectiveConfig,
406}
407
408#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
410pub enum ResourceOptimizationAlgorithm {
411 GeneticAlgorithm,
413 SimulatedAnnealing,
415 ParticleSwarmOptimization,
417 LinearProgramming,
419 IntegerProgramming,
421 ConstraintSatisfaction,
423 SciRS2Optimization,
425}
426
427#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
429pub enum ResourceConstraint {
430 Budget(f64),
432 Time(Duration),
434 Quality(f64),
436 Provider(Vec<HardwareBackend>),
438 Custom { name: String, value: f64 },
440}
441
442#[derive(Debug, Clone, Serialize, Deserialize)]
444pub struct MultiObjectiveConfig {
445 pub objectives: Vec<OptimizationObjective>,
447 pub pareto_config: ParetoConfig,
449 pub selection_strategy: SolutionSelectionStrategy,
451}
452
453#[derive(Debug, Clone, PartialEq, Eq, Hash, Serialize, Deserialize)]
455pub enum OptimizationObjective {
456 MinimizeCost,
457 MinimizeTime,
458 MaximizeQuality,
459 MaximizeReliability,
460 MinimizeRisk,
461 Custom(String),
462}
463
464#[derive(Debug, Clone, Serialize, Deserialize)]
466pub struct ParetoConfig {
467 pub max_solutions: usize,
469 pub convergence_criteria: ConvergenceCriteria,
471 pub diversity_preservation: bool,
473}
474
475#[derive(Debug, Clone, Serialize, Deserialize)]
477pub struct ConvergenceCriteria {
478 pub max_iterations: usize,
480 pub tolerance: f64,
482 pub patience: usize,
484}
485
486#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
488pub enum SolutionSelectionStrategy {
489 ByCost,
491 ByTime,
493 ByQuality,
495 Weighted(HashMap<OptimizationObjective, f64>),
497 UserPreference,
499}
500
501#[derive(Debug, Clone, Serialize, Deserialize)]
503pub struct CostMonitoringConfig {
504 pub real_time_monitoring: bool,
506 pub monitoring_frequency: Duration,
508 pub tracked_metrics: Vec<MonitoringMetric>,
510 pub reporting_config: CostReportingConfig,
512 pub dashboard_config: Option<DashboardConfig>,
514}
515
516#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
518pub enum MonitoringMetric {
519 TotalCost,
520 CostPerProvider,
521 CostPerCircuit,
522 BudgetUtilization,
523 CostTrends,
524 CostEfficiency,
525 PredictionAccuracy,
526 OptimizationSavings,
527}
528
529#[derive(Debug, Clone, Serialize, Deserialize)]
531pub struct CostReportingConfig {
532 pub automated_reports: bool,
534 pub report_frequency: Duration,
536 pub report_types: Vec<ReportType>,
538 pub recipients: Vec<String>,
540 pub format: ReportFormat,
542}
543
544#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
546pub enum ReportType {
547 CostSummary,
548 BudgetAnalysis,
549 ProviderComparison,
550 TrendAnalysis,
551 OptimizationReport,
552 ForecastReport,
553 AnomalyReport,
554}
555
556#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
558pub enum ReportFormat {
559 PDF,
560 HTML,
561 JSON,
562 CSV,
563 Excel,
564}
565
566#[derive(Debug, Clone, Serialize, Deserialize)]
568pub struct DashboardConfig {
569 pub enabled: bool,
571 pub update_frequency: Duration,
573 pub widgets: Vec<DashboardWidget>,
575 pub custom_visualizations: Vec<CustomVisualization>,
577}
578
579#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
581pub enum DashboardWidget {
582 CostGauge,
583 BudgetProgress,
584 ProviderComparison,
585 CostTrends,
586 TopCostConsumers,
587 OptimizationSavings,
588 PredictionAccuracy,
589}
590
591#[derive(Debug, Clone, Serialize, Deserialize)]
593pub struct CustomVisualization {
594 pub name: String,
596 pub chart_type: ChartType,
598 pub data_source: String,
600 pub parameters: HashMap<String, serde_json::Value>,
602}
603
604#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
606pub enum ChartType {
607 LineChart,
608 BarChart,
609 PieChart,
610 Histogram,
611 ScatterPlot,
612 Heatmap,
613 TreeMap,
614 Gauge,
615}
616
617#[derive(Debug, Clone, Serialize, Deserialize)]
619pub struct CostAlertConfig {
620 pub enabled: bool,
622 pub alert_rules: Vec<CostAlertRule>,
624 pub notification_channels: Vec<NotificationChannel>,
626 pub aggregation_config: AlertAggregationConfig,
628}
629
630#[derive(Debug, Clone, Serialize, Deserialize)]
632pub struct CostAlertRule {
633 pub name: String,
635 pub condition: AlertCondition,
637 pub severity: AlertSeverity,
639 pub frequency: NotificationFrequency,
641 pub enabled: bool,
643}
644
645#[derive(Debug, Clone, Serialize, Deserialize)]
647pub enum AlertCondition {
648 BudgetThreshold { threshold: f64, percentage: bool },
650 CostSpike { multiplier: f64, window: Duration },
652 PredictionError { threshold: f64 },
654 OptimizationOpportunity { savings_threshold: f64 },
656 Custom { expression: String },
658}
659
660#[derive(Debug, Clone, PartialEq, Eq, PartialOrd, Ord, Serialize, Deserialize)]
662pub enum AlertSeverity {
663 Info,
664 Warning,
665 Error,
666 Critical,
667}
668
669#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
671pub enum NotificationFrequency {
672 Immediate,
673 Throttled(Duration),
674 Daily,
675 Weekly,
676 Custom(Duration),
677}
678
679#[derive(Debug, Clone, Serialize, Deserialize)]
681pub enum NotificationChannel {
682 Email {
683 recipients: Vec<String>,
684 template: String,
685 },
686 Slack {
687 webhook_url: String,
688 channel: String,
689 },
690 Webhook {
691 url: String,
692 headers: HashMap<String, String>,
693 },
694 SMS {
695 phone_numbers: Vec<String>,
696 },
697}
698
699#[derive(Debug, Clone, Serialize, Deserialize)]
701pub struct AlertAggregationConfig {
702 pub enabled: bool,
704 pub window: Duration,
706 pub max_alerts_per_window: usize,
708 pub strategy: AggregationStrategy,
710}
711
712#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
714pub enum AggregationStrategy {
715 Count,
716 SeverityBased,
717 TypeBased,
718 Custom(String),
719}
720
721impl Default for CostOptimizationConfig {
722 fn default() -> Self {
723 Self {
724 budget_config: BudgetConfig {
725 total_budget: 10000.0,
726 daily_budget: Some(100.0),
727 monthly_budget: Some(3000.0),
728 provider_budgets: HashMap::new(),
729 circuit_type_budgets: HashMap::new(),
730 auto_budget_management: true,
731 rollover_policy: BudgetRolloverPolicy::PercentageRollover(0.2),
732 },
733 estimation_config: CostEstimationConfig {
734 provider_models: HashMap::new(),
735 include_queue_time: true,
736 include_overhead_costs: true,
737 accuracy_target: 0.9,
738 model_update_frequency: Duration::from_secs(3600),
739 enable_ml_estimation: true,
740 data_retention_period: Duration::from_secs(30 * 24 * 3600), },
742 optimization_strategy: CostOptimizationStrategy::MaximizeCostPerformance,
743 provider_comparison: ProviderComparisonConfig {
744 comparison_metrics: vec![
745 ComparisonMetric::TotalCost,
746 ComparisonMetric::QueueTime,
747 ComparisonMetric::Fidelity,
748 ],
749 normalization_method: NormalizationMethod::MinMax,
750 metric_weights: HashMap::new(),
751 real_time_comparison: true,
752 update_frequency: Duration::from_secs(300),
753 include_reliability: true,
754 },
755 predictive_modeling: PredictiveModelingConfig {
756 enabled: true,
757 prediction_horizon: Duration::from_secs(24 * 3600), model_types: vec![
759 PredictiveModelType::RandomForest,
760 PredictiveModelType::SciRS2Enhanced,
761 ],
762 feature_engineering: FeatureEngineeringConfig {
763 time_features: vec![TimeFeature::HourOfDay, TimeFeature::DayOfWeek],
764 circuit_features: vec![CircuitFeature::QubitCount, CircuitFeature::GateCount],
765 provider_features: vec![
766 ProviderFeature::QueueLength,
767 ProviderFeature::SystemLoad,
768 ],
769 usage_features: vec![
770 UsageFeature::HistoricalCosts,
771 UsageFeature::UsagePatterns,
772 ],
773 feature_selection: FeatureSelectionMethod::Correlation(0.1),
774 },
775 training_frequency: Duration::from_secs(24 * 3600),
776 confidence_threshold: 0.8,
777 enable_ensemble: true,
778 },
779 resource_optimization: ResourceOptimizationConfig {
780 enabled: true,
781 algorithms: vec![ResourceOptimizationAlgorithm::SciRS2Optimization],
782 constraints: vec![],
783 optimization_frequency: Duration::from_secs(3600),
784 enable_parallel_optimization: true,
785 multi_objective_config: MultiObjectiveConfig {
786 objectives: vec![
787 OptimizationObjective::MinimizeCost,
788 OptimizationObjective::MaximizeQuality,
789 ],
790 pareto_config: ParetoConfig {
791 max_solutions: 100,
792 convergence_criteria: ConvergenceCriteria {
793 max_iterations: 1000,
794 tolerance: 1e-6,
795 patience: 50,
796 },
797 diversity_preservation: true,
798 },
799 selection_strategy: SolutionSelectionStrategy::Weighted(
800 [
801 (OptimizationObjective::MinimizeCost, 0.6),
802 (OptimizationObjective::MaximizeQuality, 0.4),
803 ]
804 .iter()
805 .cloned()
806 .collect(),
807 ),
808 },
809 },
810 monitoring_config: CostMonitoringConfig {
811 real_time_monitoring: true,
812 monitoring_frequency: Duration::from_secs(60),
813 tracked_metrics: vec![
814 MonitoringMetric::TotalCost,
815 MonitoringMetric::BudgetUtilization,
816 MonitoringMetric::CostEfficiency,
817 ],
818 reporting_config: CostReportingConfig {
819 automated_reports: true,
820 report_frequency: Duration::from_secs(24 * 3600), report_types: vec![ReportType::CostSummary, ReportType::BudgetAnalysis],
822 recipients: vec![],
823 format: ReportFormat::JSON,
824 },
825 dashboard_config: Some(DashboardConfig {
826 enabled: true,
827 update_frequency: Duration::from_secs(30),
828 widgets: vec![
829 DashboardWidget::CostGauge,
830 DashboardWidget::BudgetProgress,
831 DashboardWidget::ProviderComparison,
832 ],
833 custom_visualizations: vec![],
834 }),
835 },
836 alert_config: CostAlertConfig {
837 enabled: true,
838 alert_rules: vec![CostAlertRule {
839 name: "Budget threshold".to_string(),
840 condition: AlertCondition::BudgetThreshold {
841 threshold: 80.0,
842 percentage: true,
843 },
844 severity: AlertSeverity::Warning,
845 frequency: NotificationFrequency::Immediate,
846 enabled: true,
847 }],
848 notification_channels: vec![],
849 aggregation_config: AlertAggregationConfig {
850 enabled: true,
851 window: Duration::from_secs(300),
852 max_alerts_per_window: 5,
853 strategy: AggregationStrategy::SeverityBased,
854 },
855 },
856 }
857 }
858}
859
860#[derive(Debug, Clone, Serialize, Deserialize)]
862pub struct CostEstimate {
863 pub total_cost: f64,
865 pub cost_breakdown: CostBreakdown,
867 pub confidence_interval: (f64, f64),
869 pub metadata: CostEstimationMetadata,
871}
872
873#[derive(Debug, Clone, Serialize, Deserialize)]
875pub struct CostBreakdown {
876 pub execution_cost: f64,
878 pub queue_cost: f64,
880 pub setup_cost: f64,
882 pub data_transfer_cost: f64,
884 pub storage_cost: f64,
886 pub additional_fees: HashMap<String, f64>,
888}
889
890#[derive(Debug, Clone, Serialize, Deserialize)]
892pub struct CostEstimationMetadata {
893 pub model_used: String,
895 pub timestamp: SystemTime,
897 pub confidence_level: f64,
899 pub historical_accuracy: Option<f64>,
901 pub factors_considered: Vec<String>,
903}
904
905#[derive(Debug, Clone, Serialize, Deserialize)]
907pub struct ProviderComparisonResult {
908 pub provider_scores: HashMap<HardwareBackend, f64>,
910 pub detailed_metrics: HashMap<HardwareBackend, ProviderMetrics>,
912 pub recommended_provider: HardwareBackend,
914 pub timestamp: SystemTime,
916}
917
918#[derive(Debug, Clone, Serialize, Deserialize)]
920pub struct ProviderMetrics {
921 pub cost_metrics: HashMap<ComparisonMetric, f64>,
923 pub performance_metrics: HashMap<String, f64>,
925 pub reliability_metrics: HashMap<String, f64>,
927 pub overall_score: f64,
929}
930
931#[derive(Debug, Clone, Serialize, Deserialize)]
933pub struct BudgetStatus {
934 pub total_budget: f64,
936 pub used_budget: f64,
938 pub remaining_budget: f64,
940 pub utilization_percentage: f64,
942 pub daily_status: Option<DailyBudgetStatus>,
944 pub monthly_status: Option<MonthlyBudgetStatus>,
946 pub provider_breakdown: HashMap<HardwareBackend, f64>,
948}
949
950#[derive(Debug, Clone, Serialize, Deserialize)]
952pub struct DailyBudgetStatus {
953 pub daily_budget: f64,
954 pub daily_used: f64,
955 pub daily_remaining: f64,
956 pub projected_daily_usage: f64,
957}
958
959#[derive(Debug, Clone, Serialize, Deserialize)]
961pub struct MonthlyBudgetStatus {
962 pub monthly_budget: f64,
963 pub monthly_used: f64,
964 pub monthly_remaining: f64,
965 pub projected_monthly_usage: f64,
966}
967
968pub struct CostOptimizationEngine {
970 config: CostOptimizationConfig,
971 cost_estimator: Arc<RwLock<CostEstimator>>,
972 budget_manager: Arc<RwLock<BudgetManager>>,
973 provider_comparator: Arc<RwLock<ProviderComparator>>,
974 predictive_modeler: Arc<RwLock<PredictiveModeler>>,
975 resource_optimizer: Arc<RwLock<ResourceOptimizer>>,
976 cost_monitor: Arc<RwLock<CostMonitor>>,
977 alert_manager: Arc<RwLock<AlertManager>>,
978 optimization_cache: Arc<RwLock<HashMap<String, CachedOptimization>>>,
979}
980
981pub struct CostEstimator {
983 models: HashMap<HardwareBackend, CostModel>,
984 historical_data: VecDeque<CostRecord>,
985 ml_models: HashMap<String, Box<dyn MLCostModel + Send + Sync>>,
986 estimation_cache: HashMap<String, CachedEstimate>,
987}
988
989#[derive(Debug, Clone, Serialize, Deserialize)]
991pub struct CostRecord {
992 pub provider: HardwareBackend,
993 pub circuit_hash: String,
994 pub actual_cost: f64,
995 pub estimated_cost: f64,
996 pub execution_time: Duration,
997 pub timestamp: SystemTime,
998 pub metadata: HashMap<String, String>,
999}
1000
1001#[derive(Debug, Clone)]
1003struct CachedEstimate {
1004 estimate: CostEstimate,
1005 created_at: SystemTime,
1006 access_count: usize,
1007}
1008
1009pub trait MLCostModel {
1011 fn predict(&self, features: &Array1<f64>) -> DeviceResult<f64>;
1012 fn train(&mut self, features: &Array2<f64>, targets: &Array1<f64>) -> DeviceResult<()>;
1013 fn get_feature_importance(&self) -> DeviceResult<Array1<f64>>;
1014}
1015
1016pub struct BudgetManager {
1018 current_budget: BudgetStatus,
1019 budget_history: VecDeque<BudgetSnapshot>,
1020 spending_patterns: HashMap<String, SpendingPattern>,
1021 budget_alerts: Vec<ActiveBudgetAlert>,
1022}
1023
1024#[derive(Debug, Clone, Serialize, Deserialize)]
1026struct BudgetSnapshot {
1027 timestamp: SystemTime,
1028 budget_status: BudgetStatus,
1029 period_type: BudgetPeriod,
1030}
1031
1032#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
1034enum BudgetPeriod {
1035 Daily,
1036 Weekly,
1037 Monthly,
1038 Quarterly,
1039 Yearly,
1040}
1041
1042#[derive(Debug, Clone, Serialize, Deserialize)]
1044struct SpendingPattern {
1045 pattern_type: PatternType,
1046 frequency: f64,
1047 amplitude: f64,
1048 trend: f64,
1049 seasonality: Option<SeasonalityPattern>,
1050}
1051
1052#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
1054enum PatternType {
1055 Constant,
1056 Linear,
1057 Exponential,
1058 Periodic,
1059 Random,
1060 Composite,
1061}
1062
1063#[derive(Debug, Clone, Serialize, Deserialize)]
1065struct SeasonalityPattern {
1066 period: Duration,
1067 phase: f64,
1068 strength: f64,
1069}
1070
1071#[derive(Debug, Clone)]
1073struct ActiveBudgetAlert {
1074 rule: CostAlertRule,
1075 triggered_at: SystemTime,
1076 last_notification: SystemTime,
1077 trigger_count: usize,
1078}
1079
1080pub struct ProviderComparator {
1082 comparison_cache: HashMap<String, CachedComparison>,
1083 real_time_metrics: HashMap<HardwareBackend, RealTimeMetrics>,
1084 reliability_tracker: ReliabilityTracker,
1085}
1086
1087#[derive(Debug, Clone)]
1089struct CachedComparison {
1090 result: ProviderComparisonResult,
1091 created_at: SystemTime,
1092 cache_key: String,
1093}
1094
1095#[derive(Debug, Clone, Serialize, Deserialize)]
1097struct RealTimeMetrics {
1098 current_queue_length: usize,
1099 average_execution_time: Duration,
1100 current_error_rate: f64,
1101 availability_status: AvailabilityStatus,
1102 cost_fluctuation: f64,
1103 last_updated: SystemTime,
1104}
1105
1106#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
1108enum AvailabilityStatus {
1109 Available,
1110 Busy,
1111 Maintenance,
1112 Unavailable,
1113}
1114
1115pub struct ReliabilityTracker {
1117 provider_reliability: HashMap<HardwareBackend, ReliabilityMetrics>,
1118 incident_history: VecDeque<ReliabilityIncident>,
1119}
1120
1121#[derive(Debug, Clone, Serialize, Deserialize)]
1123struct ReliabilityMetrics {
1124 uptime_percentage: f64,
1125 mean_time_between_failures: Duration,
1126 mean_time_to_recovery: Duration,
1127 error_rate_trend: f64,
1128 consistency_score: f64,
1129}
1130
1131#[derive(Debug, Clone, Serialize, Deserialize)]
1133struct ReliabilityIncident {
1134 provider: HardwareBackend,
1135 incident_type: IncidentType,
1136 start_time: SystemTime,
1137 end_time: Option<SystemTime>,
1138 impact_severity: IncidentSeverity,
1139 description: String,
1140}
1141
1142#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
1144enum IncidentType {
1145 Outage,
1146 Degradation,
1147 Maintenance,
1148 ErrorSpike,
1149 QueueOverload,
1150}
1151
1152#[derive(Debug, Clone, PartialEq, Eq, PartialOrd, Ord, Serialize, Deserialize)]
1154enum IncidentSeverity {
1155 Low,
1156 Medium,
1157 High,
1158 Critical,
1159}
1160
1161pub struct PredictiveModeler {
1163 models: HashMap<String, Box<dyn PredictiveModel + Send + Sync>>,
1164 feature_store: FeatureStore,
1165 model_performance: HashMap<String, ModelPerformance>,
1166 ensemble_config: EnsembleConfig,
1167}
1168
1169pub trait PredictiveModel {
1171 fn predict(&self, features: &HashMap<String, f64>) -> DeviceResult<PredictionResult>;
1172 fn train(&mut self, training_data: &TrainingData) -> DeviceResult<TrainingResult>;
1173 fn get_feature_importance(&self) -> DeviceResult<HashMap<String, f64>>;
1174 fn cross_validate(
1175 &self,
1176 data: &TrainingData,
1177 folds: usize,
1178 ) -> DeviceResult<CrossValidationResult>;
1179}
1180
1181#[derive(Debug, Clone, Serialize, Deserialize)]
1183pub struct PredictionResult {
1184 pub predicted_value: f64,
1185 pub confidence_interval: (f64, f64),
1186 pub feature_contributions: HashMap<String, f64>,
1187 pub model_used: String,
1188 pub prediction_timestamp: SystemTime,
1189}
1190
1191#[derive(Debug, Clone)]
1193pub struct TrainingData {
1194 pub features: Array2<f64>,
1195 pub targets: Array1<f64>,
1196 pub feature_names: Vec<String>,
1197 pub timestamps: Vec<SystemTime>,
1198}
1199
1200#[derive(Debug, Clone, Serialize, Deserialize)]
1202pub struct TrainingResult {
1203 pub training_score: f64,
1204 pub validation_score: f64,
1205 pub feature_importance: HashMap<String, f64>,
1206 pub training_time: Duration,
1207 pub model_parameters: HashMap<String, f64>,
1208}
1209
1210#[derive(Debug, Clone, Serialize, Deserialize)]
1212pub struct CrossValidationResult {
1213 pub mean_score: f64,
1214 pub std_score: f64,
1215 pub fold_scores: Vec<f64>,
1216 pub best_parameters: HashMap<String, f64>,
1217}
1218
1219pub struct FeatureStore {
1221 features: HashMap<String, FeatureTimeSeries>,
1222 feature_metadata: HashMap<String, FeatureMetadata>,
1223 derived_features: HashMap<String, DerivedFeature>,
1224}
1225
1226#[derive(Debug, Clone)]
1228struct FeatureTimeSeries {
1229 values: VecDeque<(SystemTime, f64)>,
1230 statistics: FeatureStatistics,
1231}
1232
1233#[derive(Debug, Clone, Serialize, Deserialize)]
1235struct FeatureStatistics {
1236 mean: f64,
1237 std: f64,
1238 min: f64,
1239 max: f64,
1240 trend: f64,
1241 autocorrelation: f64,
1242}
1243
1244#[derive(Debug, Clone, Serialize, Deserialize)]
1246struct FeatureMetadata {
1247 name: String,
1248 description: String,
1249 data_type: FeatureDataType,
1250 update_frequency: Duration,
1251 importance_score: f64,
1252}
1253
1254#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
1256enum FeatureDataType {
1257 Numerical,
1258 Categorical,
1259 Binary,
1260 TimeStamp,
1261 Text,
1262}
1263
1264struct DerivedFeature {
1266 name: String,
1267 computation: Box<dyn Fn(&HashMap<String, f64>) -> f64 + Send + Sync>,
1268 dependencies: Vec<String>,
1269}
1270
1271impl std::fmt::Debug for DerivedFeature {
1272 fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
1273 f.debug_struct("DerivedFeature")
1274 .field("name", &self.name)
1275 .field("computation", &"<function>")
1276 .field("dependencies", &self.dependencies)
1277 .finish()
1278 }
1279}
1280
1281impl Clone for DerivedFeature {
1282 fn clone(&self) -> Self {
1283 Self {
1285 name: self.name.clone(),
1286 computation: Box::new(|_| 0.0),
1287 dependencies: self.dependencies.clone(),
1288 }
1289 }
1290}
1291
1292#[derive(Debug, Clone, Serialize, Deserialize)]
1294struct ModelPerformance {
1295 accuracy_metrics: AccuracyMetrics,
1296 performance_over_time: VecDeque<(SystemTime, f64)>,
1297 prediction_distribution: PredictionDistribution,
1298 feature_drift: HashMap<String, f64>,
1299}
1300
1301#[derive(Debug, Clone, Serialize, Deserialize)]
1303struct AccuracyMetrics {
1304 mae: f64, mse: f64, rmse: f64, mape: f64, r2_score: f64, }
1310
1311#[derive(Debug, Clone, Serialize, Deserialize)]
1313struct PredictionDistribution {
1314 histogram: Vec<(f64, usize)>,
1315 quantiles: HashMap<String, f64>,
1316 outlier_threshold: f64,
1317 outlier_count: usize,
1318}
1319
1320#[derive(Debug, Clone, Serialize, Deserialize)]
1322struct EnsembleConfig {
1323 ensemble_method: EnsembleMethod,
1324 model_weights: HashMap<String, f64>,
1325 voting_strategy: VotingStrategy,
1326 diversity_threshold: f64,
1327}
1328
1329#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
1331enum EnsembleMethod {
1332 Voting,
1333 Averaging,
1334 Stacking,
1335 Boosting,
1336 Bagging,
1337}
1338
1339#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
1341enum VotingStrategy {
1342 Majority,
1343 Weighted,
1344 Confidence,
1345 Dynamic,
1346}
1347
1348pub struct ResourceOptimizer {
1350 optimization_algorithms: HashMap<String, Box<dyn OptimizationAlgorithm + Send + Sync>>,
1351 constraint_solver: ConstraintSolver,
1352 optimization_history: VecDeque<OptimizationResult>,
1353 pareto_frontiers: HashMap<String, ParetoFrontier>,
1354}
1355
1356pub trait OptimizationAlgorithm {
1358 fn optimize(&self, problem: &OptimizationProblem) -> DeviceResult<OptimizationResult>;
1359 fn get_algorithm_info(&self) -> AlgorithmInfo;
1360 fn set_parameters(&mut self, parameters: HashMap<String, f64>) -> DeviceResult<()>;
1361}
1362
1363#[derive(Debug, Clone)]
1365pub struct OptimizationProblem {
1366 pub objectives: Vec<ObjectiveFunction>,
1367 pub constraints: Vec<Constraint>,
1368 pub variables: Vec<Variable>,
1369 pub problem_type: ProblemType,
1370}
1371
1372pub struct ObjectiveFunction {
1374 pub name: String,
1375 pub function: Box<dyn Fn(&[f64]) -> f64 + Send + Sync>,
1376 pub optimization_direction: OptimizationDirection,
1377 pub weight: f64,
1378}
1379
1380impl std::fmt::Debug for ObjectiveFunction {
1381 fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
1382 f.debug_struct("ObjectiveFunction")
1383 .field("name", &self.name)
1384 .field("function", &"<function>")
1385 .field("optimization_direction", &self.optimization_direction)
1386 .field("weight", &self.weight)
1387 .finish()
1388 }
1389}
1390
1391impl Clone for ObjectiveFunction {
1392 fn clone(&self) -> Self {
1393 Self {
1394 name: self.name.clone(),
1395 function: Box::new(|_| 0.0),
1396 optimization_direction: self.optimization_direction.clone(),
1397 weight: self.weight,
1398 }
1399 }
1400}
1401
1402#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
1404pub enum OptimizationDirection {
1405 Minimize,
1406 Maximize,
1407}
1408
1409pub struct Constraint {
1411 pub name: String,
1412 pub constraint_function: Box<dyn Fn(&[f64]) -> f64 + Send + Sync>,
1413 pub constraint_type: ConstraintType,
1414 pub bound: f64,
1415}
1416
1417impl std::fmt::Debug for Constraint {
1418 fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
1419 f.debug_struct("Constraint")
1420 .field("name", &self.name)
1421 .field("constraint_function", &"<function>")
1422 .field("constraint_type", &self.constraint_type)
1423 .field("bound", &self.bound)
1424 .finish()
1425 }
1426}
1427
1428impl Clone for Constraint {
1429 fn clone(&self) -> Self {
1430 Self {
1431 name: self.name.clone(),
1432 constraint_function: Box::new(|_| 0.0),
1433 constraint_type: self.constraint_type.clone(),
1434 bound: self.bound,
1435 }
1436 }
1437}
1438
1439#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
1441pub enum ConstraintType {
1442 Equality,
1443 Inequality,
1444 Box,
1445}
1446
1447#[derive(Debug, Clone, Serialize, Deserialize)]
1449pub struct Variable {
1450 pub name: String,
1451 pub variable_type: VariableType,
1452 pub bounds: (f64, f64),
1453 pub initial_value: Option<f64>,
1454}
1455
1456#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
1458pub enum VariableType {
1459 Continuous,
1460 Integer,
1461 Binary,
1462}
1463
1464#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
1466pub enum ProblemType {
1467 LinearProgramming,
1468 QuadraticProgramming,
1469 NonlinearProgramming,
1470 IntegerProgramming,
1471 ConstraintSatisfaction,
1472 MultiObjective,
1473}
1474
1475#[derive(Debug, Clone, Serialize, Deserialize)]
1477pub struct OptimizationResult {
1478 pub solution: Vec<f64>,
1479 pub objective_values: Vec<f64>,
1480 pub constraint_violations: Vec<f64>,
1481 pub optimization_status: OptimizationStatus,
1482 pub iterations: usize,
1483 pub execution_time: Duration,
1484 pub algorithm_used: String,
1485}
1486
1487#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
1489pub enum OptimizationStatus {
1490 Optimal,
1491 Feasible,
1492 Infeasible,
1493 Unbounded,
1494 TimeLimit,
1495 IterationLimit,
1496 Error(String),
1497}
1498
1499#[derive(Debug, Clone, Serialize, Deserialize)]
1501pub struct AlgorithmInfo {
1502 pub name: String,
1503 pub description: String,
1504 pub problem_types: Vec<ProblemType>,
1505 pub parameters: HashMap<String, ParameterInfo>,
1506}
1507
1508#[derive(Debug, Clone, Serialize, Deserialize)]
1510pub struct ParameterInfo {
1511 pub name: String,
1512 pub description: String,
1513 pub parameter_type: ParameterType,
1514 pub default_value: f64,
1515 pub bounds: Option<(f64, f64)>,
1516}
1517
1518#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
1520pub enum ParameterType {
1521 Real,
1522 Integer,
1523 Boolean,
1524 Categorical(Vec<String>),
1525}
1526
1527pub struct ConstraintSolver {
1529 solver_type: SolverType,
1530 tolerance: f64,
1531 max_iterations: usize,
1532}
1533
1534#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
1536enum SolverType {
1537 Simplex,
1538 InteriorPoint,
1539 ActiveSet,
1540 BarrierMethod,
1541 AugmentedLagrangian,
1542}
1543
1544#[derive(Debug, Clone)]
1546pub struct ParetoFrontier {
1547 solutions: Vec<ParetoSolution>,
1548 objectives: Vec<String>,
1549 generation: usize,
1550 last_updated: SystemTime,
1551}
1552
1553#[derive(Debug, Clone, Serialize, Deserialize)]
1555pub struct ParetoSolution {
1556 pub variables: Vec<f64>,
1557 pub objectives: Vec<f64>,
1558 pub dominance_count: usize,
1559 pub crowding_distance: f64,
1560}
1561
1562pub struct CostMonitor {
1564 monitoring_metrics: HashMap<MonitoringMetric, MetricTimeSeries>,
1565 anomaly_detector: AnomalyDetector,
1566 trend_analyzer: TrendAnalyzer,
1567 dashboard_data: DashboardData,
1568}
1569
1570#[derive(Debug, Clone)]
1572struct MetricTimeSeries {
1573 data_points: VecDeque<(SystemTime, f64)>,
1574 sampling_frequency: Duration,
1575 aggregation_method: AggregationMethod,
1576 retention_period: Duration,
1577}
1578
1579#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
1581enum AggregationMethod {
1582 Average,
1583 Sum,
1584 Count,
1585 Min,
1586 Max,
1587 Median,
1588 Percentile(f64),
1589}
1590
1591pub struct AnomalyDetector {
1593 detection_methods: Vec<AnomalyDetectionMethod>,
1594 anomaly_threshold: f64,
1595 detected_anomalies: VecDeque<Anomaly>,
1596}
1597
1598#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
1600enum AnomalyDetectionMethod {
1601 StatisticalOutlier,
1602 IsolationForest,
1603 OneClassSVM,
1604 LocalOutlierFactor,
1605 DBSCAN,
1606 TimeSeriesDecomposition,
1607}
1608
1609#[derive(Debug, Clone, Serialize, Deserialize)]
1611struct Anomaly {
1612 metric: MonitoringMetric,
1613 timestamp: SystemTime,
1614 anomaly_score: f64,
1615 detected_value: f64,
1616 expected_value: f64,
1617 description: String,
1618}
1619
1620pub struct TrendAnalyzer {
1622 trend_models: HashMap<MonitoringMetric, TrendModel>,
1623 trend_detection_sensitivity: f64,
1624 forecasting_horizon: Duration,
1625}
1626
1627#[derive(Debug, Clone)]
1629struct TrendModel {
1630 model_type: TrendModelType,
1631 parameters: HashMap<String, f64>,
1632 goodness_of_fit: f64,
1633 last_updated: SystemTime,
1634}
1635
1636#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
1638enum TrendModelType {
1639 Linear,
1640 Exponential,
1641 Polynomial,
1642 Seasonal,
1643 ARIMA,
1644 ExponentialSmoothing,
1645}
1646
1647#[derive(Debug, Clone)]
1649struct DashboardData {
1650 widget_data: HashMap<DashboardWidget, serde_json::Value>,
1651 last_updated: SystemTime,
1652 update_frequency: Duration,
1653}
1654
1655pub struct AlertManager {
1657 active_alerts: HashMap<String, ActiveAlert>,
1658 alert_history: VecDeque<AlertHistoryEntry>,
1659 notification_handlers: HashMap<String, Box<dyn NotificationHandler + Send + Sync>>,
1660 escalation_policies: HashMap<AlertSeverity, EscalationPolicy>,
1661}
1662
1663#[derive(Debug, Clone)]
1665struct ActiveAlert {
1666 alert_id: String,
1667 rule: CostAlertRule,
1668 triggered_at: SystemTime,
1669 last_notification: SystemTime,
1670 escalation_level: usize,
1671 notification_count: usize,
1672 acknowledgment_status: AcknowledgmentStatus,
1673}
1674
1675#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
1677enum AcknowledgmentStatus {
1678 Unacknowledged,
1679 Acknowledged { by: String, at: SystemTime },
1680 Resolved { by: String, at: SystemTime },
1681}
1682
1683#[derive(Debug, Clone, Serialize, Deserialize)]
1685struct AlertHistoryEntry {
1686 alert_id: String,
1687 rule_name: String,
1688 triggered_at: SystemTime,
1689 resolved_at: Option<SystemTime>,
1690 duration: Option<Duration>,
1691 severity: AlertSeverity,
1692 notification_count: usize,
1693}
1694
1695pub trait NotificationHandler {
1697 fn send_notification(&self, alert: &ActiveAlert, message: &str) -> DeviceResult<()>;
1698 fn get_handler_info(&self) -> NotificationHandlerInfo;
1699}
1700
1701#[derive(Debug, Clone, Serialize, Deserialize)]
1703pub struct NotificationHandlerInfo {
1704 pub name: String,
1705 pub description: String,
1706 pub supported_formats: Vec<String>,
1707 pub delivery_guarantee: DeliveryGuarantee,
1708}
1709
1710#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
1712pub enum DeliveryGuarantee {
1713 BestEffort,
1714 AtLeastOnce,
1715 ExactlyOnce,
1716}
1717
1718#[derive(Debug, Clone, Serialize, Deserialize)]
1720struct EscalationPolicy {
1721 escalation_levels: Vec<EscalationLevel>,
1722 max_escalation_attempts: usize,
1723 escalation_timeout: Duration,
1724}
1725
1726#[derive(Debug, Clone, Serialize, Deserialize)]
1728struct EscalationLevel {
1729 level: usize,
1730 notification_channels: Vec<String>,
1731 delay: Duration,
1732 repeat_frequency: Option<Duration>,
1733}
1734
1735#[derive(Debug, Clone)]
1737struct CachedOptimization {
1738 result: OptimizationResult,
1739 input_hash: u64,
1740 created_at: SystemTime,
1741 access_count: usize,
1742 expiry_time: SystemTime,
1743}
1744
1745impl CostOptimizationEngine {
1746 pub fn new(config: CostOptimizationConfig) -> Self {
1748 Self {
1749 config: config.clone(),
1750 cost_estimator: Arc::new(RwLock::new(CostEstimator::new(&config.estimation_config))),
1751 budget_manager: Arc::new(RwLock::new(BudgetManager::new(&config.budget_config))),
1752 provider_comparator: Arc::new(RwLock::new(ProviderComparator::new(
1753 &config.provider_comparison,
1754 ))),
1755 predictive_modeler: Arc::new(RwLock::new(PredictiveModeler::new(
1756 &config.predictive_modeling,
1757 ))),
1758 resource_optimizer: Arc::new(RwLock::new(ResourceOptimizer::new(
1759 &config.resource_optimization,
1760 ))),
1761 cost_monitor: Arc::new(RwLock::new(CostMonitor::new(&config.monitoring_config))),
1762 alert_manager: Arc::new(RwLock::new(AlertManager::new(&config.alert_config))),
1763 optimization_cache: Arc::new(RwLock::new(HashMap::new())),
1764 }
1765 }
1766
1767 pub async fn estimate_cost<const N: usize>(
1769 &self,
1770 circuit: &Circuit<N>,
1771 provider: HardwareBackend,
1772 shots: usize,
1773 ) -> DeviceResult<CostEstimate> {
1774 let mut estimator = self.cost_estimator.write().map_err(|e| {
1775 DeviceError::LockError(format!(
1776 "Failed to acquire write lock on cost_estimator: {e}"
1777 ))
1778 })?;
1779 estimator.estimate_cost(circuit, provider, shots).await
1780 }
1781
1782 pub async fn compare_providers<const N: usize>(
1784 &self,
1785 circuit: &Circuit<N>,
1786 providers: Vec<HardwareBackend>,
1787 shots: usize,
1788 ) -> DeviceResult<ProviderComparisonResult> {
1789 let mut comparator = self.provider_comparator.write().map_err(|e| {
1790 DeviceError::LockError(format!(
1791 "Failed to acquire write lock on provider_comparator: {e}"
1792 ))
1793 })?;
1794 comparator
1795 .compare_providers(circuit, providers, shots)
1796 .await
1797 }
1798
1799 pub async fn optimize_resource_allocation(
1801 &self,
1802 requirements: &ResourceRequirements,
1803 ) -> DeviceResult<OptimizationResult> {
1804 let mut optimizer = self.resource_optimizer.write().map_err(|e| {
1805 DeviceError::LockError(format!(
1806 "Failed to acquire write lock on resource_optimizer: {e}"
1807 ))
1808 })?;
1809 optimizer.optimize_allocation(requirements).await
1810 }
1811
1812 pub async fn get_budget_status(&self) -> DeviceResult<BudgetStatus> {
1814 let budget_manager = self.budget_manager.read().map_err(|e| {
1815 DeviceError::LockError(format!(
1816 "Failed to acquire read lock on budget_manager: {e}"
1817 ))
1818 })?;
1819 Ok(budget_manager.get_current_status())
1820 }
1821
1822 pub async fn predict_costs(
1824 &self,
1825 prediction_horizon: Duration,
1826 features: HashMap<String, f64>,
1827 ) -> DeviceResult<PredictionResult> {
1828 let mut modeler = self.predictive_modeler.write().map_err(|e| {
1829 DeviceError::LockError(format!(
1830 "Failed to acquire write lock on predictive_modeler: {e}"
1831 ))
1832 })?;
1833 modeler.predict_costs(prediction_horizon, features).await
1834 }
1835
1836 pub async fn get_optimization_recommendations(
1838 &self,
1839 context: OptimizationContext,
1840 ) -> DeviceResult<Vec<OptimizationRecommendation>> {
1841 let budget_status = self.get_budget_status().await?;
1843 let cost_trends = self.analyze_cost_trends().await?;
1844
1845 let recommendations = self
1847 .generate_recommendations(&budget_status, &cost_trends, &context)
1848 .await?;
1849
1850 Ok(recommendations)
1851 }
1852
1853 pub async fn start_cost_monitoring(&self) -> DeviceResult<()> {
1855 let monitor = self.cost_monitor.clone();
1856 let alert_manager = self.alert_manager.clone();
1857
1858 tokio::spawn(async move {
1859 loop {
1860 {
1862 if let Ok(mut monitor_guard) = monitor.write() {
1863 monitor_guard.update_metrics_sync();
1867 }
1868 }
1869
1870 {
1872 if let Ok(mut alert_guard) = alert_manager.write() {
1873 alert_guard.check_and_trigger_alerts_sync();
1877 }
1878 }
1879
1880 tokio::time::sleep(Duration::from_secs(60)).await;
1881 }
1882 });
1883
1884 Ok(())
1885 }
1886
1887 async fn analyze_cost_trends(&self) -> DeviceResult<CostTrends> {
1890 Ok(CostTrends::default())
1892 }
1893
1894 async fn generate_recommendations(
1895 &self,
1896 budget_status: &BudgetStatus,
1897 cost_trends: &CostTrends,
1898 context: &OptimizationContext,
1899 ) -> DeviceResult<Vec<OptimizationRecommendation>> {
1900 Ok(vec![])
1902 }
1903}
1904
1905#[derive(Debug, Clone, Serialize, Deserialize)]
1907pub struct ResourceRequirements {
1908 pub circuits: Vec<CircuitRequirement>,
1909 pub budget_constraints: Vec<BudgetConstraint>,
1910 pub time_constraints: Vec<TimeConstraint>,
1911 pub quality_requirements: Vec<QualityRequirement>,
1912}
1913
1914#[derive(Debug, Clone, Serialize, Deserialize)]
1916pub struct CircuitRequirement {
1917 pub circuit_id: String,
1918 pub qubit_count: usize,
1919 pub gate_count: usize,
1920 pub shots: usize,
1921 pub priority: JobPriority,
1922 pub deadline: Option<SystemTime>,
1923}
1924
1925#[derive(Debug, Clone, Serialize, Deserialize)]
1927pub struct BudgetConstraint {
1928 pub constraint_type: BudgetConstraintType,
1929 pub value: f64,
1930 pub scope: ConstraintScope,
1931}
1932
1933#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
1935pub enum BudgetConstraintType {
1936 MaxTotalCost,
1937 MaxCostPerCircuit,
1938 MaxCostPerProvider,
1939 CostPerformanceRatio,
1940}
1941
1942#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
1944pub enum ConstraintScope {
1945 Global,
1946 PerProvider,
1947 PerCircuit,
1948 PerTimeWindow(Duration),
1949}
1950
1951#[derive(Debug, Clone, Serialize, Deserialize)]
1953pub struct TimeConstraint {
1954 pub constraint_type: TimeConstraintType,
1955 pub value: Duration,
1956 pub scope: ConstraintScope,
1957}
1958
1959#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
1961pub enum TimeConstraintType {
1962 MaxExecutionTime,
1963 MaxQueueTime,
1964 Deadline,
1965 PreferredWindow,
1966}
1967
1968#[derive(Debug, Clone, Serialize, Deserialize)]
1970pub struct QualityRequirement {
1971 pub requirement_type: QualityRequirementType,
1972 pub value: f64,
1973 pub scope: ConstraintScope,
1974}
1975
1976#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
1978pub enum QualityRequirementType {
1979 MinFidelity,
1980 MaxErrorRate,
1981 MinSuccessRate,
1982 ConsistencyLevel,
1983}
1984
1985#[derive(Debug, Clone, Serialize, Deserialize)]
1987pub struct OptimizationContext {
1988 pub user_preferences: UserPreferences,
1989 pub historical_patterns: HistoricalPatterns,
1990 pub current_workload: CurrentWorkload,
1991 pub market_conditions: MarketConditions,
1992}
1993
1994#[derive(Debug, Clone, Serialize, Deserialize)]
1996pub struct UserPreferences {
1997 pub cost_sensitivity: f64, pub time_sensitivity: f64,
1999 pub quality_sensitivity: f64,
2000 pub preferred_providers: Vec<HardwareBackend>,
2001 pub risk_tolerance: RiskTolerance,
2002}
2003
2004#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
2006pub enum RiskTolerance {
2007 Conservative,
2008 Moderate,
2009 Aggressive,
2010 Custom(f64),
2011}
2012
2013#[derive(Debug, Clone, Serialize, Deserialize)]
2015pub struct HistoricalPatterns {
2016 pub usage_frequency: HashMap<HardwareBackend, f64>,
2017 pub cost_patterns: HashMap<String, f64>,
2018 pub performance_history: HashMap<HardwareBackend, f64>,
2019 pub error_patterns: HashMap<String, f64>,
2020}
2021
2022#[derive(Debug, Clone, Serialize, Deserialize)]
2024pub struct CurrentWorkload {
2025 pub pending_circuits: usize,
2026 pub queue_lengths: HashMap<HardwareBackend, usize>,
2027 pub resource_utilization: HashMap<HardwareBackend, f64>,
2028 pub estimated_completion_times: HashMap<HardwareBackend, Duration>,
2029}
2030
2031#[derive(Debug, Clone, Serialize, Deserialize)]
2033pub struct MarketConditions {
2034 pub demand_levels: HashMap<HardwareBackend, DemandLevel>,
2035 pub pricing_trends: HashMap<HardwareBackend, PricingTrend>,
2036 pub capacity_utilization: HashMap<HardwareBackend, f64>,
2037 pub promotional_offers: Vec<PromotionalOffer>,
2038}
2039
2040#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
2042pub enum DemandLevel {
2043 Low,
2044 Normal,
2045 High,
2046 Peak,
2047}
2048
2049#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
2051pub enum PricingTrend {
2052 Decreasing,
2053 Stable,
2054 Increasing,
2055 Volatile,
2056}
2057
2058#[derive(Debug, Clone, Serialize, Deserialize)]
2060pub struct PromotionalOffer {
2061 pub provider: HardwareBackend,
2062 pub offer_type: OfferType,
2063 pub discount_percentage: f64,
2064 pub valid_until: SystemTime,
2065 pub conditions: Vec<String>,
2066}
2067
2068#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
2070pub enum OfferType {
2071 VolumeDiscount,
2072 FirstTimeUser,
2073 LoyaltyDiscount,
2074 OffPeakPricing,
2075 BundleOffer,
2076}
2077
2078#[derive(Debug, Clone, Default, Serialize, Deserialize)]
2080pub struct CostTrends {
2081 pub overall_trend: TrendDirection,
2082 pub provider_trends: HashMap<HardwareBackend, TrendDirection>,
2083 pub seasonal_patterns: Vec<SeasonalPattern>,
2084 pub anomalies: Vec<CostAnomaly>,
2085}
2086
2087#[derive(Debug, Clone, PartialEq, Default, Serialize, Deserialize)]
2089pub enum TrendDirection {
2090 Increasing,
2091 Decreasing,
2092 #[default]
2093 Stable,
2094 Volatile,
2095}
2096
2097#[derive(Debug, Clone, Serialize, Deserialize)]
2099pub struct SeasonalPattern {
2100 pub pattern_name: String,
2101 pub period: Duration,
2102 pub amplitude: f64,
2103 pub phase_offset: Duration,
2104}
2105
2106#[derive(Debug, Clone, Serialize, Deserialize)]
2108pub struct CostAnomaly {
2109 pub anomaly_type: AnomalyType,
2110 pub detected_at: SystemTime,
2111 pub severity: f64,
2112 pub description: String,
2113 pub affected_providers: Vec<HardwareBackend>,
2114}
2115
2116#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
2118pub enum AnomalyType {
2119 CostSpike,
2120 UnexpectedDiscount,
2121 ProviderOutage,
2122 QueueBottleneck,
2123 PerformanceDegradation,
2124}
2125
2126#[derive(Debug, Clone, Serialize, Deserialize)]
2128pub struct OptimizationRecommendation {
2129 pub recommendation_type: RecommendationType,
2130 pub description: String,
2131 pub estimated_savings: f64,
2132 pub implementation_effort: ImplementationEffort,
2133 pub confidence_score: f64,
2134 pub action_items: Vec<ActionItem>,
2135}
2136
2137#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
2139pub enum RecommendationType {
2140 ProviderSwitch,
2141 TimingOptimization,
2142 BatchingOptimization,
2143 ResourceReallocation,
2144 BudgetAdjustment,
2145 QualityTradeoff,
2146}
2147
2148#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
2150pub enum ImplementationEffort {
2151 Low,
2152 Medium,
2153 High,
2154 VeryHigh,
2155}
2156
2157#[derive(Debug, Clone, Serialize, Deserialize)]
2159pub struct ActionItem {
2160 pub description: String,
2161 pub priority: ActionPriority,
2162 pub estimated_time: Duration,
2163 pub required_resources: Vec<String>,
2164}
2165
2166#[derive(Debug, Clone, PartialEq, Eq, PartialOrd, Ord, Serialize, Deserialize)]
2168pub enum ActionPriority {
2169 Low,
2170 Medium,
2171 High,
2172 Critical,
2173}
2174
2175impl CostEstimator {
2177 fn new(_config: &CostEstimationConfig) -> Self {
2178 Self {
2179 models: HashMap::new(),
2180 historical_data: VecDeque::new(),
2181 ml_models: HashMap::new(),
2182 estimation_cache: HashMap::new(),
2183 }
2184 }
2185
2186 async fn estimate_cost<const N: usize>(
2187 &mut self,
2188 _circuit: &Circuit<N>,
2189 _provider: HardwareBackend,
2190 _shots: usize,
2191 ) -> DeviceResult<CostEstimate> {
2192 Ok(CostEstimate {
2194 total_cost: 10.0,
2195 cost_breakdown: CostBreakdown {
2196 execution_cost: 8.0,
2197 queue_cost: 1.0,
2198 setup_cost: 0.5,
2199 data_transfer_cost: 0.3,
2200 storage_cost: 0.2,
2201 additional_fees: HashMap::new(),
2202 },
2203 confidence_interval: (9.0, 11.0),
2204 metadata: CostEstimationMetadata {
2205 model_used: "linear".to_string(),
2206 timestamp: SystemTime::now(),
2207 confidence_level: 0.95,
2208 historical_accuracy: Some(0.92),
2209 factors_considered: vec!["shots".to_string(), "qubits".to_string()],
2210 },
2211 })
2212 }
2213}
2214
2215impl BudgetManager {
2216 fn new(_config: &BudgetConfig) -> Self {
2217 Self {
2218 current_budget: BudgetStatus {
2219 total_budget: 10000.0,
2220 used_budget: 2500.0,
2221 remaining_budget: 7500.0,
2222 utilization_percentage: 25.0,
2223 daily_status: None,
2224 monthly_status: None,
2225 provider_breakdown: HashMap::new(),
2226 },
2227 budget_history: VecDeque::new(),
2228 spending_patterns: HashMap::new(),
2229 budget_alerts: Vec::new(),
2230 }
2231 }
2232
2233 fn get_current_status(&self) -> BudgetStatus {
2234 self.current_budget.clone()
2235 }
2236}
2237
2238impl ProviderComparator {
2239 fn new(_config: &ProviderComparisonConfig) -> Self {
2240 Self {
2241 comparison_cache: HashMap::new(),
2242 real_time_metrics: HashMap::new(),
2243 reliability_tracker: ReliabilityTracker {
2244 provider_reliability: HashMap::new(),
2245 incident_history: VecDeque::new(),
2246 },
2247 }
2248 }
2249
2250 async fn compare_providers<const N: usize>(
2251 &mut self,
2252 _circuit: &Circuit<N>,
2253 providers: Vec<HardwareBackend>,
2254 _shots: usize,
2255 ) -> DeviceResult<ProviderComparisonResult> {
2256 let mut provider_scores = HashMap::new();
2258 let mut detailed_metrics = HashMap::new();
2259
2260 for provider in &providers {
2261 provider_scores.insert(*provider, 0.8);
2262 detailed_metrics.insert(
2263 *provider,
2264 ProviderMetrics {
2265 cost_metrics: HashMap::new(),
2266 performance_metrics: HashMap::new(),
2267 reliability_metrics: HashMap::new(),
2268 overall_score: 0.8,
2269 },
2270 );
2271 }
2272
2273 Ok(ProviderComparisonResult {
2274 provider_scores,
2275 detailed_metrics,
2276 recommended_provider: providers[0],
2277 timestamp: SystemTime::now(),
2278 })
2279 }
2280}
2281
2282impl PredictiveModeler {
2283 fn new(_config: &PredictiveModelingConfig) -> Self {
2284 Self {
2285 models: HashMap::new(),
2286 feature_store: FeatureStore {
2287 features: HashMap::new(),
2288 feature_metadata: HashMap::new(),
2289 derived_features: HashMap::new(),
2290 },
2291 model_performance: HashMap::new(),
2292 ensemble_config: EnsembleConfig {
2293 ensemble_method: EnsembleMethod::Averaging,
2294 model_weights: HashMap::new(),
2295 voting_strategy: VotingStrategy::Weighted,
2296 diversity_threshold: 0.1,
2297 },
2298 }
2299 }
2300
2301 async fn predict_costs(
2302 &mut self,
2303 _prediction_horizon: Duration,
2304 _features: HashMap<String, f64>,
2305 ) -> DeviceResult<PredictionResult> {
2306 Ok(PredictionResult {
2308 predicted_value: 15.0,
2309 confidence_interval: (12.0, 18.0),
2310 feature_contributions: HashMap::new(),
2311 model_used: "ensemble".to_string(),
2312 prediction_timestamp: SystemTime::now(),
2313 })
2314 }
2315}
2316
2317impl ResourceOptimizer {
2318 fn new(_config: &ResourceOptimizationConfig) -> Self {
2319 Self {
2320 optimization_algorithms: HashMap::new(),
2321 constraint_solver: ConstraintSolver {
2322 solver_type: SolverType::InteriorPoint,
2323 tolerance: 1e-6,
2324 max_iterations: 1000,
2325 },
2326 optimization_history: VecDeque::new(),
2327 pareto_frontiers: HashMap::new(),
2328 }
2329 }
2330
2331 async fn optimize_allocation(
2332 &mut self,
2333 _requirements: &ResourceRequirements,
2334 ) -> DeviceResult<OptimizationResult> {
2335 Ok(OptimizationResult {
2337 solution: vec![0.8, 0.2],
2338 objective_values: vec![12.5],
2339 constraint_violations: vec![],
2340 optimization_status: OptimizationStatus::Optimal,
2341 iterations: 25,
2342 execution_time: Duration::from_millis(150),
2343 algorithm_used: "interior_point".to_string(),
2344 })
2345 }
2346}
2347
2348impl CostMonitor {
2349 fn new(_config: &CostMonitoringConfig) -> Self {
2350 Self {
2351 monitoring_metrics: HashMap::new(),
2352 anomaly_detector: AnomalyDetector {
2353 detection_methods: vec![AnomalyDetectionMethod::StatisticalOutlier],
2354 anomaly_threshold: 2.0,
2355 detected_anomalies: VecDeque::new(),
2356 },
2357 trend_analyzer: TrendAnalyzer {
2358 trend_models: HashMap::new(),
2359 trend_detection_sensitivity: 0.1,
2360 forecasting_horizon: Duration::from_secs(24 * 3600),
2361 },
2362 dashboard_data: DashboardData {
2363 widget_data: HashMap::new(),
2364 last_updated: SystemTime::now(),
2365 update_frequency: Duration::from_secs(30),
2366 },
2367 }
2368 }
2369
2370 async fn update_metrics(&mut self) {
2371 }
2373
2374 fn update_metrics_sync(&mut self) {
2375 }
2377}
2378
2379impl AlertManager {
2380 fn new(_config: &CostAlertConfig) -> Self {
2381 Self {
2382 active_alerts: HashMap::new(),
2383 alert_history: VecDeque::new(),
2384 notification_handlers: HashMap::new(),
2385 escalation_policies: HashMap::new(),
2386 }
2387 }
2388
2389 async fn check_and_trigger_alerts(&mut self) {
2390 }
2392
2393 fn check_and_trigger_alerts_sync(&mut self) {
2394 }
2396}
2397
2398#[cfg(test)]
2401#[allow(clippy::pedantic, clippy::field_reassign_with_default)]
2402mod tests {
2403 use super::*;
2404
2405 #[test]
2406 fn test_cost_optimization_config_default() {
2407 let config = CostOptimizationConfig::default();
2408 assert_eq!(config.budget_config.total_budget, 10000.0);
2409 assert!(config.estimation_config.enable_ml_estimation);
2410 assert_eq!(
2411 config.optimization_strategy,
2412 CostOptimizationStrategy::MaximizeCostPerformance
2413 );
2414 }
2415
2416 #[test]
2417 fn test_budget_rollover_policy() {
2418 let policy = BudgetRolloverPolicy::PercentageRollover(0.2);
2419 match policy {
2420 BudgetRolloverPolicy::PercentageRollover(percentage) => {
2421 assert_eq!(percentage, 0.2);
2422 }
2423 _ => panic!("Expected PercentageRollover"),
2424 }
2425 }
2426
2427 #[test]
2428 fn test_cost_model_creation() {
2429 let model = CostModel {
2430 model_type: CostModelType::Linear,
2431 base_cost_per_shot: 0.01,
2432 cost_per_qubit: 0.1,
2433 cost_per_gate: 0.001,
2434 cost_per_second: 0.1,
2435 setup_cost: 1.0,
2436 queue_time_multiplier: 0.1,
2437 time_based_pricing: None,
2438 volume_discounts: vec![],
2439 custom_factors: HashMap::new(),
2440 };
2441
2442 assert_eq!(model.model_type, CostModelType::Linear);
2443 assert_eq!(model.base_cost_per_shot, 0.01);
2444 }
2445
2446 #[tokio::test]
2447 async fn test_cost_optimization_engine_creation() {
2448 let config = CostOptimizationConfig::default();
2449 let _engine = CostOptimizationEngine::new(config);
2450
2451 }
2453
2454 #[test]
2455 fn test_optimization_objectives() {
2456 let objectives = [
2457 OptimizationObjective::MinimizeCost,
2458 OptimizationObjective::MaximizeQuality,
2459 OptimizationObjective::MinimizeTime,
2460 ];
2461
2462 assert_eq!(objectives.len(), 3);
2463 assert_eq!(objectives[0], OptimizationObjective::MinimizeCost);
2464 }
2465}