use serde::{Deserialize, Serialize};
use std::collections::HashMap;
#[derive(Debug, Clone, PartialEq, Eq, Hash, Serialize, Deserialize)]
pub enum CloudProvider {
IBM,
AWS,
Azure,
Google,
IonQ,
Rigetti,
Xanadu,
DWave,
Custom(String),
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct MultiProviderConfig {
pub enabled_providers: Vec<CloudProvider>,
pub provider_configs: HashMap<CloudProvider, ProviderConfig>,
pub selection_strategy: ProviderSelectionStrategy,
pub failover_config: FailoverConfig,
pub sync_config: CrossProviderSyncConfig,
pub health_monitoring: ProviderHealthConfig,
}
#[derive(Debug, Clone, Serialize, Deserialize, Default)]
pub struct ProviderConfig {
pub api_endpoint: String,
pub credentials: HashMap<String, String>,
pub resource_limits: HashMap<String, usize>,
pub features: ProviderFeatures,
pub connection: ConnectionSettings,
pub rate_limits: RateLimits,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct ProviderFeatures {
pub gate_sets: Vec<String>,
pub max_qubits: usize,
pub coherence_times: CoherenceMetrics,
pub error_rates: ErrorMetrics,
pub special_capabilities: Vec<SpecialCapability>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct CoherenceMetrics {
pub t1_avg: f64,
pub t2_avg: f64,
pub gate_time_avg: f64,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct ErrorMetrics {
pub single_qubit_error: f64,
pub two_qubit_error: f64,
pub readout_error: f64,
}
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
pub enum SpecialCapability {
MiddleCircuitMeasurement,
DynamicCircuits,
ErrorMitigation,
PulseControl,
ParametricGates,
Transpilation,
CustomGates,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct ConnectionSettings {
pub timeout: std::time::Duration,
pub retry_attempts: usize,
pub keep_alive: bool,
pub ssl_config: SSLConfig,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct SSLConfig {
pub enabled: bool,
pub verify_certificates: bool,
pub certificate_path: Option<String>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct RateLimits {
pub requests_per_second: usize,
pub requests_per_minute: usize,
pub requests_per_hour: usize,
pub burst_allowance: usize,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub enum ProviderSelectionStrategy {
RoundRobin,
LoadBased,
CostBased,
PerformanceBased,
LatencyBased,
AvailabilityBased,
MultiCriteria(MultiCriteriaConfig),
Custom(String),
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub struct MultiCriteriaConfig {
pub weights: HashMap<SelectionCriterion, f64>,
pub aggregation_method: AggregationMethod,
pub normalization: NormalizationMethod,
}
#[derive(Debug, Clone, PartialEq, Eq, Hash, Serialize, Deserialize)]
pub enum SelectionCriterion {
Cost,
Performance,
Latency,
Availability,
QueueTime,
ErrorRate,
ResourceUtilization,
}
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
pub enum AggregationMethod {
WeightedSum,
WeightedProduct,
TOPSIS,
ELECTRE,
AHP,
}
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
pub enum NormalizationMethod {
MinMax,
ZScore,
Robust,
None,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct FailoverConfig {
pub enable_failover: bool,
pub failover_threshold: f64,
pub failover_providers: Vec<String>,
pub strategy: FailoverStrategy,
pub detection: FailureDetectionConfig,
pub recovery: FailoverRecoveryConfig,
}
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
pub enum FailoverStrategy {
Immediate,
Graceful,
Conditional,
Hybrid,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct FailureDetectionConfig {
pub health_check_interval: std::time::Duration,
pub failure_threshold: usize,
pub detection_methods: Vec<FailureDetectionMethod>,
}
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
pub enum FailureDetectionMethod {
HealthEndpoint,
ResponseTime,
ErrorRate,
CustomMetric(String),
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct FailoverRecoveryConfig {
pub recovery_timeout: std::time::Duration,
pub recovery_strategy: RecoveryStrategy,
pub backoff: BackoffStrategy,
}
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
pub enum RecoveryStrategy {
Automatic,
Manual,
Hybrid,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct BackoffStrategy {
pub initial_delay: std::time::Duration,
pub max_delay: std::time::Duration,
pub multiplier: f64,
pub jitter: bool,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct CrossProviderSyncConfig {
pub sync_enabled: bool,
pub sync_interval: u64,
pub sync_strategies: Vec<String>,
pub sync_scope: SyncScope,
pub conflict_resolution: ConflictResolution,
pub consistency: ConsistencyConfig,
}
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
pub enum SyncScope {
JobStatus,
ResourceUsage,
Configurations,
All,
}
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
pub enum ConflictResolution {
LastWriteWins,
FirstWriteWins,
MergeStrategy,
ManualResolution,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct ConsistencyConfig {
pub level: ConsistencyLevel,
pub timeout: std::time::Duration,
pub retry_policy: RetryPolicy,
}
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
pub enum ConsistencyLevel {
Strong,
Eventual,
Session,
Bounded,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct RetryPolicy {
pub max_retries: usize,
pub retry_delay: std::time::Duration,
pub exponential_backoff: bool,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct ProviderHealthConfig {
pub health_check_interval: u64,
pub health_thresholds: HashMap<String, f64>,
pub metrics: Vec<HealthMetric>,
pub alerting: HealthAlertingConfig,
}
#[derive(Debug, Clone, PartialEq, Eq, Hash, Serialize, Deserialize)]
pub enum HealthMetric {
ResponseTime,
ErrorRate,
Availability,
QueueLength,
ResourceUtilization,
CustomMetric(String),
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct HealthAlertingConfig {
pub enabled: bool,
pub thresholds: HashMap<HealthMetric, f64>,
pub channels: Vec<NotificationChannel>,
pub escalation: EscalationConfig,
}
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
pub enum NotificationChannel {
Email,
SMS,
Slack,
Webhook,
Dashboard,
}
#[derive(Debug, Clone, Serialize, Deserialize, Default)]
pub struct EscalationConfig {
pub levels: Vec<EscalationLevel>,
pub timeouts: HashMap<String, std::time::Duration>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct EscalationLevel {
pub name: String,
pub threshold: f64,
pub actions: Vec<EscalationAction>,
}
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
pub enum EscalationAction {
Notify,
Failover,
Throttle,
Shutdown,
}
impl Default for MultiProviderConfig {
fn default() -> Self {
Self {
enabled_providers: vec![CloudProvider::IBM, CloudProvider::AWS],
provider_configs: HashMap::new(),
selection_strategy: ProviderSelectionStrategy::PerformanceBased,
failover_config: FailoverConfig::default(),
sync_config: CrossProviderSyncConfig::default(),
health_monitoring: ProviderHealthConfig::default(),
}
}
}
impl Default for ProviderFeatures {
fn default() -> Self {
Self {
gate_sets: vec!["clifford".to_string(), "universal".to_string()],
max_qubits: 100,
coherence_times: CoherenceMetrics::default(),
error_rates: ErrorMetrics::default(),
special_capabilities: vec![],
}
}
}
impl Default for CoherenceMetrics {
fn default() -> Self {
Self {
t1_avg: 100.0, t2_avg: 50.0, gate_time_avg: 0.1, }
}
}
impl Default for ErrorMetrics {
fn default() -> Self {
Self {
single_qubit_error: 0.001,
two_qubit_error: 0.01,
readout_error: 0.02,
}
}
}
impl Default for ConnectionSettings {
fn default() -> Self {
Self {
timeout: std::time::Duration::from_secs(30),
retry_attempts: 3,
keep_alive: true,
ssl_config: SSLConfig::default(),
}
}
}
impl Default for SSLConfig {
fn default() -> Self {
Self {
enabled: true,
verify_certificates: true,
certificate_path: None,
}
}
}
impl Default for RateLimits {
fn default() -> Self {
Self {
requests_per_second: 10,
requests_per_minute: 100,
requests_per_hour: 1000,
burst_allowance: 20,
}
}
}
impl Default for FailoverConfig {
fn default() -> Self {
Self {
enable_failover: true,
failover_threshold: 0.8,
failover_providers: vec![],
strategy: FailoverStrategy::Graceful,
detection: FailureDetectionConfig::default(),
recovery: FailoverRecoveryConfig::default(),
}
}
}
impl Default for FailureDetectionConfig {
fn default() -> Self {
Self {
health_check_interval: std::time::Duration::from_secs(60),
failure_threshold: 3,
detection_methods: vec![
FailureDetectionMethod::HealthEndpoint,
FailureDetectionMethod::ResponseTime,
],
}
}
}
impl Default for FailoverRecoveryConfig {
fn default() -> Self {
Self {
recovery_timeout: std::time::Duration::from_secs(300),
recovery_strategy: RecoveryStrategy::Automatic,
backoff: BackoffStrategy::default(),
}
}
}
impl Default for BackoffStrategy {
fn default() -> Self {
Self {
initial_delay: std::time::Duration::from_secs(1),
max_delay: std::time::Duration::from_secs(60),
multiplier: 2.0,
jitter: true,
}
}
}
impl Default for CrossProviderSyncConfig {
fn default() -> Self {
Self {
sync_enabled: false,
sync_interval: 300, sync_strategies: vec![],
sync_scope: SyncScope::JobStatus,
conflict_resolution: ConflictResolution::LastWriteWins,
consistency: ConsistencyConfig::default(),
}
}
}
impl Default for ConsistencyConfig {
fn default() -> Self {
Self {
level: ConsistencyLevel::Eventual,
timeout: std::time::Duration::from_secs(30),
retry_policy: RetryPolicy::default(),
}
}
}
impl Default for RetryPolicy {
fn default() -> Self {
Self {
max_retries: 3,
retry_delay: std::time::Duration::from_secs(1),
exponential_backoff: true,
}
}
}
impl Default for ProviderHealthConfig {
fn default() -> Self {
Self {
health_check_interval: 60,
health_thresholds: HashMap::new(),
metrics: vec![
HealthMetric::ResponseTime,
HealthMetric::ErrorRate,
HealthMetric::Availability,
],
alerting: HealthAlertingConfig::default(),
}
}
}
impl Default for HealthAlertingConfig {
fn default() -> Self {
Self {
enabled: true,
thresholds: HashMap::new(),
channels: vec![NotificationChannel::Dashboard],
escalation: EscalationConfig::default(),
}
}
}