use serde::{Deserialize, Serialize};
use std::collections::{BTreeSet, HashMap, HashSet, VecDeque};
use std::sync::{
atomic::AtomicU64,
Arc, Mutex, RwLock,
};
use std::time::{Duration, Instant, SystemTime};
use uuid::Uuid;
use super::config::ExecutionConfig;
fn default_instant() -> Instant {
Instant::now()
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct OptimizationTask {
pub id: TaskId,
pub name: String,
pub description: String,
pub task_type: OptimizationTaskType,
pub priority: TaskPriority,
pub strategy: OptimizationStrategy,
pub resource_requirements: ResourceRequirements,
pub constraints: Vec<ExecutionConstraint>,
pub dependencies: TaskDependencies,
pub metadata: TaskMetadata,
pub success_criteria: Vec<SuccessCriterion>,
pub failure_handling: FailureHandlingConfig,
pub execution_location: ExecutionLocation,
pub timeout_config: TimeoutConfig,
pub custom_parameters: HashMap<String, TaskParameter>,
pub created_at: SystemTime,
pub deadline: Option<SystemTime>,
pub estimated_duration: Option<Duration>,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Serialize, Deserialize)]
pub struct TaskId(pub Uuid);
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
pub enum OptimizationTaskType {
MemoryAllocation {
allocation_size: usize,
pattern: AllocationPattern,
constraints: Vec<AllocationConstraint>,
},
MemoryDeallocation {
target_addresses: Vec<usize>,
cleanup_level: CleanupLevel,
},
MemoryCompaction {
target_fragmentation: f64,
compaction_strategy: CompactionStrategy,
},
CacheOptimization {
cache_level: CacheLevel,
optimization_target: CacheOptimizationTarget,
},
BandwidthOptimization {
target_bandwidth: f64,
optimization_scope: BandwidthScope,
},
LatencyOptimization {
target_latency: Duration,
latency_type: LatencyType,
},
MemoryPoolManagement {
pool_operation: PoolOperation,
pool_parameters: PoolParameters,
},
ResourceBalancing {
balancing_target: BalancingTarget,
balancing_strategy: BalancingStrategy,
},
PerformanceMonitoring {
monitoring_scope: MonitoringScope,
metrics_collection: MetricsCollection,
},
SystemDiagnostics {
diagnostic_level: DiagnosticLevel,
diagnostic_scope: DiagnosticScope,
},
Custom {
task_name: String,
task_configuration: HashMap<String, String>,
},
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Serialize, Deserialize)]
pub enum TaskPriority {
Critical = 0,
High = 1,
Medium = 2,
Low = 3,
Idle = 4,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct OptimizationStrategy {
pub name: String,
pub implementation: StrategyImplementation,
pub parameters: HashMap<String, StrategyParameter>,
pub composition: Option<StrategyComposition>,
pub constraints: Vec<StrategyConstraint>,
pub safety_level: SafetyLevel,
pub expected_improvement: f64,
pub validation_requirements: ValidationRequirements,
}
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
pub enum StrategyImplementation {
Builtin(String),
Plugin(PluginInfo),
Script(ScriptInfo),
MachineLearning(MLModelInfo),
Hybrid(Vec<StrategyImplementation>),
Custom(CustomImplementationInfo),
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct StrategyComposition {
pub composition_type: CompositionType,
pub strategies: Vec<OptimizationStrategy>,
pub weights: Vec<f64>,
pub combination_logic: CombinationLogic,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
pub enum CompositionType {
Sequential,
Parallel,
Weighted,
Adaptive,
Voting,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub enum StrategyConstraint {
MaxExecutionTime(Duration),
MaxMemoryUsage(usize),
RequiredHardware(Vec<HardwareRequirement>),
SafetyConstraints(Vec<SafetyConstraint>),
PerformanceConstraints(PerformanceConstraint),
Custom(String, String),
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
pub enum SafetyLevel {
None,
Basic,
Standard,
High,
Maximum,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct SuccessCriterion {
pub name: String,
pub description: String,
pub metric: String,
pub target_value: f64,
pub operator: ComparisonOperator,
pub weight: f64,
pub mandatory: bool,
pub tolerance: f64,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
pub enum ComparisonOperator {
Equal,
NotEqual,
LessThan,
LessThanOrEqual,
GreaterThan,
GreaterThanOrEqual,
Within,
Outside,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct ResourceRequirements {
pub cpu_requirements: CpuRequirements,
pub memory_requirements: MemoryRequirements,
pub gpu_requirements: GpuRequirements,
pub storage_requirements: StorageRequirements,
pub network_requirements: NetworkRequirements,
pub hardware_requirements: Vec<HardwareRequirement>,
pub allocation_preferences: AllocationPreferences,
pub sharing_configuration: SharingConfiguration,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct CpuRequirements {
pub min_cores: usize,
pub preferred_cores: usize,
pub max_cores: usize,
pub architecture_requirements: Vec<String>,
pub min_frequency_ghz: f64,
pub required_features: Vec<String>,
pub affinity_preferences: AffinityPreferences,
pub numa_requirements: NumaRequirements,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct MemoryRequirements {
pub min_memory_bytes: usize,
pub preferred_memory_bytes: usize,
pub max_memory_bytes: usize,
pub memory_type: MemoryType,
pub access_pattern: MemoryAccessPattern,
pub alignment_requirements: AlignmentRequirements,
pub locality_preferences: LocalityPreferences,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct GpuRequirements {
pub gpu_count: usize,
pub min_compute_capability: (u32, u32),
pub min_gpu_memory_bytes: usize,
pub architecture_preferences: Vec<String>,
pub required_features: Vec<String>,
pub multi_gpu_requirements: MultiGpuRequirements,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub enum ExecutionConstraint {
TimeConstraint {
constraint_type: TimeConstraintType,
time_value: Duration,
enforcement_level: ConstraintEnforcementLevel,
},
ResourceConstraint {
resource_type: ResourceType,
constraint_operator: ConstraintOperator,
threshold_value: f64,
enforcement_level: ConstraintEnforcementLevel,
},
LocationConstraint {
allowed_locations: Vec<String>,
forbidden_locations: Vec<String>,
location_preferences: LocationPreferences,
},
SecurityConstraint {
security_level: SecurityLevel,
access_restrictions: Vec<AccessRestriction>,
encryption_requirements: EncryptionRequirements,
},
DependencyConstraint {
dependency_type: DependencyType,
dependency_targets: Vec<TaskId>,
satisfaction_condition: SatisfactionCondition,
},
PerformanceConstraint {
performance_metric: String,
constraint_operator: ConstraintOperator,
target_value: f64,
measurement_window: Duration,
},
CustomConstraint {
name: String,
description: String,
validation_logic: String,
parameters: HashMap<String, String>,
},
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct TaskDependencies {
pub prerequisite_tasks: Vec<TaskId>,
pub conflicting_tasks: Vec<TaskId>,
pub successor_tasks: Vec<TaskId>,
pub resource_dependencies: Vec<ResourceDependency>,
pub data_dependencies: Vec<DataDependency>,
pub conditional_dependencies: Vec<ConditionalDependency>,
pub resolution_strategy: DependencyResolutionStrategy,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct TaskMetadata {
pub creator: CreatorInfo,
pub category: TaskCategory,
pub tags: HashSet<String>,
pub version: TaskVersion,
pub execution_history: ExecutionHistory,
pub performance_metrics: PerformanceMetrics,
pub quality_assurance: QualityAssuranceInfo,
pub monitoring_settings: MonitoringSettings,
pub custom_metadata: HashMap<String, MetadataValue>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct ExecutionLocation {
pub preferred_locations: Vec<LocationSpecification>,
pub allowed_locations: Vec<LocationSpecification>,
pub forbidden_locations: Vec<LocationSpecification>,
pub selection_strategy: LocationSelectionStrategy,
pub failover_configuration: LocationFailoverConfig,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct HardwareRequirement {
pub hardware_type: HardwareType,
pub model_requirements: Vec<String>,
pub capability_requirements: Vec<CapabilityRequirement>,
pub performance_requirements: HardwarePerformanceRequirement,
pub availability_requirements: AvailabilityRequirement,
}
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
pub enum HardwareType {
CPU,
GPU,
Memory,
Storage,
Network,
Accelerator,
FPGA,
ASIC,
QPU,
Custom(String),
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct FailureHandlingConfig {
pub detection: FailureDetectionConfig,
pub retry: TaskRetryConfig,
pub recovery: FailureRecoveryConfig,
pub notification: FailureNotificationConfig,
pub rollback: RollbackConfig,
pub analysis: FailureAnalysisConfig,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct TimeoutConfig {
pub overall_timeout: Duration,
pub operation_timeouts: HashMap<String, Duration>,
pub handling_strategy: TimeoutHandlingStrategy,
pub grace_period: Duration,
pub escalation: TimeoutEscalationConfig,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub enum TaskParameter {
String(String),
Integer(i64),
Float(f64),
Boolean(bool),
StringArray(Vec<String>),
IntegerArray(Vec<i64>),
FloatArray(Vec<f64>),
Nested(HashMap<String, TaskParameter>),
Binary(Vec<u8>),
}
#[derive(Debug)]
pub struct TaskManager {
tasks: Arc<RwLock<HashMap<TaskId, OptimizationTask>>>,
scheduling_queue: Arc<Mutex<TaskSchedulingQueue>>,
active_tasks: Arc<RwLock<HashMap<TaskId, ActiveTaskInfo>>>,
completed_tasks: Arc<RwLock<HashMap<TaskId, CompletedTaskInfo>>>,
failed_tasks: Arc<RwLock<HashMap<TaskId, FailedTaskInfo>>>,
dependency_manager: Arc<Mutex<TaskDependencyManager>>,
metrics_collector: Arc<Mutex<TaskMetricsCollector>>,
priority_manager: Arc<Mutex<TaskPriorityManager>>,
resource_manager: Arc<Mutex<TaskResourceManager>>,
config: ExecutionConfig,
id_generator: Arc<Mutex<TaskIdGenerator>>,
statistics: Arc<Mutex<TaskManagerStatistics>>,
}
#[derive(Debug)]
pub struct TaskSchedulingQueue {
high_priority_queue: VecDeque<TaskId>,
medium_priority_queue: VecDeque<TaskId>,
low_priority_queue: VecDeque<TaskId>,
critical_queue: VecDeque<TaskId>,
idle_queue: VecDeque<TaskId>,
deadline_queue: BTreeSet<DeadlineTaskEntry>,
scheduling_stats: SchedulingStatistics,
}
#[derive(Debug, Clone)]
pub struct ActiveTaskInfo {
pub task: OptimizationTask,
pub start_time: Instant,
pub current_phase: ExecutionPhase,
pub allocated_resources: AllocatedResources,
pub progress: TaskProgress,
pub metrics: RealtimeTaskMetrics,
}
#[derive(Debug, Clone)]
pub struct CompletedTaskInfo {
pub task: OptimizationTask,
pub execution_summary: ExecutionSummary,
pub results: TaskResults,
pub performance_metrics: FinalPerformanceMetrics,
pub completion_time: SystemTime,
}
#[derive(Debug, Clone)]
pub struct FailedTaskInfo {
pub task: OptimizationTask,
pub failure_info: TaskFailureInfo,
pub retry_history: Vec<RetryAttempt>,
pub failure_analysis: FailureAnalysis,
pub failure_time: SystemTime,
}
#[derive(Debug)]
pub struct TaskDependencyManager {
dependency_graph: HashMap<TaskId, HashSet<TaskId>>,
reverse_dependency_graph: HashMap<TaskId, HashSet<TaskId>>,
resolved_dependencies: HashMap<TaskId, bool>,
resolution_queue: VecDeque<TaskId>,
}
impl TaskManager {
pub fn new(config: ExecutionConfig) -> Self {
Self {
tasks: Arc::new(RwLock::new(HashMap::new())),
scheduling_queue: Arc::new(Mutex::new(TaskSchedulingQueue::new())),
active_tasks: Arc::new(RwLock::new(HashMap::new())),
completed_tasks: Arc::new(RwLock::new(HashMap::new())),
failed_tasks: Arc::new(RwLock::new(HashMap::new())),
dependency_manager: Arc::new(Mutex::new(TaskDependencyManager::new())),
metrics_collector: Arc::new(Mutex::new(TaskMetricsCollector::new())),
priority_manager: Arc::new(Mutex::new(TaskPriorityManager::new())),
resource_manager: Arc::new(Mutex::new(TaskResourceManager::new())),
config,
id_generator: Arc::new(Mutex::new(TaskIdGenerator::new())),
statistics: Arc::new(Mutex::new(TaskManagerStatistics::new())),
}
}
pub fn submit_task(&self, mut task: OptimizationTask) -> Result<TaskId, TaskError> {
if task.id == TaskId(Uuid::nil()) {
task.id = self.generate_task_id()?;
}
self.validate_task(&task)?;
task.created_at = SystemTime::now();
{
let mut tasks = self.tasks.write().expect("lock should not be poisoned");
tasks.insert(task.id, task.clone());
}
{
let mut queue = self.scheduling_queue.lock().expect("lock should not be poisoned");
queue.enqueue_task(task.id, task.priority);
}
{
let mut dep_manager = self.dependency_manager.lock().expect("lock should not be poisoned");
dep_manager.register_dependencies(&task)?;
}
{
let mut stats = self.statistics.lock().expect("lock should not be poisoned");
stats.tasks_submitted += 1;
}
Ok(task.id)
}
pub fn get_next_task(&self) -> Option<OptimizationTask> {
let mut queue = self.scheduling_queue.lock().expect("lock should not be poisoned");
let task_id = queue.dequeue_next_task()?;
let tasks = self.tasks.read().expect("lock should not be poisoned");
tasks.get(&task_id).cloned()
}
pub fn start_task(&self, task_id: TaskId) -> Result<(), TaskError> {
let task = {
let tasks = self.tasks.read().expect("lock should not be poisoned");
tasks
.get(&task_id)
.cloned()
.ok_or(TaskError::TaskNotFound(task_id))?
};
let active_info = ActiveTaskInfo {
task: task.clone(),
start_time: Instant::now(),
current_phase: ExecutionPhase::Initializing,
allocated_resources: AllocatedResources::default(),
progress: TaskProgress::default(),
metrics: RealtimeTaskMetrics::default(),
};
{
let mut active_tasks = self.active_tasks.write().expect("lock should not be poisoned");
active_tasks.insert(task_id, active_info);
}
{
let mut stats = self.statistics.lock().expect("lock should not be poisoned");
stats.tasks_started += 1;
}
Ok(())
}
pub fn complete_task(&self, task_id: TaskId, results: TaskResults) -> Result<(), TaskError> {
let active_info = {
let mut active_tasks = self.active_tasks.write().expect("lock should not be poisoned");
active_tasks
.remove(&task_id)
.ok_or(TaskError::TaskNotActive(task_id))?
};
let execution_duration = active_info.start_time.elapsed();
let completion_info = CompletedTaskInfo {
task: active_info.task,
execution_summary: ExecutionSummary {
execution_duration,
phases_completed: vec![], resource_utilization: ResourceUtilization::default(),
},
results,
performance_metrics: FinalPerformanceMetrics::default(),
completion_time: SystemTime::now(),
};
{
let mut completed_tasks = self.completed_tasks.write().expect("lock should not be poisoned");
completed_tasks.insert(task_id, completion_info);
}
{
let mut stats = self.statistics.lock().expect("lock should not be poisoned");
stats.tasks_completed += 1;
}
{
let mut dep_manager = self.dependency_manager.lock().expect("lock should not be poisoned");
dep_manager.mark_task_completed(task_id);
}
Ok(())
}
pub fn fail_task(
&self,
task_id: TaskId,
failure_info: TaskFailureInfo,
) -> Result<(), TaskError> {
let active_info = {
let mut active_tasks = self.active_tasks.write().expect("lock should not be poisoned");
active_tasks
.remove(&task_id)
.ok_or(TaskError::TaskNotActive(task_id))?
};
let failed_info = FailedTaskInfo {
task: active_info.task,
failure_info,
retry_history: vec![],
failure_analysis: FailureAnalysis::default(),
failure_time: SystemTime::now(),
};
{
let mut failed_tasks = self.failed_tasks.write().expect("lock should not be poisoned");
failed_tasks.insert(task_id, failed_info);
}
{
let mut stats = self.statistics.lock().expect("lock should not be poisoned");
stats.tasks_failed += 1;
}
Ok(())
}
pub fn get_task(&self, task_id: TaskId) -> Option<OptimizationTask> {
let tasks = self.tasks.read().expect("lock should not be poisoned");
tasks.get(&task_id).cloned()
}
pub fn get_active_tasks(&self) -> Vec<ActiveTaskInfo> {
let active_tasks = self.active_tasks.read().expect("lock should not be poisoned");
active_tasks.values().cloned().collect()
}
pub fn get_statistics(&self) -> TaskManagerStatistics {
let stats = self.statistics.lock().expect("lock should not be poisoned");
stats.clone()
}
fn generate_task_id(&self) -> Result<TaskId, TaskError> {
let mut generator = self.id_generator.lock().expect("lock should not be poisoned");
Ok(generator.generate())
}
fn validate_task(&self, task: &OptimizationTask) -> Result<(), TaskError> {
if task.name.is_empty() {
return Err(TaskError::InvalidTask(
"Task name cannot be empty".to_string(),
));
}
if task
.resource_requirements
.memory_requirements
.min_memory_bytes
== 0
{
return Err(TaskError::InvalidTask(
"Memory requirements must be specified".to_string(),
));
}
for criterion in &task.success_criteria {
if criterion.weight < 0.0 || criterion.weight > 1.0 {
return Err(TaskError::InvalidTask(
"Success criterion weight must be between 0.0 and 1.0".to_string(),
));
}
}
Ok(())
}
}
impl TaskSchedulingQueue {
fn new() -> Self {
Self {
high_priority_queue: VecDeque::new(),
medium_priority_queue: VecDeque::new(),
low_priority_queue: VecDeque::new(),
critical_queue: VecDeque::new(),
idle_queue: VecDeque::new(),
deadline_queue: BTreeSet::new(),
scheduling_stats: SchedulingStatistics::default(),
}
}
fn enqueue_task(&mut self, task_id: TaskId, priority: TaskPriority) {
match priority {
TaskPriority::Critical => self.critical_queue.push_back(task_id),
TaskPriority::High => self.high_priority_queue.push_back(task_id),
TaskPriority::Medium => self.medium_priority_queue.push_back(task_id),
TaskPriority::Low => self.low_priority_queue.push_back(task_id),
TaskPriority::Idle => self.idle_queue.push_back(task_id),
}
self.scheduling_stats.tasks_enqueued += 1;
}
fn dequeue_next_task(&mut self) -> Option<TaskId> {
if let Some(task_id) = self.critical_queue.pop_front() {
self.scheduling_stats.tasks_dequeued += 1;
return Some(task_id);
}
if let Some(deadline_entry) = self.deadline_queue.iter().next() {
let now = SystemTime::now();
if deadline_entry.deadline <= now {
let task_id = deadline_entry.task_id;
self.deadline_queue.remove(&deadline_entry.clone());
self.scheduling_stats.tasks_dequeued += 1;
return Some(task_id);
}
}
if let Some(task_id) = self.high_priority_queue.pop_front() {
self.scheduling_stats.tasks_dequeued += 1;
return Some(task_id);
}
if let Some(task_id) = self.medium_priority_queue.pop_front() {
self.scheduling_stats.tasks_dequeued += 1;
return Some(task_id);
}
if let Some(task_id) = self.low_priority_queue.pop_front() {
self.scheduling_stats.tasks_dequeued += 1;
return Some(task_id);
}
if let Some(task_id) = self.idle_queue.pop_front() {
self.scheduling_stats.tasks_dequeued += 1;
return Some(task_id);
}
None
}
}
impl TaskDependencyManager {
fn new() -> Self {
Self {
dependency_graph: HashMap::new(),
reverse_dependency_graph: HashMap::new(),
resolved_dependencies: HashMap::new(),
resolution_queue: VecDeque::new(),
}
}
fn register_dependencies(&mut self, task: &OptimizationTask) -> Result<(), TaskError> {
for &dep_id in &task.dependencies.prerequisite_tasks {
self.dependency_graph
.entry(task.id)
.or_insert_with(HashSet::new)
.insert(dep_id);
self.reverse_dependency_graph
.entry(dep_id)
.or_insert_with(HashSet::new)
.insert(task.id);
}
Ok(())
}
fn mark_task_completed(&mut self, task_id: TaskId) {
self.resolved_dependencies.insert(task_id, true);
if let Some(dependents) = self.reverse_dependency_graph.get(&task_id) {
for &dependent_id in dependents {
self.check_dependencies_resolved(dependent_id);
}
}
}
fn check_dependencies_resolved(&mut self, task_id: TaskId) -> bool {
if let Some(dependencies) = self.dependency_graph.get(&task_id) {
for &dep_id in dependencies {
if !self.resolved_dependencies.get(&dep_id).unwrap_or(&false) {
return false;
}
}
}
self.resolved_dependencies.insert(task_id, true);
self.resolution_queue.push_back(task_id);
true
}
}
#[derive(Debug)]
pub struct TaskIdGenerator {
counter: AtomicU64,
}
impl TaskIdGenerator {
fn new() -> Self {
Self {
counter: AtomicU64::new(0),
}
}
fn generate(&self) -> TaskId {
TaskId(Uuid::new_v4())
}
}
#[derive(Debug, Clone)]
pub enum TaskError {
TaskNotFound(TaskId),
TaskNotActive(TaskId),
InvalidTask(String),
DependencyResolutionFailed(String),
ResourceAllocationFailed(String),
ExecutionFailed(String),
}
macro_rules! default_placeholder_struct {
($name:ident) => {
#[derive(Debug, Clone, Default, Serialize, Deserialize)]
pub struct $name {
pub placeholder: bool,
}
};
}
default_placeholder_struct!(AllocationPattern);
default_placeholder_struct!(AllocationConstraint);
default_placeholder_struct!(CleanupLevel);
default_placeholder_struct!(CompactionStrategy);
default_placeholder_struct!(CacheLevel);
default_placeholder_struct!(CacheOptimizationTarget);
default_placeholder_struct!(BandwidthScope);
default_placeholder_struct!(LatencyType);
default_placeholder_struct!(PoolOperation);
default_placeholder_struct!(PoolParameters);
default_placeholder_struct!(BalancingTarget);
default_placeholder_struct!(BalancingStrategy);
default_placeholder_struct!(MonitoringScope);
default_placeholder_struct!(MetricsCollection);
default_placeholder_struct!(DiagnosticLevel);
default_placeholder_struct!(DiagnosticScope);
default_placeholder_struct!(PluginInfo);
default_placeholder_struct!(ScriptInfo);
default_placeholder_struct!(MLModelInfo);
default_placeholder_struct!(CustomImplementationInfo);
default_placeholder_struct!(CombinationLogic);
default_placeholder_struct!(SafetyConstraint);
default_placeholder_struct!(PerformanceConstraint);
default_placeholder_struct!(ValidationRequirements);
default_placeholder_struct!(StorageRequirements);
default_placeholder_struct!(NetworkRequirements);
default_placeholder_struct!(AllocationPreferences);
default_placeholder_struct!(SharingConfiguration);
default_placeholder_struct!(AffinityPreferences);
default_placeholder_struct!(NumaRequirements);
default_placeholder_struct!(MemoryType);
default_placeholder_struct!(MemoryAccessPattern);
default_placeholder_struct!(AlignmentRequirements);
default_placeholder_struct!(LocalityPreferences);
default_placeholder_struct!(MultiGpuRequirements);
default_placeholder_struct!(LocationPreferences);
default_placeholder_struct!(SecurityLevel);
default_placeholder_struct!(AccessRestriction);
default_placeholder_struct!(EncryptionRequirements);
default_placeholder_struct!(DependencyType);
default_placeholder_struct!(SatisfactionCondition);
default_placeholder_struct!(ResourceDependency);
default_placeholder_struct!(DataDependency);
default_placeholder_struct!(ConditionalDependency);
default_placeholder_struct!(DependencyResolutionStrategy);
default_placeholder_struct!(CreatorInfo);
default_placeholder_struct!(TaskCategory);
default_placeholder_struct!(TaskVersion);
default_placeholder_struct!(ExecutionHistory);
default_placeholder_struct!(PerformanceMetrics);
default_placeholder_struct!(QualityAssuranceInfo);
default_placeholder_struct!(MonitoringSettings);
default_placeholder_struct!(LocationSpecification);
default_placeholder_struct!(LocationSelectionStrategy);
default_placeholder_struct!(LocationFailoverConfig);
default_placeholder_struct!(CapabilityRequirement);
default_placeholder_struct!(HardwarePerformanceRequirement);
default_placeholder_struct!(AvailabilityRequirement);
default_placeholder_struct!(FailureDetectionConfig);
default_placeholder_struct!(TaskRetryConfig);
default_placeholder_struct!(FailureRecoveryConfig);
default_placeholder_struct!(FailureNotificationConfig);
default_placeholder_struct!(RollbackConfig);
default_placeholder_struct!(FailureAnalysisConfig);
default_placeholder_struct!(TimeoutHandlingStrategy);
default_placeholder_struct!(TimeoutEscalationConfig);
default_placeholder_struct!(TaskMetricsCollector);
default_placeholder_struct!(TaskPriorityManager);
default_placeholder_struct!(TaskResourceManager);
default_placeholder_struct!(TaskManagerStatistics);
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct DeadlineTaskEntry {
pub task_id: TaskId,
#[serde(skip, default = "default_instant")]
pub deadline: std::time::Instant,
pub priority: u32,
}
#[derive(Debug, Clone, Default, Serialize, Deserialize)]
pub struct SchedulingStatistics {
pub total_scheduled: u64,
pub tasks_dequeued: u64,
pub successful: u64,
pub failed: u64,
}
default_placeholder_struct!(ExecutionPhase);
default_placeholder_struct!(AllocatedResources);
default_placeholder_struct!(TaskProgress);
default_placeholder_struct!(RealtimeTaskMetrics);
default_placeholder_struct!(ExecutionSummary);
default_placeholder_struct!(TaskResults);
default_placeholder_struct!(FinalPerformanceMetrics);
default_placeholder_struct!(TaskFailureInfo);
default_placeholder_struct!(RetryAttempt);
default_placeholder_struct!(FailureAnalysis);
default_placeholder_struct!(ResourceUtilization);
#[derive(Debug, Clone, Serialize, Deserialize)]
pub enum StrategyParameter {
String(String),
Integer(i64),
Float(f64),
Boolean(bool),
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub enum MetadataValue {
String(String),
Integer(i64),
Float(f64),
Boolean(bool),
Array(Vec<MetadataValue>),
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
pub enum TimeConstraintType {
MaxExecutionTime,
Deadline,
StartTime,
EndTime,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
pub enum ResourceType {
CPU,
Memory,
GPU,
Storage,
Network,
Custom(u32),
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
pub enum ConstraintOperator {
LessThan,
LessThanOrEqual,
Equal,
GreaterThanOrEqual,
GreaterThan,
NotEqual,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
pub enum ConstraintEnforcementLevel {
Advisory,
Warning,
Strict,
Critical,
}
impl TaskId {
pub fn new() -> Self {
Self(Uuid::new_v4())
}
pub fn nil() -> Self {
Self(Uuid::nil())
}
}
impl Default for TaskId {
fn default() -> Self {
Self::nil()
}
}
impl std::fmt::Display for TaskId {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
write!(f, "{}", self.0)
}
}
impl PartialEq for DeadlineTaskEntry {
fn eq(&self, other: &Self) -> bool {
self.task_id == other.task_id
}
}
impl Eq for DeadlineTaskEntry {}
impl std::cmp::Ord for DeadlineTaskEntry {
fn cmp(&self, other: &Self) -> std::cmp::Ordering {
self.deadline
.cmp(&other.deadline)
.then_with(|| self.task_id.0.cmp(&other.task_id.0))
}
}
impl std::cmp::PartialOrd for DeadlineTaskEntry {
fn partial_cmp(&self, other: &Self) -> Option<std::cmp::Ordering> {
Some(self.cmp(other))
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_task_id_generation() {
let id1 = TaskId::new();
let id2 = TaskId::new();
assert_ne!(id1, id2);
}
#[test]
fn test_task_priority_ordering() {
assert!(TaskPriority::Critical < TaskPriority::High);
assert!(TaskPriority::High < TaskPriority::Medium);
assert!(TaskPriority::Medium < TaskPriority::Low);
assert!(TaskPriority::Low < TaskPriority::Idle);
}
#[test]
fn test_task_manager_creation() {
let config = ExecutionConfig::default();
let task_manager = TaskManager::new(config);
let stats = task_manager.get_statistics();
assert_eq!(stats.tasks_submitted, 0);
}
#[test]
fn test_task_submission() {
let config = ExecutionConfig::default();
let task_manager = TaskManager::new(config);
let task = OptimizationTask {
id: TaskId::new(),
name: "Test Task".to_string(),
description: "A test optimization task".to_string(),
task_type: OptimizationTaskType::MemoryAllocation {
allocation_size: 1024,
pattern: AllocationPattern::default(),
constraints: vec![],
},
priority: TaskPriority::Medium,
strategy: OptimizationStrategy {
name: "test_strategy".to_string(),
implementation: StrategyImplementation::Builtin("test".to_string()),
parameters: HashMap::new(),
composition: None,
constraints: vec![],
safety_level: SafetyLevel::Standard,
expected_improvement: 0.1,
validation_requirements: ValidationRequirements::default(),
},
resource_requirements: ResourceRequirements {
cpu_requirements: CpuRequirements {
min_cores: 1,
preferred_cores: 2,
max_cores: 4,
architecture_requirements: vec![],
min_frequency_ghz: 2.0,
required_features: vec![],
affinity_preferences: AffinityPreferences::default(),
numa_requirements: NumaRequirements::default(),
},
memory_requirements: MemoryRequirements {
min_memory_bytes: 1024 * 1024,
preferred_memory_bytes: 2 * 1024 * 1024,
max_memory_bytes: 4 * 1024 * 1024,
memory_type: MemoryType::default(),
access_pattern: MemoryAccessPattern::default(),
alignment_requirements: AlignmentRequirements::default(),
locality_preferences: LocalityPreferences::default(),
},
gpu_requirements: GpuRequirements {
gpu_count: 0,
min_compute_capability: (3, 5),
min_gpu_memory_bytes: 0,
architecture_preferences: vec![],
required_features: vec![],
multi_gpu_requirements: MultiGpuRequirements::default(),
},
storage_requirements: StorageRequirements::default(),
network_requirements: NetworkRequirements::default(),
hardware_requirements: vec![],
allocation_preferences: AllocationPreferences::default(),
sharing_configuration: SharingConfiguration::default(),
},
constraints: vec![],
dependencies: TaskDependencies {
prerequisite_tasks: vec![],
conflicting_tasks: vec![],
successor_tasks: vec![],
resource_dependencies: vec![],
data_dependencies: vec![],
conditional_dependencies: vec![],
resolution_strategy: DependencyResolutionStrategy::default(),
},
metadata: TaskMetadata {
creator: CreatorInfo::default(),
category: TaskCategory::default(),
tags: HashSet::new(),
version: TaskVersion::default(),
execution_history: ExecutionHistory::default(),
performance_metrics: PerformanceMetrics::default(),
quality_assurance: QualityAssuranceInfo::default(),
monitoring_settings: MonitoringSettings::default(),
custom_metadata: HashMap::new(),
},
success_criteria: vec![],
failure_handling: FailureHandlingConfig {
detection: FailureDetectionConfig::default(),
retry: TaskRetryConfig::default(),
recovery: FailureRecoveryConfig::default(),
notification: FailureNotificationConfig::default(),
rollback: RollbackConfig::default(),
analysis: FailureAnalysisConfig::default(),
},
execution_location: ExecutionLocation {
preferred_locations: vec![],
allowed_locations: vec![],
forbidden_locations: vec![],
selection_strategy: LocationSelectionStrategy::default(),
failover_configuration: LocationFailoverConfig::default(),
},
timeout_config: TimeoutConfig {
overall_timeout: Duration::from_secs(300),
operation_timeouts: HashMap::new(),
handling_strategy: TimeoutHandlingStrategy::default(),
grace_period: Duration::from_secs(30),
escalation: TimeoutEscalationConfig::default(),
},
custom_parameters: HashMap::new(),
created_at: SystemTime::now(),
deadline: None,
estimated_duration: Some(Duration::from_secs(60)),
};
let task_id = task_manager.submit_task(task).expect("task submission should succeed");
let stats = task_manager.get_statistics();
assert_eq!(stats.tasks_submitted, 1);
let retrieved_task = task_manager.get_task(task_id).expect("task retrieval should succeed");
assert_eq!(retrieved_task.name, "Test Task");
}
#[test]
fn test_task_scheduling_queue() {
let mut queue = TaskSchedulingQueue::new();
let critical_task = TaskId::new();
let high_task = TaskId::new();
let medium_task = TaskId::new();
queue.enqueue_task(medium_task, TaskPriority::Medium);
queue.enqueue_task(critical_task, TaskPriority::Critical);
queue.enqueue_task(high_task, TaskPriority::High);
assert_eq!(queue.dequeue_next_task(), Some(critical_task));
assert_eq!(queue.dequeue_next_task(), Some(high_task));
assert_eq!(queue.dequeue_next_task(), Some(medium_task));
}
}