sklears_compose/
task_definitions.rs

1//! Task Definition System for Composable Execution Engine
2//!
3//! This module provides comprehensive task definition and management capabilities for the
4//! composable execution engine. It includes task metadata, requirements, constraints,
5//! results, and execution context management with full lifecycle support from task
6//! creation through completion and cleanup.
7//!
8//! # Task Architecture
9//!
10//! The task system is built around several core concepts:
11//!
12//! ```text
13//! ExecutionTask
14//! ├── TaskMetadata          // Task identification and classification
15//! ├── TaskRequirements      // Resource and dependency requirements
16//! ├── TaskConstraints       // Execution limits and constraints
17//! ├── TaskContext          // Runtime execution context
18//! └── TaskResult           // Execution output and metrics
19//! ```
20//!
21//! # Task Lifecycle
22//!
23//! Tasks progress through well-defined states:
24//!
25//! ```text
26//! Created → Queued → Scheduled → Running → Completed/Failed/Cancelled
27//!     ↓        ↓        ↓         ↓            ↓
28//!   Metadata  Priority  Resources  Context    Results
29//! ```
30//!
31//! # Usage Examples
32//!
33//! ## Basic Task Creation
34//! ```rust,ignore
35//! use sklears_compose::task_definitions::*;
36//!
37//! // Create a simple machine learning training task
38//! let task = ExecutionTask::builder()
39//!     .name("train_model")
40//!     .task_type(TaskType::Fit)
41//!     .priority(TaskPriority::High)
42//!     .requirements(TaskRequirements {
43//!         cpu_cores: Some(8),
44//!         memory: Some(16 * 1024 * 1024 * 1024), // 16GB
45//!         gpu_memory: Some(8 * 1024 * 1024 * 1024), // 8GB GPU memory
46//!         max_duration: Some(Duration::from_secs(3600)), // 1 hour
47//!         ..Default::default()
48//!     })
49//!     .constraints(TaskConstraints {
50//!         can_be_preempted: false,
51//!         requires_exclusive_access: true,
52//!         location_constraint: Some(ExecutionLocation::OnPremise),
53//!         ..Default::default()
54//!     })
55//!     .build();
56//! ```
57//!
58//! ## Data Processing Pipeline Task
59//! ```rust,ignore
60//! let preprocessing_task = ExecutionTask::builder()
61//!     .name("preprocess_data")
62//!     .task_type(TaskType::Transform)
63//!     .priority(TaskPriority::Normal)
64//!     .requirements(TaskRequirements {
65//!         cpu_cores: Some(4),
66//!         memory: Some(8 * 1024 * 1024 * 1024), // 8GB
67//!         disk_space: Some(100 * 1024 * 1024 * 1024), // 100GB
68//!         network_bandwidth: Some(100 * 1024 * 1024), // 100MB/s
69//!         dependencies: vec!["data_ingestion".to_string()],
70//!         ..Default::default()
71//!     })
72//!     .constraints(TaskConstraints {
73//!         can_be_preempted: true,
74//!         retry_policy: Some(RetryPolicy {
75//!             max_attempts: 3,
76//!             backoff_strategy: BackoffStrategy::Exponential { base: 1000, max: 30000 },
77//!         }),
78//!         timeout: Some(Duration::from_secs(1800)), // 30 minutes
79//!         ..Default::default()
80//!     })
81//!     .build();
82//! ```
83//!
84//! ## Real-time Inference Task
85//! ```rust,ignore
86//! let inference_task = ExecutionTask::builder()
87//!     .name("realtime_inference")
88//!     .task_type(TaskType::Predict)
89//!     .priority(TaskPriority::Critical)
90//!     .requirements(TaskRequirements {
91//!         cpu_cores: Some(2),
92//!         memory: Some(4 * 1024 * 1024 * 1024), // 4GB
93//!         max_latency: Some(Duration::from_millis(10)), // 10ms SLA
94//!         gpu_devices: vec!["cuda:0".to_string()],
95//!         ..Default::default()
96//!     })
97//!     .constraints(TaskConstraints {
98//!         can_be_preempted: false,
99//!         requires_exclusive_access: false,
100//!         affinity: Some(TaskAffinity::GpuOptimized),
101//!         location_constraint: Some(ExecutionLocation::Edge),
102//!         ..Default::default()
103//!     })
104//!     .build();
105//! ```
106//!
107//! ## Distributed Training Task
108//! ```rust,ignore
109//! let distributed_training = ExecutionTask::builder()
110//!     .name("distributed_training")
111//!     .task_type(TaskType::Fit)
112//!     .priority(TaskPriority::High)
113//!     .requirements(TaskRequirements {
114//!         cpu_cores: Some(32),
115//!         memory: Some(128 * 1024 * 1024 * 1024), // 128GB
116//!         gpu_devices: vec!["cuda:0", "cuda:1", "cuda:2", "cuda:3"].iter().map(|s| s.to_string()).collect(),
117//!         network_bandwidth: Some(10 * 1024 * 1024 * 1024), // 10GB/s for model sync
118//!         dependencies: vec!["data_preparation".to_string(), "model_setup".to_string()],
119//!         ..Default::default()
120//!     })
121//!     .constraints(TaskConstraints {
122//!         can_be_preempted: false,
123//!         requires_exclusive_access: true,
124//!         affinity: Some(TaskAffinity::CpuOptimized),
125//!         location_constraint: Some(ExecutionLocation::CloudCluster),
126//!         checkpoint_interval: Some(Duration::from_secs(600)), // Checkpoint every 10 minutes
127//!         ..Default::default()
128//!     })
129//!     .metadata(TaskMetadata {
130//!         created_at: SystemTime::now(),
131//!         owner: "ml_team".to_string(),
132//!         project: "large_model_training".to_string(),
133//!         tags: vec!["distributed", "gpu", "training"].iter().map(|s| s.to_string()).collect(),
134//!         estimated_duration: Some(Duration::from_secs(86400)), // 24 hours
135//!         cost_budget: Some(1000.0), // $1000 budget
136//!         ..Default::default()
137//!     })
138//!     .build();
139//! ```
140
141use scirs2_core::ndarray::Array2;
142use sklears_core::error::{Result as SklResult, SklearsError};
143use std::any::Any;
144use std::collections::HashMap;
145use std::fmt;
146use std::future::Future;
147use std::pin::Pin;
148use std::sync::Arc;
149use std::time::{Duration, SystemTime};
150
151/// Main execution task definition with comprehensive metadata and requirements
152#[derive(Clone)]
153pub struct ExecutionTask {
154    /// Task metadata and identification
155    pub metadata: TaskMetadata,
156    /// Resource requirements for execution
157    pub requirements: TaskRequirements,
158    /// Execution constraints and policies
159    pub constraints: TaskConstraints,
160    /// Task execution function or closure
161    pub execution_fn: Option<TaskExecutionFunction>,
162    /// Current task status
163    pub status: TaskStatus,
164    /// Task execution context
165    pub context: Option<TaskContext>,
166    /// Task execution results (when completed)
167    pub result: Option<TaskResult>,
168}
169
170impl std::fmt::Debug for ExecutionTask {
171    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
172        f.debug_struct("ExecutionTask")
173            .field("metadata", &self.metadata)
174            .field("requirements", &self.requirements)
175            .field("constraints", &self.constraints)
176            .field(
177                "execution_fn",
178                &match &self.execution_fn {
179                    Some(_) => "<function>",
180                    None => "<none>",
181                },
182            )
183            .field("status", &self.status)
184            .field("context", &self.context)
185            .field("result", &self.result)
186            .finish()
187    }
188}
189
190/// Task execution function type
191pub type TaskExecutionFunction =
192    Arc<dyn Fn() -> Pin<Box<dyn Future<Output = SklResult<TaskResult>> + Send>> + Send + Sync>;
193
194/// Comprehensive task metadata for identification and classification
195#[derive(Debug, Clone)]
196pub struct TaskMetadata {
197    /// Unique task identifier
198    pub id: String,
199    /// Human-readable task name
200    pub name: String,
201    /// Task type classification
202    pub task_type: TaskType,
203    /// Task priority level
204    pub priority: TaskPriority,
205    /// Task creation timestamp
206    pub created_at: SystemTime,
207    /// Task owner or creator
208    pub owner: String,
209    /// Project or workspace association
210    pub project: String,
211    /// Task description
212    pub description: String,
213    /// Task tags for categorization
214    pub tags: Vec<String>,
215    /// Estimated execution duration
216    pub estimated_duration: Option<Duration>,
217    /// Expected output size
218    pub estimated_output_size: Option<u64>,
219    /// Cost budget allocation
220    pub cost_budget: Option<f64>,
221    /// Task version for reproducibility
222    pub version: String,
223    /// Task dependencies (other task IDs)
224    pub dependencies: Vec<String>,
225    /// Custom metadata fields
226    pub custom_fields: HashMap<String, String>,
227}
228
229/// Resource requirements specification for task execution
230#[derive(Debug, Clone, Default)]
231pub struct TaskRequirements {
232    /// Required CPU cores
233    pub cpu_cores: Option<usize>,
234    /// Required memory in bytes
235    pub memory: Option<u64>,
236    /// Required GPU devices
237    pub gpu_devices: Vec<String>,
238    /// Required GPU memory per device
239    pub gpu_memory: Option<u64>,
240    /// Required disk space in bytes
241    pub disk_space: Option<u64>,
242    /// Required network bandwidth in bytes/sec
243    pub network_bandwidth: Option<u64>,
244    /// Maximum acceptable latency
245    pub max_latency: Option<Duration>,
246    /// Maximum execution duration
247    pub max_duration: Option<Duration>,
248    /// Minimum required performance score
249    pub min_performance_score: Option<f64>,
250    /// Required software dependencies
251    pub software_dependencies: Vec<SoftwareDependency>,
252    /// Hardware requirements
253    pub hardware_requirements: HardwareRequirements,
254    /// Data dependencies
255    pub data_dependencies: Vec<DataDependency>,
256    /// Service dependencies
257    pub service_dependencies: Vec<ServiceDependency>,
258    /// Task dependencies (execution order)
259    pub dependencies: Vec<String>,
260    /// Input data size estimation
261    pub input_data_size: Option<u64>,
262    /// Output data size estimation
263    pub output_data_size: Option<u64>,
264}
265
266/// Software dependency specification
267#[derive(Debug, Clone)]
268pub struct SoftwareDependency {
269    /// Software name
270    pub name: String,
271    /// Required version or version constraint
272    pub version: String,
273    /// Package manager or source
274    pub source: String,
275    /// Is this dependency optional?
276    pub optional: bool,
277    /// Installation command or script
278    pub install_command: Option<String>,
279}
280
281/// Hardware requirements specification
282#[derive(Debug, Clone, Default)]
283pub struct HardwareRequirements {
284    /// CPU architecture requirement
285    pub cpu_architecture: Option<CpuArchitecture>,
286    /// Minimum CPU frequency
287    pub min_cpu_frequency: Option<f64>,
288    /// Required instruction sets
289    pub required_instruction_sets: Vec<InstructionSet>,
290    /// GPU architecture requirement
291    pub gpu_architecture: Option<GpuArchitecture>,
292    /// Minimum GPU compute capability
293    pub min_gpu_compute_capability: Option<String>,
294    /// Memory type preference
295    pub memory_type: Option<MemoryType>,
296    /// Storage type requirement
297    pub storage_type: Option<StorageType>,
298    /// Network requirements
299    pub network_requirements: NetworkRequirements,
300}
301
302/// CPU architecture types
303#[derive(Debug, Clone, PartialEq)]
304pub enum CpuArchitecture {
305    /// X86_64
306    X86_64,
307    /// Aarch64
308    Aarch64,
309    /// Arm
310    Arm,
311    /// Riscv64
312    Riscv64,
313    /// Power
314    Power,
315    /// Sparc
316    Sparc,
317}
318
319/// Instruction set requirements
320#[derive(Debug, Clone, PartialEq)]
321pub enum InstructionSet {
322    /// AVX
323    AVX,
324    /// AVX2
325    AVX2,
326    /// AVX512
327    AVX512,
328    /// SSE2
329    SSE2,
330    /// SSE3
331    SSE3,
332    /// SSE4_1
333    SSE4_1,
334    /// SSE4_2
335    SSE4_2,
336    /// NEON
337    NEON,
338    /// SVE
339    SVE,
340}
341
342/// GPU architecture types
343#[derive(Debug, Clone, PartialEq)]
344pub enum GpuArchitecture {
345    /// CUDA
346    CUDA,
347    /// ROCm
348    ROCm,
349    /// OpenCL
350    OpenCL,
351    /// Metal
352    Metal,
353    /// Vulkan
354    Vulkan,
355    /// DirectML
356    DirectML,
357}
358
359/// Memory type preferences
360#[derive(Debug, Clone, PartialEq)]
361pub enum MemoryType {
362    /// DDR4
363    DDR4,
364    /// DDR5
365    DDR5,
366    /// HBM2
367    HBM2,
368    /// HBM3
369    HBM3,
370    /// LPDDR5
371    LPDDR5,
372}
373
374/// Storage type requirements
375#[derive(Debug, Clone, PartialEq)]
376pub enum StorageType {
377    /// SSD
378    SSD,
379    /// NVMe
380    NVMe,
381    /// HDD
382    HDD,
383    /// MemoryMapped
384    MemoryMapped,
385    /// Network
386    Network,
387}
388
389/// Network requirements specification
390#[derive(Debug, Clone, Default)]
391pub struct NetworkRequirements {
392    /// Minimum bandwidth
393    pub min_bandwidth: Option<u64>,
394    /// Maximum acceptable latency
395    pub max_latency: Option<Duration>,
396    /// Required protocols
397    pub protocols: Vec<NetworkProtocol>,
398    /// Security requirements
399    pub security_requirements: Vec<SecurityRequirement>,
400}
401
402/// Network protocol types
403#[derive(Debug, Clone, PartialEq)]
404pub enum NetworkProtocol {
405    /// TCP
406    TCP,
407    /// UDP
408    UDP,
409    /// HTTP
410    HTTP,
411    /// HTTPS
412    HTTPS,
413    gRPC,
414    /// WebSocket
415    WebSocket,
416    /// MQTT
417    MQTT,
418    /// InfiniBand
419    InfiniBand,
420}
421
422/// Security requirement types
423#[derive(Debug, Clone, PartialEq)]
424pub enum SecurityRequirement {
425    /// TLS
426    TLS,
427    mTLS,
428    /// OAuth2
429    OAuth2,
430    /// JWT
431    JWT,
432    /// RBAC
433    RBAC,
434    /// Encryption
435    Encryption,
436    /// VPN
437    VPN,
438}
439
440/// Data dependency specification
441#[derive(Debug, Clone)]
442pub struct DataDependency {
443    /// Data source identifier
444    pub source: String,
445    /// Data format
446    pub format: DataFormat,
447    /// Data size estimation
448    pub size: Option<u64>,
449    /// Data access pattern
450    pub access_pattern: DataAccessPattern,
451    /// Data locality preference
452    pub locality_preference: DataLocality,
453    /// Required data freshness
454    pub freshness_requirement: Option<Duration>,
455}
456
457/// Data format types
458#[derive(Debug, Clone, PartialEq)]
459pub enum DataFormat {
460    /// CSV
461    CSV,
462    /// Parquet
463    Parquet,
464    /// JSON
465    JSON,
466    /// JSONL
467    JSONL,
468    /// Avro
469    Avro,
470    /// ORC
471    ORC,
472    /// HDF5
473    HDF5,
474    /// NumPy
475    NumPy,
476    /// Arrow
477    Arrow,
478    /// Custom
479    Custom(String),
480}
481
482/// Data access patterns
483#[derive(Debug, Clone, PartialEq)]
484pub enum DataAccessPattern {
485    /// Sequential
486    Sequential,
487    /// Random
488    Random,
489    /// Streaming
490    Streaming,
491    /// Batch
492    Batch,
493    /// Interactive
494    Interactive,
495}
496
497/// Data locality preferences
498#[derive(Debug, Clone, PartialEq)]
499pub enum DataLocality {
500    /// Local
501    Local,
502    /// Regional
503    Regional,
504    /// Global
505    Global,
506    /// Edge
507    Edge,
508    /// NoPreference
509    NoPreference,
510}
511
512/// Service dependency specification
513#[derive(Debug, Clone)]
514pub struct ServiceDependency {
515    /// Service name or identifier
516    pub name: String,
517    /// Service endpoint URL
518    pub endpoint: String,
519    /// Required service version
520    pub version: Option<String>,
521    /// Authentication requirements
522    pub auth_requirements: Vec<AuthRequirement>,
523    /// Service level agreement requirements
524    pub sla_requirements: SlaRequirements,
525}
526
527/// Authentication requirement types
528#[derive(Debug, Clone, PartialEq)]
529pub enum AuthRequirement {
530    /// ApiKey
531    ApiKey,
532    /// Bearer
533    Bearer,
534    /// Basic
535    Basic,
536    /// OAuth2
537    OAuth2,
538    /// Custom
539    Custom(String),
540}
541
542/// Service level agreement requirements
543#[derive(Debug, Clone)]
544pub struct SlaRequirements {
545    /// Maximum response time
546    pub max_response_time: Option<Duration>,
547    /// Minimum availability percentage
548    pub min_availability: Option<f64>,
549    /// Maximum error rate
550    pub max_error_rate: Option<f64>,
551}
552
553/// Task execution constraints and policies
554#[derive(Debug, Clone)]
555pub struct TaskConstraints {
556    /// Can the task be preempted?
557    pub can_be_preempted: bool,
558    /// Does the task require exclusive resource access?
559    pub requires_exclusive_access: bool,
560    /// Maximum execution time before timeout
561    pub timeout: Option<Duration>,
562    /// Retry policy configuration
563    pub retry_policy: Option<RetryPolicy>,
564    /// Resource affinity preferences
565    pub affinity: Option<TaskAffinity>,
566    /// Anti-affinity constraints
567    pub anti_affinity: Option<TaskAntiAffinity>,
568    /// Execution location constraints
569    pub location_constraint: Option<ExecutionLocation>,
570    /// Security constraints
571    pub security_constraints: SecurityConstraints,
572    /// Checkpointing configuration
573    pub checkpoint_interval: Option<Duration>,
574    /// Cleanup policy after completion
575    pub cleanup_policy: CleanupPolicy,
576    /// Resource scaling constraints
577    pub scaling_constraints: ScalingConstraints,
578}
579
580/// Retry policy configuration
581#[derive(Debug, Clone)]
582pub struct RetryPolicy {
583    /// Maximum retry attempts
584    pub max_attempts: u32,
585    /// Backoff strategy
586    pub backoff_strategy: BackoffStrategy,
587    /// Conditions that trigger retries
588    pub retry_conditions: Vec<RetryCondition>,
589    /// Maximum total retry time
590    pub max_retry_time: Option<Duration>,
591}
592
593/// Backoff strategies for retries
594#[derive(Debug, Clone)]
595pub enum BackoffStrategy {
596    /// Fixed delay between retries
597    Fixed { delay: u64 },
598    /// Linear increase in delay
599    Linear { base: u64, increment: u64 },
600    /// Exponential backoff
601    Exponential { base: u64, max: u64 },
602    /// Exponential with jitter
603    ExponentialJitter { base: u64, max: u64, jitter: f64 },
604}
605
606/// Conditions that trigger task retries
607#[derive(Debug, Clone, PartialEq)]
608pub enum RetryCondition {
609    /// Network-related failures
610    NetworkFailure,
611    /// Resource unavailability
612    ResourceUnavailable,
613    /// Timeout failures
614    Timeout,
615    /// Transient errors
616    TransientError,
617    /// Custom error condition
618    Custom(String),
619}
620
621/// Task affinity preferences for optimization
622#[derive(Debug, Clone, PartialEq)]
623pub enum TaskAffinity {
624    /// CPU-optimized execution
625    CpuOptimized,
626    /// GPU-optimized execution
627    GpuOptimized,
628    /// Memory-optimized execution
629    MemoryOptimized,
630    /// Network-optimized execution
631    NetworkOptimized,
632    /// Storage-optimized execution
633    StorageOptimized,
634    /// Energy-efficient execution
635    EnergyEfficient,
636    /// Node affinity
637    NodeAffinity(String),
638    /// Custom affinity
639    Custom(String),
640}
641
642/// Task anti-affinity constraints
643#[derive(Debug, Clone)]
644pub struct TaskAntiAffinity {
645    /// Tasks that cannot run on the same node
646    pub node_anti_affinity: Vec<String>,
647    /// Tasks that cannot run simultaneously
648    pub temporal_anti_affinity: Vec<String>,
649    /// Resource conflicts to avoid
650    pub resource_anti_affinity: Vec<String>,
651}
652
653/// Execution location constraints
654#[derive(Debug, Clone, PartialEq)]
655pub enum ExecutionLocation {
656    /// On-premise execution
657    OnPremise,
658    /// Cloud execution
659    Cloud,
660    /// Edge device execution
661    Edge,
662    /// Specific cloud provider
663    CloudProvider(String),
664    /// Specific region
665    Region(String),
666    /// Specific availability zone
667    AvailabilityZone(String),
668    /// Specific cluster
669    Cluster(String),
670    /// Specific node
671    Node(String),
672    /// Hybrid execution
673    Hybrid,
674    /// Cloud cluster execution
675    CloudCluster,
676}
677
678/// Security constraints for task execution
679#[derive(Debug, Clone)]
680pub struct SecurityConstraints {
681    /// Required security level
682    pub security_level: SecurityLevel,
683    /// Data classification level
684    pub data_classification: DataClassification,
685    /// Required compliance standards
686    pub compliance_requirements: Vec<ComplianceStandard>,
687    /// Encryption requirements
688    pub encryption_requirements: EncryptionRequirements,
689    /// Access control requirements
690    pub access_control: AccessControlRequirements,
691}
692
693/// Security levels
694#[derive(Debug, Clone, PartialEq)]
695pub enum SecurityLevel {
696    /// Public
697    Public,
698    /// Internal
699    Internal,
700    /// Confidential
701    Confidential,
702    /// Secret
703    Secret,
704    /// TopSecret
705    TopSecret,
706}
707
708/// Data classification levels
709#[derive(Debug, Clone, PartialEq)]
710pub enum DataClassification {
711    /// Public
712    Public,
713    /// Internal
714    Internal,
715    /// Sensitive
716    Sensitive,
717    /// Restricted
718    Restricted,
719    /// Confidential
720    Confidential,
721}
722
723/// Compliance standards
724#[derive(Debug, Clone, PartialEq)]
725pub enum ComplianceStandard {
726    /// GDPR
727    GDPR,
728    /// HIPAA
729    HIPAA,
730    /// SOC2
731    SOC2,
732    /// ISO27001
733    ISO27001,
734    /// FISMA
735    FISMA,
736    /// PCI_DSS
737    PCI_DSS,
738    /// Custom
739    Custom(String),
740}
741
742/// Encryption requirements
743#[derive(Debug, Clone, Default)]
744pub struct EncryptionRequirements {
745    /// Encryption at rest required
746    pub at_rest: bool,
747    /// Encryption in transit required
748    pub in_transit: bool,
749    /// Encryption in use (processing) required
750    pub in_use: bool,
751    /// Required encryption algorithms
752    pub algorithms: Vec<EncryptionAlgorithm>,
753}
754
755/// Encryption algorithm types
756#[derive(Debug, Clone, PartialEq)]
757pub enum EncryptionAlgorithm {
758    AES256,
759    AES128,
760    RSA2048,
761    RSA4096,
762    ChaCha20,
763    Custom(String),
764}
765
766/// Access control requirements
767#[derive(Debug, Clone, Default)]
768pub struct AccessControlRequirements {
769    /// Required authentication methods
770    pub authentication: Vec<AuthenticationMethod>,
771    /// Required authorization policies
772    pub authorization: Vec<AuthorizationPolicy>,
773    /// Audit requirements
774    pub audit_requirements: AuditRequirements,
775}
776
777/// Authentication methods
778#[derive(Debug, Clone, PartialEq)]
779pub enum AuthenticationMethod {
780    /// Password
781    Password,
782    /// MFA
783    MFA,
784    /// Certificate
785    Certificate,
786    /// Biometric
787    Biometric,
788    /// SSO
789    SSO,
790    /// LDAP
791    LDAP,
792    /// Custom
793    Custom(String),
794}
795
796/// Authorization policy types
797#[derive(Debug, Clone, PartialEq)]
798pub enum AuthorizationPolicy {
799    /// RBAC
800    RBAC,
801    /// ABAC
802    ABAC,
803    /// DAC
804    DAC,
805    /// MAC
806    MAC,
807    /// Custom
808    Custom(String),
809}
810
811/// Audit requirements
812#[derive(Debug, Clone, Default)]
813pub struct AuditRequirements {
814    /// Enable audit logging
815    pub enabled: bool,
816    /// Audit log retention period
817    pub retention_period: Option<Duration>,
818    /// Audit events to track
819    pub events: Vec<AuditEvent>,
820}
821
822/// Audit event types
823#[derive(Debug, Clone, PartialEq)]
824pub enum AuditEvent {
825    /// Access
826    Access,
827    /// Modification
828    Modification,
829    /// Deletion
830    Deletion,
831    /// Export
832    Export,
833    /// Authentication
834    Authentication,
835    /// Authorization
836    Authorization,
837    /// Custom
838    Custom(String),
839}
840
841/// Cleanup policy after task completion
842#[derive(Debug, Clone)]
843pub struct CleanupPolicy {
844    /// Cleanup strategy
845    pub strategy: CleanupStrategy,
846    /// Cleanup delay after completion
847    pub delay: Option<Duration>,
848    /// Resources to preserve
849    pub preserve_resources: Vec<String>,
850    /// Cleanup timeout
851    pub timeout: Option<Duration>,
852}
853
854/// Cleanup strategies
855#[derive(Debug, Clone, PartialEq)]
856pub enum CleanupStrategy {
857    /// Immediate cleanup
858    Immediate,
859    /// Delayed cleanup
860    Delayed,
861    /// Manual cleanup
862    Manual,
863    /// Conditional cleanup
864    Conditional(String),
865    /// No cleanup
866    None,
867}
868
869/// Resource scaling constraints
870#[derive(Debug, Clone)]
871pub struct ScalingConstraints {
872    /// Enable horizontal scaling
873    pub horizontal_scaling: bool,
874    /// Enable vertical scaling
875    pub vertical_scaling: bool,
876    /// Minimum instances
877    pub min_instances: Option<usize>,
878    /// Maximum instances
879    pub max_instances: Option<usize>,
880    /// Scaling triggers
881    pub scaling_triggers: Vec<ScalingTrigger>,
882    /// Scaling cooldown period
883    pub cooldown_period: Option<Duration>,
884}
885
886/// Scaling trigger types
887#[derive(Debug, Clone)]
888pub enum ScalingTrigger {
889    /// CPU utilization threshold
890    CpuUtilization(f64),
891    /// Memory utilization threshold
892    MemoryUtilization(f64),
893    /// Queue depth threshold
894    QueueDepth(usize),
895    /// Custom metric threshold
896    CustomMetric { name: String, threshold: f64 },
897}
898
899/// Task execution status
900#[derive(Debug, Clone, PartialEq)]
901pub enum TaskStatus {
902    /// Task has been created but not queued
903    Created,
904    /// Task is queued for execution
905    Queued,
906    /// Task is scheduled for execution
907    Scheduled,
908    /// Task is currently running
909    Running,
910    /// Task is paused
911    Paused,
912    /// Task completed successfully
913    Completed,
914    /// Task failed with error
915    Failed(TaskError),
916    /// Task was cancelled
917    Cancelled,
918    /// Task timed out
919    TimedOut,
920    /// Task is being retried
921    Retrying,
922    /// Task is being cleaned up
923    CleaningUp,
924}
925
926/// Task type classification for execution strategies
927#[derive(Debug, Clone, PartialEq)]
928pub enum TaskType {
929    /// Data preprocessing task
930    Preprocess,
931    /// Model training task
932    Fit,
933    /// Prediction/inference task
934    Predict,
935    /// Data transformation task
936    Transform,
937    /// Model evaluation task
938    Evaluate,
939    /// Data validation task
940    Validate,
941    /// Model deployment task
942    Deploy,
943    /// Monitoring task
944    Monitor,
945    /// Cleanup task
946    Cleanup,
947    /// Custom task type
948    Custom(String),
949}
950
951/// Task priority levels for scheduling
952#[derive(Debug, Clone, PartialEq, Eq, PartialOrd, Ord)]
953pub enum TaskPriority {
954    /// Lowest priority
955    Lowest,
956    /// Low priority
957    Low,
958    /// Normal priority (default)
959    Normal,
960    /// High priority
961    High,
962    /// Highest priority
963    Highest,
964    /// Critical priority (preempts others)
965    Critical,
966}
967
968/// Task execution error types
969#[derive(Debug, Clone, PartialEq)]
970pub enum TaskError {
971    /// Resource allocation failure
972    ResourceAllocation(String),
973    /// Dependency failure
974    DependencyFailure(String),
975    /// Execution timeout
976    Timeout,
977    /// Runtime error during execution
978    RuntimeError(String),
979    /// Validation error
980    ValidationError(String),
981    /// Infrastructure error
982    InfrastructureError(String),
983    /// Security violation
984    SecurityViolation(String),
985    /// Custom error
986    Custom(String),
987}
988
989/// Task execution result with comprehensive metrics
990#[derive(Debug, Clone)]
991pub struct TaskResult {
992    /// Task identifier
993    pub task_id: String,
994    /// Task execution status
995    pub status: TaskStatus,
996    /// Execution output data
997    pub output: Option<TaskOutput>,
998    /// Execution metrics
999    pub metrics: TaskExecutionMetrics,
1000    /// Resource usage during execution
1001    pub resource_usage: TaskResourceUsage,
1002    /// Performance metrics
1003    pub performance_metrics: TaskPerformanceMetrics,
1004    /// Error information (if failed)
1005    pub error: Option<TaskError>,
1006    /// Execution logs
1007    pub logs: Vec<LogEntry>,
1008    /// Execution artifacts
1009    pub artifacts: Vec<Artifact>,
1010    /// Task execution time (convenience field)
1011    pub execution_time: Option<Duration>,
1012    /// Task metadata
1013    pub metadata: HashMap<String, String>,
1014}
1015
1016/// Task execution output
1017#[derive(Debug)]
1018pub enum TaskOutput {
1019    /// Numerical array output
1020    Array(Array2<f64>),
1021    /// String output
1022    Text(String),
1023    /// Binary data output
1024    Binary(Vec<u8>),
1025    /// JSON-serialized output
1026    Json(String),
1027    /// File path to output
1028    FilePath(String),
1029    /// Multiple outputs
1030    Multiple(HashMap<String, Box<TaskOutput>>),
1031    /// Custom output type
1032    Custom(Box<dyn Any + Send + Sync>),
1033}
1034
1035impl Clone for TaskOutput {
1036    fn clone(&self) -> Self {
1037        match self {
1038            TaskOutput::Array(arr) => TaskOutput::Array(arr.clone()),
1039            TaskOutput::Text(text) => TaskOutput::Text(text.clone()),
1040            TaskOutput::Binary(data) => TaskOutput::Binary(data.clone()),
1041            TaskOutput::Json(json) => TaskOutput::Json(json.clone()),
1042            TaskOutput::FilePath(path) => TaskOutput::FilePath(path.clone()),
1043            TaskOutput::Multiple(map) => TaskOutput::Multiple(map.clone()),
1044            TaskOutput::Custom(_) => {
1045                // Cannot clone trait objects, provide a placeholder
1046                TaskOutput::Text("Custom output (clone not supported)".to_string())
1047            }
1048        }
1049    }
1050}
1051
1052/// Task resource usage metrics
1053#[derive(Debug, Clone, Default)]
1054pub struct TaskResourceUsage {
1055    /// CPU time used (in seconds)
1056    pub cpu_time: f64,
1057    /// Memory usage (in bytes)
1058    pub memory_usage: u64,
1059    /// Peak memory usage (in bytes)
1060    pub peak_memory_usage: u64,
1061    /// Disk I/O operations
1062    pub disk_io_operations: u64,
1063    /// Network bandwidth used (in bytes)
1064    pub network_usage: u64,
1065    /// GPU usage percentage
1066    pub gpu_usage: Option<f64>,
1067    /// GPU memory used (in bytes)
1068    pub gpu_memory_usage: Option<u64>,
1069}
1070
1071/// Task performance metrics
1072#[derive(Debug, Clone, Default)]
1073pub struct TaskPerformanceMetrics {
1074    /// Operations per second
1075    pub operations_per_second: f64,
1076    /// Throughput (items processed per second)
1077    pub throughput: f64,
1078    /// Latency (average response time)
1079    pub latency: Duration,
1080    /// Error rate (percentage)
1081    pub error_rate: f64,
1082    /// Cache hit rate (percentage)
1083    pub cache_hit_rate: Option<f64>,
1084    /// Efficiency score (0.0-1.0)
1085    pub efficiency_score: f64,
1086}
1087
1088/// Log entry for task execution
1089#[derive(Debug, Clone)]
1090pub struct LogEntry {
1091    /// Log timestamp
1092    pub timestamp: SystemTime,
1093    /// Log level
1094    pub level: LogLevel,
1095    /// Log message
1096    pub message: String,
1097    /// Log source component
1098    pub source: String,
1099}
1100
1101/// Log levels for task execution
1102#[derive(Debug, Clone)]
1103pub enum LogLevel {
1104    /// Debug level
1105    Debug,
1106    /// Info level
1107    Info,
1108    /// Warning level
1109    Warning,
1110    /// Error level
1111    Error,
1112}
1113
1114/// Task execution artifact
1115#[derive(Debug, Clone)]
1116pub struct Artifact {
1117    /// Artifact name
1118    pub name: String,
1119    /// Artifact type
1120    pub artifact_type: ArtifactType,
1121    /// File path or location
1122    pub location: String,
1123    /// Artifact size in bytes
1124    pub size: u64,
1125    /// Creation timestamp
1126    pub created_at: SystemTime,
1127    /// Content hash for verification
1128    pub content_hash: Option<String>,
1129}
1130
1131/// Types of task artifacts
1132#[derive(Debug, Clone)]
1133pub enum ArtifactType {
1134    /// Output file
1135    OutputFile,
1136    /// Log file
1137    LogFile,
1138    /// Intermediate result
1139    IntermediateResult,
1140    /// Cache file
1141    CacheFile,
1142    /// Report or summary
1143    Report,
1144    /// Custom artifact
1145    Custom(String),
1146}
1147
1148/// Comprehensive task execution metrics
1149#[derive(Debug, Clone)]
1150pub struct TaskExecutionMetrics {
1151    /// Task start time
1152    pub start_time: SystemTime,
1153    /// Task end time
1154    pub end_time: Option<SystemTime>,
1155    /// Total execution duration
1156    pub duration: Option<Duration>,
1157    /// Queue wait time
1158    pub queue_wait_time: Duration,
1159    /// Scheduling time
1160    pub scheduling_time: Duration,
1161    /// Setup time
1162    pub setup_time: Duration,
1163    /// Cleanup time
1164    pub cleanup_time: Duration,
1165    /// Number of retry attempts
1166    pub retry_attempts: u32,
1167    /// Checkpoint count
1168    pub checkpoint_count: u32,
1169    /// Task completion percentage
1170    pub completion_percentage: f64,
1171    /// Task efficiency score
1172    pub efficiency_score: Option<f64>,
1173}
1174
1175impl Default for TaskExecutionMetrics {
1176    fn default() -> Self {
1177        Self {
1178            start_time: SystemTime::now(),
1179            end_time: None,
1180            duration: None,
1181            queue_wait_time: Duration::from_secs(0),
1182            scheduling_time: Duration::from_secs(0),
1183            setup_time: Duration::from_secs(0),
1184            cleanup_time: Duration::from_secs(0),
1185            retry_attempts: 0,
1186            checkpoint_count: 0,
1187            completion_percentage: 0.0,
1188            efficiency_score: None,
1189        }
1190    }
1191}
1192
1193/// Task execution context for runtime state management
1194#[derive(Debug, Clone)]
1195pub struct TaskContext {
1196    /// Context identifier
1197    pub id: String,
1198    /// Execution environment variables
1199    pub environment: HashMap<String, String>,
1200    /// Working directory
1201    pub working_directory: String,
1202    /// Allocated resources
1203    pub allocated_resources: AllocatedResources,
1204    /// Execution state
1205    pub state: TaskExecutionState,
1206    /// Progress information
1207    pub progress: TaskProgress,
1208    /// Communication channels
1209    pub channels: CommunicationChannels,
1210}
1211
1212/// Allocated resources for task execution
1213#[derive(Debug, Clone)]
1214pub struct AllocatedResources {
1215    /// Allocated CPU cores
1216    pub cpu_cores: Vec<usize>,
1217    /// Allocated memory in bytes
1218    pub memory: u64,
1219    /// Allocated GPU devices
1220    pub gpu_devices: Vec<String>,
1221    /// Allocated storage space
1222    pub storage_space: u64,
1223    /// Allocated network bandwidth
1224    pub network_bandwidth: u64,
1225    /// Resource allocation timestamp
1226    pub allocated_at: SystemTime,
1227}
1228
1229/// Task execution state
1230#[derive(Debug, Clone)]
1231pub struct TaskExecutionState {
1232    /// Current execution phase
1233    pub phase: ExecutionPhase,
1234    /// Execution progress percentage
1235    pub progress_percentage: f64,
1236    /// Current operation being performed
1237    pub current_operation: String,
1238    /// Estimated time remaining
1239    pub estimated_time_remaining: Option<Duration>,
1240    /// Execution metrics snapshots
1241    pub metrics_snapshots: Vec<MetricsSnapshot>,
1242}
1243
1244/// Execution phases
1245#[derive(Debug, Clone, PartialEq)]
1246pub enum ExecutionPhase {
1247    /// Initialization
1248    Initialization,
1249    /// Setup
1250    Setup,
1251    /// Execution
1252    Execution,
1253    /// Cleanup
1254    Cleanup,
1255    /// Finalization
1256    Finalization,
1257}
1258
1259/// Task progress information
1260#[derive(Debug, Clone)]
1261pub struct TaskProgress {
1262    /// Total work units
1263    pub total_work: Option<u64>,
1264    /// Completed work units
1265    pub completed_work: u64,
1266    /// Progress percentage
1267    pub percentage: f64,
1268    /// Current milestone
1269    pub current_milestone: String,
1270    /// Estimated completion time
1271    pub estimated_completion: Option<SystemTime>,
1272}
1273
1274/// Communication channels for task coordination
1275#[derive(Debug, Clone)]
1276pub struct CommunicationChannels {
1277    /// Command channel for control messages
1278    pub command_channel: Option<String>,
1279    /// Status update channel
1280    pub status_channel: Option<String>,
1281    /// Progress reporting channel
1282    pub progress_channel: Option<String>,
1283    /// Error reporting channel
1284    pub error_channel: Option<String>,
1285}
1286
1287/// Metrics snapshot for monitoring
1288#[derive(Debug, Clone)]
1289pub struct MetricsSnapshot {
1290    /// Snapshot timestamp
1291    pub timestamp: SystemTime,
1292    /// CPU usage at snapshot time
1293    pub cpu_usage: f64,
1294    /// Memory usage at snapshot time
1295    pub memory_usage: u64,
1296    /// GPU usage at snapshot time
1297    pub gpu_usage: Option<f64>,
1298    /// Custom metrics
1299    pub custom_metrics: HashMap<String, f64>,
1300}
1301
1302/// Task builder for convenient task creation
1303pub struct TaskBuilder {
1304    metadata: TaskMetadata,
1305    requirements: TaskRequirements,
1306    constraints: TaskConstraints,
1307    execution_fn: Option<TaskExecutionFunction>,
1308}
1309
1310impl std::fmt::Debug for TaskBuilder {
1311    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
1312        f.debug_struct("TaskBuilder")
1313            .field("metadata", &self.metadata)
1314            .field("requirements", &self.requirements)
1315            .field("constraints", &self.constraints)
1316            .field(
1317                "execution_fn",
1318                &match &self.execution_fn {
1319                    Some(_) => "<function>",
1320                    None => "<none>",
1321                },
1322            )
1323            .finish()
1324    }
1325}
1326
1327impl Default for TaskBuilder {
1328    fn default() -> Self {
1329        Self::new()
1330    }
1331}
1332
1333impl TaskBuilder {
1334    /// Create a new task builder
1335    #[must_use]
1336    pub fn new() -> Self {
1337        Self {
1338            metadata: TaskMetadata::default(),
1339            requirements: TaskRequirements::default(),
1340            constraints: TaskConstraints::default(),
1341            execution_fn: None,
1342        }
1343    }
1344
1345    /// Set task name
1346    #[must_use]
1347    pub fn name(mut self, name: &str) -> Self {
1348        self.metadata.name = name.to_string();
1349        self
1350    }
1351
1352    /// Set task type
1353    #[must_use]
1354    pub fn task_type(mut self, task_type: TaskType) -> Self {
1355        self.metadata.task_type = task_type;
1356        self
1357    }
1358
1359    /// Set task priority
1360    #[must_use]
1361    pub fn priority(mut self, priority: TaskPriority) -> Self {
1362        self.metadata.priority = priority;
1363        self
1364    }
1365
1366    /// Set task requirements
1367    #[must_use]
1368    pub fn requirements(mut self, requirements: TaskRequirements) -> Self {
1369        self.requirements = requirements;
1370        self
1371    }
1372
1373    /// Set task constraints
1374    #[must_use]
1375    pub fn constraints(mut self, constraints: TaskConstraints) -> Self {
1376        self.constraints = constraints;
1377        self
1378    }
1379
1380    /// Set task metadata
1381    #[must_use]
1382    pub fn metadata(mut self, metadata: TaskMetadata) -> Self {
1383        self.metadata = metadata;
1384        self
1385    }
1386
1387    /// Set execution function
1388    pub fn execution_fn(mut self, func: TaskExecutionFunction) -> Self {
1389        self.execution_fn = Some(func);
1390        self
1391    }
1392
1393    /// Build the task
1394    #[must_use]
1395    pub fn build(self) -> ExecutionTask {
1396        /// ExecutionTask
1397        ExecutionTask {
1398            metadata: self.metadata,
1399            requirements: self.requirements,
1400            constraints: self.constraints,
1401            execution_fn: self.execution_fn,
1402            status: TaskStatus::Created,
1403            context: None,
1404            result: None,
1405        }
1406    }
1407}
1408
1409/// Task validator for ensuring task correctness
1410pub struct TaskValidator;
1411
1412impl TaskValidator {
1413    /// Validate a task for correctness and consistency
1414    pub fn validate(task: &ExecutionTask) -> SklResult<()> {
1415        // Validate metadata
1416        Self::validate_metadata(&task.metadata)?;
1417
1418        // Validate requirements
1419        Self::validate_requirements(&task.requirements)?;
1420
1421        // Validate constraints
1422        Self::validate_constraints(&task.constraints)?;
1423
1424        Ok(())
1425    }
1426
1427    fn validate_metadata(metadata: &TaskMetadata) -> SklResult<()> {
1428        if metadata.name.is_empty() {
1429            return Err(SklearsError::InvalidInput(
1430                "Task name cannot be empty".to_string(),
1431            ));
1432        }
1433
1434        if metadata.id.is_empty() {
1435            return Err(SklearsError::InvalidInput(
1436                "Task ID cannot be empty".to_string(),
1437            ));
1438        }
1439
1440        Ok(())
1441    }
1442
1443    fn validate_requirements(requirements: &TaskRequirements) -> SklResult<()> {
1444        if let Some(cores) = requirements.cpu_cores {
1445            if cores == 0 {
1446                return Err(SklearsError::InvalidInput(
1447                    "CPU cores must be greater than 0".to_string(),
1448                ));
1449            }
1450        }
1451
1452        if let Some(memory) = requirements.memory {
1453            if memory == 0 {
1454                return Err(SklearsError::InvalidInput(
1455                    "Memory must be greater than 0".to_string(),
1456                ));
1457            }
1458        }
1459
1460        Ok(())
1461    }
1462
1463    fn validate_constraints(constraints: &TaskConstraints) -> SklResult<()> {
1464        if let Some(timeout) = constraints.timeout {
1465            if timeout.as_secs() == 0 {
1466                return Err(SklearsError::InvalidInput(
1467                    "Timeout must be greater than 0".to_string(),
1468                ));
1469            }
1470        }
1471
1472        Ok(())
1473    }
1474}
1475
1476// Default implementations
1477impl Default for TaskMetadata {
1478    fn default() -> Self {
1479        Self {
1480            id: uuid::Uuid::new_v4().to_string(),
1481            name: "unnamed_task".to_string(),
1482            task_type: TaskType::Custom("generic".to_string()),
1483            priority: TaskPriority::Normal,
1484            created_at: SystemTime::now(),
1485            owner: "unknown".to_string(),
1486            project: "default".to_string(),
1487            description: String::new(),
1488            tags: Vec::new(),
1489            estimated_duration: None,
1490            estimated_output_size: None,
1491            cost_budget: None,
1492            version: "1.0.0".to_string(),
1493            dependencies: Vec::new(),
1494            custom_fields: HashMap::new(),
1495        }
1496    }
1497}
1498
1499impl Default for TaskConstraints {
1500    fn default() -> Self {
1501        Self {
1502            can_be_preempted: true,
1503            requires_exclusive_access: false,
1504            timeout: None,
1505            retry_policy: None,
1506            affinity: None,
1507            anti_affinity: None,
1508            location_constraint: None,
1509            security_constraints: SecurityConstraints::default(),
1510            checkpoint_interval: None,
1511            cleanup_policy: CleanupPolicy::default(),
1512            scaling_constraints: ScalingConstraints::default(),
1513        }
1514    }
1515}
1516
1517impl Default for SecurityConstraints {
1518    fn default() -> Self {
1519        Self {
1520            security_level: SecurityLevel::Internal,
1521            data_classification: DataClassification::Internal,
1522            compliance_requirements: Vec::new(),
1523            encryption_requirements: EncryptionRequirements::default(),
1524            access_control: AccessControlRequirements::default(),
1525        }
1526    }
1527}
1528
1529impl Default for CleanupPolicy {
1530    fn default() -> Self {
1531        Self {
1532            strategy: CleanupStrategy::Delayed,
1533            delay: Some(Duration::from_secs(300)), // 5 minutes
1534            preserve_resources: Vec::new(),
1535            timeout: Some(Duration::from_secs(600)), // 10 minutes
1536        }
1537    }
1538}
1539
1540impl Default for ScalingConstraints {
1541    fn default() -> Self {
1542        Self {
1543            horizontal_scaling: false,
1544            vertical_scaling: false,
1545            min_instances: Some(1),
1546            max_instances: Some(10),
1547            scaling_triggers: Vec::new(),
1548            cooldown_period: Some(Duration::from_secs(300)), // 5 minutes
1549        }
1550    }
1551}
1552
1553impl ExecutionTask {
1554    /// Create a new task builder
1555    #[must_use]
1556    pub fn builder() -> TaskBuilder {
1557        TaskBuilder::new()
1558    }
1559
1560    /// Create a simple task with basic parameters
1561    pub fn new(name: &str, task_type: TaskType, execution_fn: TaskExecutionFunction) -> Self {
1562        Self::builder()
1563            .name(name)
1564            .task_type(task_type)
1565            .execution_fn(execution_fn)
1566            .build()
1567    }
1568
1569    /// Get task ID
1570    #[must_use]
1571    pub fn id(&self) -> &str {
1572        &self.metadata.id
1573    }
1574
1575    /// Get task name
1576    #[must_use]
1577    pub fn name(&self) -> &str {
1578        &self.metadata.name
1579    }
1580
1581    /// Get task status
1582    #[must_use]
1583    pub fn status(&self) -> &TaskStatus {
1584        &self.status
1585    }
1586
1587    /// Update task status
1588    pub fn set_status(&mut self, status: TaskStatus) {
1589        self.status = status;
1590    }
1591
1592    /// Check if task is complete
1593    #[must_use]
1594    pub fn is_complete(&self) -> bool {
1595        matches!(
1596            self.status,
1597            TaskStatus::Completed | TaskStatus::Failed(_) | TaskStatus::Cancelled
1598        )
1599    }
1600
1601    /// Check if task can be retried
1602    #[must_use]
1603    pub fn can_retry(&self) -> bool {
1604        if let Some(retry_policy) = &self.constraints.retry_policy {
1605            if let TaskStatus::Failed(_) = self.status {
1606                return retry_policy.max_attempts > 0;
1607            }
1608        }
1609        false
1610    }
1611
1612    /// Validate the task
1613    pub fn validate(&self) -> SklResult<()> {
1614        TaskValidator::validate(self)
1615    }
1616}
1617
1618impl fmt::Display for TaskError {
1619    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
1620        match self {
1621            TaskError::ResourceAllocation(msg) => write!(f, "Resource allocation error: {msg}"),
1622            TaskError::DependencyFailure(msg) => write!(f, "Dependency failure: {msg}"),
1623            TaskError::Timeout => write!(f, "Task timeout"),
1624            TaskError::RuntimeError(msg) => write!(f, "Runtime error: {msg}"),
1625            TaskError::ValidationError(msg) => write!(f, "Validation error: {msg}"),
1626            TaskError::InfrastructureError(msg) => write!(f, "Infrastructure error: {msg}"),
1627            TaskError::SecurityViolation(msg) => write!(f, "Security violation: {msg}"),
1628            TaskError::Custom(msg) => write!(f, "Custom error: {msg}"),
1629        }
1630    }
1631}
1632
1633impl std::error::Error for TaskError {}
1634
1635// External crate declarations
1636extern crate uuid;
1637
1638#[allow(non_snake_case)]
1639#[cfg(test)]
1640mod tests {
1641    use super::*;
1642
1643    #[test]
1644    fn test_task_builder() {
1645        let task = ExecutionTask::builder()
1646            .name("test_task")
1647            .task_type(TaskType::Preprocess)
1648            .priority(TaskPriority::High)
1649            .build();
1650
1651        assert_eq!(task.name(), "test_task");
1652        assert_eq!(task.metadata.task_type, TaskType::Preprocess);
1653        assert_eq!(task.metadata.priority, TaskPriority::High);
1654        assert_eq!(task.status, TaskStatus::Created);
1655    }
1656
1657    #[test]
1658    fn test_task_validation() {
1659        let task = ExecutionTask::builder()
1660            .name("valid_task")
1661            .task_type(TaskType::Fit)
1662            .build();
1663
1664        assert!(task.validate().is_ok());
1665    }
1666
1667    #[test]
1668    fn test_task_requirements() {
1669        let requirements = TaskRequirements {
1670            cpu_cores: Some(4),
1671            memory: Some(8 * 1024 * 1024 * 1024), // 8GB
1672            gpu_devices: vec!["cuda:0".to_string()],
1673            ..Default::default()
1674        };
1675
1676        assert_eq!(requirements.cpu_cores, Some(4));
1677        assert_eq!(requirements.memory, Some(8 * 1024 * 1024 * 1024));
1678        assert_eq!(requirements.gpu_devices.len(), 1);
1679    }
1680
1681    #[test]
1682    fn test_task_constraints() {
1683        let constraints = TaskConstraints {
1684            can_be_preempted: false,
1685            requires_exclusive_access: true,
1686            timeout: Some(Duration::from_secs(3600)),
1687            ..Default::default()
1688        };
1689
1690        assert!(!constraints.can_be_preempted);
1691        assert!(constraints.requires_exclusive_access);
1692        assert_eq!(constraints.timeout, Some(Duration::from_secs(3600)));
1693    }
1694
1695    #[test]
1696    fn test_task_priorities() {
1697        assert!(TaskPriority::Critical > TaskPriority::High);
1698        assert!(TaskPriority::High > TaskPriority::Normal);
1699        assert!(TaskPriority::Normal > TaskPriority::Low);
1700        assert!(TaskPriority::Low > TaskPriority::Lowest);
1701    }
1702
1703    #[test]
1704    fn test_task_status_transitions() {
1705        let mut task = ExecutionTask::builder().name("status_test").build();
1706
1707        assert_eq!(task.status(), &TaskStatus::Created);
1708
1709        task.set_status(TaskStatus::Queued);
1710        assert_eq!(task.status(), &TaskStatus::Queued);
1711
1712        task.set_status(TaskStatus::Running);
1713        assert_eq!(task.status(), &TaskStatus::Running);
1714
1715        task.set_status(TaskStatus::Completed);
1716        assert_eq!(task.status(), &TaskStatus::Completed);
1717        assert!(task.is_complete());
1718    }
1719
1720    #[test]
1721    fn test_metadata_default() {
1722        let metadata = TaskMetadata::default();
1723        assert!(!metadata.id.is_empty());
1724        assert_eq!(metadata.name, "unnamed_task");
1725        assert_eq!(metadata.priority, TaskPriority::Normal);
1726        assert_eq!(metadata.owner, "unknown");
1727    }
1728
1729    #[test]
1730    fn test_retry_policy() {
1731        let retry_policy = RetryPolicy {
1732            max_attempts: 3,
1733            backoff_strategy: BackoffStrategy::Exponential {
1734                base: 1000,
1735                max: 30000,
1736            },
1737            retry_conditions: vec![RetryCondition::NetworkFailure, RetryCondition::Timeout],
1738            max_retry_time: Some(Duration::from_secs(300)),
1739        };
1740
1741        assert_eq!(retry_policy.max_attempts, 3);
1742        assert!(matches!(
1743            retry_policy.backoff_strategy,
1744            BackoffStrategy::Exponential { .. }
1745        ));
1746        assert_eq!(retry_policy.retry_conditions.len(), 2);
1747    }
1748
1749    #[test]
1750    fn test_security_constraints() {
1751        let security = SecurityConstraints {
1752            security_level: SecurityLevel::Confidential,
1753            data_classification: DataClassification::Sensitive,
1754            compliance_requirements: vec![ComplianceStandard::GDPR, ComplianceStandard::HIPAA],
1755            ..Default::default()
1756        };
1757
1758        assert_eq!(security.security_level, SecurityLevel::Confidential);
1759        assert_eq!(security.data_classification, DataClassification::Sensitive);
1760        assert_eq!(security.compliance_requirements.len(), 2);
1761    }
1762}