use serde::{Deserialize, Serialize};
use std::collections::{HashMap, VecDeque};
use std::time::{Duration, SystemTime};
use super::config::RealtimeConfig;
use super::resource::ResourceCapacity;
use super::types::{
ConnectivityType, DeviceType, FairnessPolicy, HealthCheckStatus, HealthCheckType, JobPriority,
JobStatus, LoadBalancingStrategy, PreemptionPolicy, SchedulingAlgorithm,
};
pub struct QueueManager {
pub(crate) job_queues: HashMap<JobPriority, VecDeque<QueuedJob>>,
pub(crate) queue_stats: QueueStatistics,
pub(crate) scheduling_algorithm: SchedulingAlgorithm,
pub(crate) queue_policies: QueuePolicies,
pub(crate) load_balancer: LoadBalancer,
}
impl QueueManager {
pub fn new(_config: &RealtimeConfig) -> Self {
let mut job_queues = HashMap::new();
job_queues.insert(JobPriority::Critical, VecDeque::new());
job_queues.insert(JobPriority::High, VecDeque::new());
job_queues.insert(JobPriority::Normal, VecDeque::new());
job_queues.insert(JobPriority::Low, VecDeque::new());
job_queues.insert(JobPriority::Background, VecDeque::new());
Self {
job_queues,
queue_stats: QueueStatistics::default(),
scheduling_algorithm: SchedulingAlgorithm::PriorityBased,
queue_policies: QueuePolicies::default(),
load_balancer: LoadBalancer::new(),
}
}
pub fn submit_job(&mut self, job: QueuedJob) -> Result<String, String> {
let job_id = job.job_id.clone();
let priority = job.priority.clone();
if let Some(queue) = self.job_queues.get_mut(&priority) {
queue.push_back(job);
self.queue_stats.total_jobs_processed += 1;
Ok(job_id)
} else {
Err("Invalid job priority".to_string())
}
}
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct QueuedJob {
pub job_id: String,
pub job_type: JobType,
pub priority: JobPriority,
pub resource_requirements: ResourceRequirements,
pub submission_time: SystemTime,
pub deadline: Option<SystemTime>,
pub dependencies: Vec<String>,
pub metadata: JobMetadata,
pub status: JobStatus,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub enum JobType {
QuantumCircuit,
Optimization,
Simulation,
Calibration,
Maintenance,
Hybrid,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct ResourceRequirements {
pub qubits_required: Option<usize>,
pub compute_requirements: ComputeRequirements,
pub memory_requirements: MemoryRequirements,
pub network_requirements: Option<NetworkRequirements>,
pub hardware_constraints: Vec<HardwareConstraint>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct ComputeRequirements {
pub cpu_cores: usize,
pub gpu_units: Option<usize>,
pub qpu_units: Option<usize>,
pub estimated_runtime: Duration,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct MemoryRequirements {
pub ram_gb: f64,
pub storage_gb: f64,
pub temp_storage_gb: Option<f64>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct NetworkRequirements {
pub bandwidth_mbps: f64,
pub latency_tolerance: Duration,
pub location_preferences: Vec<String>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub enum HardwareConstraint {
SpecificDevice(String),
DeviceType(DeviceType),
MinimumFidelity(f64),
MaximumErrorRate(f64),
Connectivity(ConnectivityRequirement),
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub enum ConnectivityRequirement {
AllToAll,
Linear,
Grid,
Custom(Vec<(usize, usize)>),
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct JobMetadata {
pub user_id: String,
pub project_id: String,
pub billing_info: BillingInfo,
pub tags: Vec<String>,
pub experiment_name: Option<String>,
pub description: Option<String>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct BillingInfo {
pub account_id: String,
pub cost_center: Option<String>,
pub budget_limit: Option<f64>,
pub cost_estimate: Option<f64>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct QueueStatistics {
pub total_jobs_processed: usize,
pub average_wait_time: Duration,
pub queue_lengths: HashMap<JobPriority, usize>,
pub throughput_metrics: ThroughputMetrics,
pub resource_utilization: HashMap<String, f64>,
}
impl Default for QueueStatistics {
fn default() -> Self {
Self {
total_jobs_processed: 0,
average_wait_time: Duration::ZERO,
queue_lengths: HashMap::new(),
throughput_metrics: ThroughputMetrics {
jobs_per_hour: 0.0,
success_rate: 0.99,
average_execution_time: Duration::from_secs(300),
resource_efficiency: 0.85,
},
resource_utilization: HashMap::new(),
}
}
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct ThroughputMetrics {
pub jobs_per_hour: f64,
pub success_rate: f64,
pub average_execution_time: Duration,
pub resource_efficiency: f64,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct QueuePolicies {
pub max_queue_length: usize,
pub job_timeout: Duration,
pub preemption_policy: PreemptionPolicy,
pub fairness_policy: FairnessPolicy,
pub resource_limits: ResourceLimits,
}
impl Default for QueuePolicies {
fn default() -> Self {
Self {
max_queue_length: 1000,
job_timeout: Duration::from_secs(3600),
preemption_policy: PreemptionPolicy::PriorityBased,
fairness_policy: FairnessPolicy::WeightedFair,
resource_limits: ResourceLimits {
per_user_limits: HashMap::new(),
per_project_limits: HashMap::new(),
system_limits: ResourceCapacity {
compute_units: 1000.0,
memory_gb: 1024.0,
storage_gb: 10000.0,
network_mbps: 10000.0,
custom_metrics: HashMap::new(),
},
time_based_limits: vec![],
},
}
}
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct ResourceLimits {
pub per_user_limits: HashMap<String, ResourceCapacity>,
pub per_project_limits: HashMap<String, ResourceCapacity>,
pub system_limits: ResourceCapacity,
pub time_based_limits: Vec<TimeBoundLimit>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct TimeBoundLimit {
pub time_window: (SystemTime, SystemTime),
pub limits: ResourceCapacity,
pub priority_override: Option<JobPriority>,
}
#[derive(Debug, Clone)]
pub struct LoadBalancer {
pub(crate) strategy: LoadBalancingStrategy,
pub(crate) server_weights: HashMap<String, f64>,
pub(crate) health_checks: HashMap<String, HealthCheck>,
pub(crate) load_metrics: HashMap<String, LoadMetrics>,
}
impl Default for LoadBalancer {
fn default() -> Self {
Self::new()
}
}
impl LoadBalancer {
pub fn new() -> Self {
Self {
strategy: LoadBalancingStrategy::RoundRobin,
server_weights: HashMap::new(),
health_checks: HashMap::new(),
load_metrics: HashMap::new(),
}
}
}
#[derive(Debug, Clone)]
pub struct HealthCheck {
pub check_type: HealthCheckType,
pub interval: Duration,
pub timeout: Duration,
pub last_check: SystemTime,
pub status: HealthCheckStatus,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct LoadMetrics {
pub current_load: f64,
pub response_time: Duration,
pub error_rate: f64,
pub throughput: f64,
pub capacity_utilization: f64,
}