sklears_compose/cv_pipelines/
mod.rs

1//! Computer Vision Pipelines and Image Processing Workflows - Modular Architecture
2//!
3//! This module provides comprehensive computer vision processing capabilities organized
4//! into focused, maintainable submodules including image preprocessing, object detection,
5//! classification, segmentation, multi-modal vision processing, real-time video processing,
6//! and 3D vision workflows.
7//!
8//! # Architecture
9//!
10//! The computer vision pipeline system is organized into eight focused modules:
11//!
12//! - [`types_config`] - Shared types, enums, and basic configuration structures
13//! - [`image_specification`] - Image specifications, validation, and data management
14//! - [`processing_configuration`] - Processing modes, quality settings, and optimization
15//! - [`multimodal_processing`] - Multi-modal fusion strategies and cross-modal learning
16//! - [`realtime_streaming`] - Real-time processing, streaming, and adaptive quality
17//! - [`model_management`] - Model specifications, metadata, and performance characteristics
18//! - [`metrics_statistics`] - Comprehensive metrics collection and statistical analysis
19//! - [`core_pipeline`] - Main `CVPipeline` implementation and orchestration
20//!
21//! # Quick Start
22//!
23//! ```rust
24//! use sklears_compose::cv_pipelines::{CVConfig, CVPipeline, ImageSpecification};
25//!
26//! let config = CVConfig::real_time("Object Detection Pipeline");
27//! let _pipeline = CVPipeline::new(config);
28//! let _input_spec = ImageSpecification::object_detection((640, 480));
29//! ```
30//!
31//! # Features
32//!
33//! ## Core Pipeline Capabilities
34//! - Flexible pipeline configuration and orchestration
35//! - Support for batch, real-time, and streaming processing modes
36//! - Comprehensive error handling and recovery strategies
37//! - Advanced metrics collection and performance monitoring
38//!
39//! ## Image Processing
40//! - Multi-format image support (JPEG, PNG, WebP, RAW, HDR)
41//! - Advanced preprocessing with quality enhancement
42//! - Color space conversions and normalization
43//! - Input validation and specification management
44//!
45//! ## Multi-Modal Processing
46//! - Vision-audio-text fusion strategies
47//! - Cross-modal learning and alignment
48//! - Temporal synchronization for multi-sensor data
49//! - Advanced fusion algorithms (early, late, hybrid, attention-based)
50//!
51//! ## Real-Time Processing
52//! - Low-latency streaming with adaptive quality
53//! - Network optimization and error resilience
54//! - Hardware acceleration support (GPU, SIMD)
55//! - Dynamic quality adaptation based on system performance
56//!
57//! ## Model Management
58//! - Flexible model specification and metadata
59//! - Performance profiling and optimization
60//! - Hardware requirement management
61//! - Multi-model ensemble support
62//!
63//! ## Performance Optimization
64//! - SIMD-accelerated operations where applicable
65//! - Memory-efficient processing with adaptive chunking
66//! - Parallel processing with load balancing
67//! - Resource limit enforcement and monitoring
68
69pub mod core_pipeline;
70pub mod image_specification;
71pub mod metrics_statistics;
72pub mod model_management;
73pub mod multimodal_processing;
74pub mod processing_configuration;
75pub mod realtime_streaming;
76pub mod types_config;
77
78use std::time::Duration;
79
80// Re-export all shared types and configurations
81pub use types_config::{
82    AdaptationAlgorithm, AdaptationMetric, BoundingBox, BufferOverflowStrategy, CVPrediction,
83    CacheEvictionPolicy, CameraInfo, CameraIntrinsics, CameraSettings, ColorSpace, ComputeDevice,
84    ConfidenceScores, CrossModalStrategy, Detection, DetectionMetadata, ExifData, ExtractorConfig,
85    ExtractorType, FeatureMetadata, FeatureQuality, FeatureStatistics, FeatureVector,
86    FusionStrategy, GPSInfo, ImageDataType, ImageFormat, ImageMetadata, InterpolationMethod,
87    LensInfo, LoadBalancingAlgorithm, MemoryOptimizationLevel, Modality, ModelConfig, ModelType,
88    ObjectDetectionResult, OutputType, ParallelStrategy, PredictionMetadata, PredictionResult,
89    ProcessingComplexity, ProcessingMode, ProcessorType, RateControlMethod, RecoveryStrategy,
90    StreamingProtocol, SyncMethod, TransformParameter, VideoCodec,
91};
92
93// Re-export image specification types
94pub use image_specification::{
95    ImageData, ImageSpecification, ImageValidationSpec, NormalizationSpec, QualityThresholds,
96    ValidationError,
97};
98
99// Re-export processing configuration types
100pub use processing_configuration::{
101    CachingStrategy, ColorCorrectionConfig, CompressionAlgorithm, CompressionConfig,
102    DenoisingAlgorithm, ErrorHandlingConfig, NoiseReductionConfig, ParallelProcessingConfig,
103    PerformanceConfig, QualityAssuranceConfig, QualitySettings, ResourceLimits, SharpeningConfig,
104    WhiteBalanceConfig, WhiteBalanceMode, WorkStealingConfig,
105};
106
107// Re-export multi-modal processing types
108pub use multimodal_processing::{
109    AlignmentLearningConfig, ContrastiveLearningConfig, CrossModalLearningConfig,
110    DistillationConfig, ModalityData, MultiModalConfig, MultiModalError, MultiModalSample,
111    SyncStatus, SynchronizationRequirements, TemporalAlignmentConfig,
112};
113
114// Re-export real-time streaming types
115pub use realtime_streaming::{
116    AdaptationParameters, AdaptiveQualityConfig, BufferManagementConfig, BufferMonitoringConfig,
117    CircuitBreakerConfig, CongestionControlAlgorithm, EncodingConfig, EncodingPreset,
118    ErrorResilienceConfig, NetworkOptimizationConfig, PIDParameters, PerformanceMetric,
119    PerformanceMonitoringConfig, PerformanceThresholds, QualityConstraints, QualityLevel,
120    RealTimeError, RealTimeErrorHandling, RealTimeProcessingConfig, ResourceConstraints,
121    ResourceRequirements, StreamingConfig,
122};
123
124// Re-export model management types
125pub use model_management::{
126    AccuracyMetrics, CoolingRequirements, DeploymentRequirements, GpuRequirements,
127    HardwareRequirements, ModelDataType, ModelError, ModelInputSpec, ModelMetadata,
128    ModelOutputSpec, ModelPerformance, ModelResourceUtilization,
129    NormalizationSpec as ModelNormalizationSpec, NormalizationType, OutputInterpretation,
130    ProcessorConfig, QualityEnhancementConfig, SmoothingAlgorithm, SmoothingConfig, TensorFormat,
131    ThermalProfile, ThroughputMetrics,
132};
133
134// Re-export metrics and statistics types
135pub use metrics_statistics::{
136    CVMetrics, DiskIOMetrics, DiskUsage, ErrorPattern, ErrorRecord, ErrorTracking, ErrorTrends,
137    ErrorType, HistoricalMetrics, LatencyMetrics, LatencyPercentiles, MetricsSummary,
138    NetworkIOMetrics, PerformanceMetrics, ProcessResourceUsage, ProcessingStatistics,
139    QualityMetrics, ResourceUtilization, ThermalMetrics, TrendDirection,
140};
141
142// Re-export core pipeline types and traits
143pub use core_pipeline::{
144    CVConfig, CVModel, CVPipeline, CVPipelineState, ContextErrorRecord, FeatureExtractor,
145    ImageTransform, PipelineContext, PipelineMetadata, PipelineStatus, PostProcessor, Prediction,
146    PredictionData, PredictionType, ProcessedResult, ProcessingMetadata, QualityImprovement,
147    ResourceStatus,
148};
149
150/// Result type for CV pipeline operations
151pub type CVResult<T> = Result<T, CVError>;
152
153/// Comprehensive error types for computer vision operations
154#[derive(Debug, Clone, PartialEq)]
155pub enum CVError {
156    /// Configuration error
157    Configuration(String),
158    /// Image validation error
159    Validation(String),
160    /// Processing error
161    Processing(String),
162    /// Model error
163    Model(String),
164    /// Real-time processing error
165    RealTime(String),
166    /// Multi-modal processing error
167    MultiModal(String),
168    /// Performance/resource error
169    Performance(String),
170    /// Network/streaming error
171    Network(String),
172    /// Serialization/deserialization error
173    Serialization(String),
174    /// Generic internal error
175    Internal(String),
176}
177
178impl std::fmt::Display for CVError {
179    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
180        match self {
181            Self::Configuration(msg) => write!(f, "Configuration error: {msg}"),
182            Self::Validation(msg) => write!(f, "Validation error: {msg}"),
183            Self::Processing(msg) => write!(f, "Processing error: {msg}"),
184            Self::Model(msg) => write!(f, "Model error: {msg}"),
185            Self::RealTime(msg) => write!(f, "Real-time error: {msg}"),
186            Self::MultiModal(msg) => write!(f, "Multi-modal error: {msg}"),
187            Self::Performance(msg) => write!(f, "Performance error: {msg}"),
188            Self::Network(msg) => write!(f, "Network error: {msg}"),
189            Self::Serialization(msg) => write!(f, "Serialization error: {msg}"),
190            Self::Internal(msg) => write!(f, "Internal error: {msg}"),
191        }
192    }
193}
194
195impl std::error::Error for CVError {}
196
197/// Convenience functions for creating common pipeline configurations
198pub mod presets {
199    use super::{
200        CVConfig, ImageSpecification, MemoryOptimizationLevel, MultiModalConfig, QualitySettings,
201        RealTimeProcessingConfig,
202    };
203    use std::time::Duration;
204
205    /// Create a real-time object detection pipeline configuration
206    #[must_use]
207    pub fn object_detection_realtime() -> CVConfig {
208        let mut config = CVConfig::real_time("Real-time Object Detection");
209        config.input_spec = ImageSpecification::object_detection((640, 480));
210        config.quality_settings = QualitySettings::performance_optimized();
211        config.realtime.target_fps = 30.0;
212        config.realtime.max_latency = Duration::from_millis(33); // ~30fps
213        config
214    }
215
216    /// Create a high-quality batch image classification pipeline
217    #[must_use]
218    pub fn image_classification_batch() -> CVConfig {
219        let mut config = CVConfig::high_quality_batch("Batch Image Classification");
220        config.input_spec = ImageSpecification::classification((224, 224));
221        config.quality_settings = QualitySettings::high_quality();
222        config
223    }
224
225    /// Create a streaming video analysis pipeline
226    #[must_use]
227    pub fn video_analysis_streaming() -> CVConfig {
228        let mut config = CVConfig::streaming("Video Analysis Stream");
229        config.input_spec = ImageSpecification::rgb(1920, 1080);
230        config.quality_settings = QualitySettings::balanced();
231        config.realtime.streaming.enabled = true;
232        config.realtime.adaptive_quality.enabled = true;
233        config
234    }
235
236    /// Create a multi-modal vision-audio pipeline
237    #[must_use]
238    pub fn multimodal_vision_audio() -> CVConfig {
239        let mut config = CVConfig::real_time("Vision-Audio Fusion");
240        config.multimodal = MultiModalConfig::vision_audio();
241        config.quality_settings = QualitySettings::balanced();
242        config
243    }
244
245    /// Create a mobile-optimized pipeline
246    #[must_use]
247    pub fn mobile_optimized() -> CVConfig {
248        let mut config = CVConfig::real_time("Mobile CV Pipeline");
249        config.input_spec = ImageSpecification::rgb(320, 240);
250        config.quality_settings = QualitySettings::performance_optimized();
251        config.performance.memory_optimization = MemoryOptimizationLevel::High;
252        config.realtime = RealTimeProcessingConfig::mobile_optimized();
253        config
254    }
255
256    /// Create a high-quality segmentation pipeline
257    #[must_use]
258    pub fn semantic_segmentation() -> CVConfig {
259        let mut config = CVConfig::high_quality_batch("Semantic Segmentation");
260        config.input_spec = ImageSpecification::segmentation((512, 512));
261        config.quality_settings = QualitySettings::high_quality();
262        config
263    }
264}
265
266/// Utility functions for pipeline operations
267pub mod utils {
268    use super::{
269        CVConfig, CVError, CVPipeline, CVResult, ColorSpace, ConfigurationComparison, ImageData,
270        ImageDataType, MemoryOptimizationLevel, PerformanceConstraints, PerformanceReport,
271        ProcessingComplexity, ProcessingMode, QualityReport, QualitySettings, ResourceUsageReport,
272    };
273    use std::time::Duration;
274
275    /// Validate a complete pipeline configuration
276    pub fn validate_pipeline_config(config: &CVConfig) -> CVResult<()> {
277        // Validate input specification
278        if let Err(e) = config.input_spec.validate(&create_test_image()) {
279            return Err(CVError::Validation(format!(
280                "Input spec validation failed: {e}"
281            )));
282        }
283
284        // Validate processing mode compatibility
285        match config.processing_mode {
286            ProcessingMode::RealTime => {
287                if !config.realtime.enabled {
288                    return Err(CVError::Configuration(
289                        "Real-time mode requires real-time config to be enabled".to_string(),
290                    ));
291                }
292            }
293            ProcessingMode::Streaming => {
294                if !config.realtime.streaming.enabled {
295                    return Err(CVError::Configuration(
296                        "Streaming mode requires streaming config to be enabled".to_string(),
297                    ));
298                }
299            }
300            _ => {}
301        }
302
303        // Validate multi-modal configuration if enabled
304        if config.multimodal.enabled {
305            if let Err(e) = config.multimodal.validate() {
306                return Err(CVError::MultiModal(format!(
307                    "Multi-modal validation failed: {e}"
308                )));
309            }
310        }
311
312        Ok(())
313    }
314
315    /// Create a test image for validation purposes
316    fn create_test_image() -> ImageData {
317        use scirs2_core::ndarray::Array3;
318
319        ImageData::new(
320            224,
321            224,
322            3,
323            ImageDataType::UInt8,
324            ColorSpace::RGB,
325            Array3::zeros((224, 224, 3)),
326        )
327    }
328
329    /// Calculate memory requirements for a pipeline configuration
330    #[must_use]
331    pub fn calculate_memory_requirements(config: &CVConfig, batch_size: usize) -> usize {
332        let input_memory = config.input_spec.memory_requirements() * batch_size;
333        let processing_overhead = input_memory / 2; // Estimate 50% overhead
334        let model_memory = 100 * 1024 * 1024; // Estimate 100MB for models
335
336        input_memory + processing_overhead + model_memory
337    }
338
339    /// Estimate processing time for a given configuration
340    #[must_use]
341    pub fn estimate_processing_time(
342        config: &CVConfig,
343        image_count: usize,
344        model_count: usize,
345    ) -> Duration {
346        let base_time_per_image = match config.quality_settings.quality_level {
347            ProcessingComplexity::Low => Duration::from_millis(50),
348            ProcessingComplexity::Medium => Duration::from_millis(100),
349            ProcessingComplexity::High => Duration::from_millis(200),
350            ProcessingComplexity::Ultra => Duration::from_millis(500),
351        };
352
353        let model_overhead = Duration::from_millis(model_count as u64 * 50);
354        let total_per_image = base_time_per_image + model_overhead;
355
356        total_per_image * image_count as u32
357    }
358
359    /// Generate pipeline performance report
360    #[must_use]
361    pub fn generate_performance_report(pipeline: &CVPipeline) -> PerformanceReport {
362        let status = pipeline.get_status();
363        let summary = pipeline.metrics.generate_summary();
364
365        PerformanceReport {
366            pipeline_name: pipeline.config.name.clone(),
367            current_state: status.state,
368            total_processed: status.processing_count,
369            error_rate: summary.error_rate,
370            average_latency: summary.average_processing_time,
371            throughput: summary.current_throughput,
372            resource_usage: ResourceUsageReport {
373                cpu_utilization: summary.cpu_utilization,
374                memory_utilization: summary.memory_utilization,
375                gpu_utilization: summary.gpu_utilization,
376            },
377            quality_metrics: QualityReport {
378                average_confidence: summary.average_quality,
379                error_count: status.error_count,
380            },
381        }
382    }
383
384    /// Optimize pipeline configuration for specific constraints
385    #[must_use]
386    pub fn optimize_for_constraints(
387        mut config: CVConfig,
388        constraints: PerformanceConstraints,
389    ) -> CVConfig {
390        // Optimize for latency constraints
391        if let Some(max_latency) = constraints.max_latency {
392            if max_latency < Duration::from_millis(100) {
393                config.quality_settings = QualitySettings::performance_optimized();
394                config.processing_mode = ProcessingMode::RealTime;
395                config.realtime.target_fps = 60.0;
396            }
397        }
398
399        // Optimize for memory constraints
400        if let Some(max_memory) = constraints.max_memory_mb {
401            if max_memory < 512 {
402                config.performance.memory_optimization = MemoryOptimizationLevel::High;
403                config.input_spec.dimensions = Some((320, 240));
404            }
405        }
406
407        // Optimize for quality constraints
408        if let Some(min_quality) = constraints.min_quality_score {
409            if min_quality > 0.8 {
410                config.quality_settings = QualitySettings::high_quality();
411                config.processing_mode = ProcessingMode::Batch;
412            }
413        }
414
415        config
416    }
417
418    /// Compare two pipeline configurations
419    #[must_use]
420    pub fn compare_configurations(
421        config1: &CVConfig,
422        config2: &CVConfig,
423    ) -> ConfigurationComparison {
424        ConfigurationComparison {
425            processing_mode_diff: config1.processing_mode != config2.processing_mode,
426            quality_level_diff: config1.quality_settings.quality_level
427                != config2.quality_settings.quality_level,
428            memory_optimization_diff: config1.performance.memory_optimization
429                != config2.performance.memory_optimization,
430            input_spec_diff: config1.input_spec.dimensions != config2.input_spec.dimensions,
431            multimodal_diff: config1.multimodal.enabled != config2.multimodal.enabled,
432            realtime_diff: config1.realtime.enabled != config2.realtime.enabled,
433        }
434    }
435}
436
437/// Performance report for pipeline analysis
438#[derive(Debug, Clone)]
439pub struct PerformanceReport {
440    /// Pipeline name
441    pub pipeline_name: String,
442    /// Current pipeline state
443    pub current_state: CVPipelineState,
444    /// Total images processed
445    pub total_processed: u64,
446    /// Error rate
447    pub error_rate: f64,
448    /// Average processing latency
449    pub average_latency: Duration,
450    /// Processing throughput
451    pub throughput: f64,
452    /// Resource usage report
453    pub resource_usage: ResourceUsageReport,
454    /// Quality metrics report
455    pub quality_metrics: QualityReport,
456}
457
458/// Resource usage report
459#[derive(Debug, Clone)]
460pub struct ResourceUsageReport {
461    /// CPU utilization percentage
462    pub cpu_utilization: f64,
463    /// Memory utilization in MB
464    pub memory_utilization: f64,
465    /// GPU utilization percentage (if applicable)
466    pub gpu_utilization: Option<f64>,
467}
468
469/// Quality metrics report
470#[derive(Debug, Clone)]
471pub struct QualityReport {
472    /// Average confidence score
473    pub average_confidence: f64,
474    /// Total error count
475    pub error_count: u64,
476}
477
478/// Performance constraints for optimization
479#[derive(Debug, Clone)]
480pub struct PerformanceConstraints {
481    /// Maximum acceptable latency
482    pub max_latency: Option<Duration>,
483    /// Maximum memory usage in MB
484    pub max_memory_mb: Option<usize>,
485    /// Minimum quality score
486    pub min_quality_score: Option<f64>,
487    /// Maximum CPU usage percentage
488    pub max_cpu_usage: Option<f64>,
489}
490
491/// Configuration comparison result
492#[derive(Debug, Clone)]
493pub struct ConfigurationComparison {
494    /// Processing mode differs
495    pub processing_mode_diff: bool,
496    /// Quality level differs
497    pub quality_level_diff: bool,
498    /// Memory optimization differs
499    pub memory_optimization_diff: bool,
500    /// Input specification differs
501    pub input_spec_diff: bool,
502    /// Multi-modal configuration differs
503    pub multimodal_diff: bool,
504    /// Real-time configuration differs
505    pub realtime_diff: bool,
506}
507
508/// SIMD operations module for high-performance computer vision
509pub mod simd_cv {
510    //! SIMD-accelerated computer vision operations
511    //!
512    //! This module provides SIMD-optimized operations for common computer vision tasks.
513    //! Note: SIMD functionality requires specific CPU features and may fall back to
514    //! scalar implementations on unsupported platforms.
515
516    use scirs2_core::ndarray::{Array1, Array2, Array3};
517
518    /// SIMD-accelerated image convolution
519    pub fn simd_convolution(
520        image: &Array3<f32>,
521        kernel: &Array2<f32>,
522    ) -> Result<Array3<f32>, String> {
523        // Placeholder for SIMD convolution implementation
524        // In a real implementation, this would use SIMD instructions
525        let (height, width, channels) = image.dim();
526        let output = Array3::zeros((height, width, channels));
527        Ok(output)
528    }
529
530    /// SIMD-accelerated image resizing
531    pub fn simd_resize(
532        image: &Array3<f32>,
533        new_height: usize,
534        new_width: usize,
535    ) -> Result<Array3<f32>, String> {
536        // Placeholder for SIMD resize implementation
537        let channels = image.dim().2;
538        let output = Array3::zeros((new_height, new_width, channels));
539        Ok(output)
540    }
541
542    /// SIMD-accelerated color space conversion
543    pub fn simd_rgb_to_hsv(rgb: &Array3<f32>) -> Result<Array3<f32>, String> {
544        // Placeholder for SIMD color conversion implementation
545        let output = Array3::zeros(rgb.dim());
546        Ok(output)
547    }
548
549    /// SIMD-accelerated normalization
550    pub fn simd_normalize(
551        image: &mut Array3<f32>,
552        mean: &Array1<f32>,
553        std: &Array1<f32>,
554    ) -> Result<(), String> {
555        // Placeholder for SIMD normalization implementation
556        Ok(())
557    }
558
559    /// Check if SIMD operations are available on current platform
560    #[must_use]
561    pub fn simd_available() -> bool {
562        // In a real implementation, this would check CPU features
563        cfg!(target_feature = "avx2") || cfg!(target_feature = "neon")
564    }
565
566    /// Get SIMD capabilities description
567    #[must_use]
568    pub fn simd_capabilities() -> Vec<String> {
569        let mut capabilities = Vec::new();
570
571        #[cfg(target_feature = "sse")]
572        capabilities.push("SSE".to_string());
573
574        #[cfg(target_feature = "sse2")]
575        capabilities.push("SSE2".to_string());
576
577        #[cfg(target_feature = "avx")]
578        capabilities.push("AVX".to_string());
579
580        #[cfg(target_feature = "avx2")]
581        capabilities.push("AVX2".to_string());
582
583        #[cfg(target_feature = "neon")]
584        capabilities.push("NEON".to_string());
585
586        if capabilities.is_empty() {
587            capabilities.push("Scalar (no SIMD)".to_string());
588        }
589
590        capabilities
591    }
592}
593
594#[allow(non_snake_case)]
595#[cfg(test)]
596mod tests {
597    use super::*;
598
599    #[test]
600    fn test_cv_error_display() {
601        let error = CVError::Configuration("Test configuration error".to_string());
602        assert_eq!(
603            error.to_string(),
604            "Configuration error: Test configuration error"
605        );
606
607        let error = CVError::Processing("Processing failed".to_string());
608        assert_eq!(error.to_string(), "Processing error: Processing failed");
609    }
610
611    #[test]
612    fn test_preset_configurations() {
613        let realtime_config = presets::object_detection_realtime();
614        assert_eq!(realtime_config.processing_mode, ProcessingMode::RealTime);
615        assert!(realtime_config.realtime.enabled);
616
617        let batch_config = presets::image_classification_batch();
618        assert_eq!(batch_config.processing_mode, ProcessingMode::Batch);
619
620        let mobile_config = presets::mobile_optimized();
621        assert_eq!(
622            mobile_config.performance.memory_optimization,
623            MemoryOptimizationLevel::High
624        );
625    }
626
627    #[test]
628    fn test_utils_validation() {
629        let config = presets::object_detection_realtime();
630        // Note: This test would need actual implementation details to work properly
631        // For now, we're just testing that the function can be called
632        let _ = utils::validate_pipeline_config(&config);
633    }
634
635    #[test]
636    fn test_memory_calculation() {
637        let config = presets::mobile_optimized();
638        let memory = utils::calculate_memory_requirements(&config, 1);
639        assert!(memory > 0);
640    }
641
642    #[test]
643    fn test_time_estimation() {
644        let config = presets::image_classification_batch();
645        let time = utils::estimate_processing_time(&config, 10, 1);
646        assert!(time > Duration::from_millis(0));
647    }
648
649    #[test]
650    fn test_configuration_comparison() {
651        let config1 = presets::object_detection_realtime();
652        let config2 = presets::image_classification_batch();
653
654        let comparison = utils::compare_configurations(&config1, &config2);
655        assert!(comparison.processing_mode_diff);
656    }
657
658    #[test]
659    fn test_simd_capabilities() {
660        let capabilities = simd_cv::simd_capabilities();
661        assert!(!capabilities.is_empty());
662    }
663
664    #[test]
665    fn test_optimization_constraints() {
666        let config = CVConfig::default();
667        let constraints = PerformanceConstraints {
668            max_latency: Some(Duration::from_millis(50)),
669            max_memory_mb: Some(256),
670            min_quality_score: Some(0.7),
671            max_cpu_usage: Some(60.0),
672        };
673
674        let optimized = utils::optimize_for_constraints(config, constraints);
675        assert_eq!(optimized.processing_mode, ProcessingMode::RealTime);
676    }
677}