use scirs2_core::ndarray::Array1;
use std::collections::HashMap;
use super::config::{AlgorithmType, ImagePattern};
use super::learning::PerformanceMetrics;
#[derive(Debug, Clone)]
pub struct ProcessingStrategy {
pub algorithm_sequence: Vec<AlgorithmStep>,
pub parameters: HashMap<String, f64>,
pub expected_performance: PerformanceMetrics,
pub confidence: f64,
pub usage_count: usize,
pub success_rate: f64,
}
#[derive(Debug, Clone)]
pub struct AlgorithmStep {
pub algorithm: AlgorithmType,
pub parameters: HashMap<String, f64>,
pub quality_contribution: f64,
pub computational_cost: f64,
}
#[derive(Debug, Clone)]
pub enum ProcessingAlgorithm {
AdaptiveGaussianFilter,
IntelligentEdgeDetection,
AIEnhancedMedianFilter,
SmartBilateralFilter,
ContextAwareNoiseReduction,
AdaptiveMorphology,
IntelligentSegmentation,
AIFeatureExtraction,
}
#[derive(Debug, Clone)]
pub struct AdaptationStrategy {
pub name: String,
pub parameters: Array1<f64>,
pub speed: f64,
pub effectiveness: f64,
}
#[derive(Debug, Clone)]
pub struct PerformanceRecord {
pub timestamp: u64,
pub input_characteristics: Array1<f64>,
pub strategy_used: ProcessingStrategy,
pub achievedmetrics: PerformanceMetrics,
pub context: String,
}
impl ProcessingStrategy {
pub fn new() -> Self {
Self {
algorithm_sequence: Vec::new(),
parameters: HashMap::new(),
expected_performance: PerformanceMetrics {
speed: 0.0,
quality: 0.0,
memory_usage: 0.0,
energy_consumption: 0.0,
user_satisfaction: None,
},
confidence: 0.0,
usage_count: 0,
success_rate: 0.0,
}
}
pub fn add_step(&mut self, step: AlgorithmStep) {
self.algorithm_sequence.push(step);
}
pub fn update_performance(&mut self, metrics: &PerformanceMetrics, success: bool) {
self.usage_count += 1;
if success {
let total_attempts = self.usage_count as f64;
let previous_successes = (total_attempts - 1.0) * self.success_rate;
self.success_rate = (previous_successes + 1.0) / total_attempts;
let alpha = 0.1; self.expected_performance.speed =
(1.0 - alpha) * self.expected_performance.speed + alpha * metrics.speed;
self.expected_performance.quality =
(1.0 - alpha) * self.expected_performance.quality + alpha * metrics.quality;
self.expected_performance.memory_usage = (1.0 - alpha)
* self.expected_performance.memory_usage
+ alpha * metrics.memory_usage;
}
}
pub fn calculate_score(&self, pattern: &ImagePattern) -> f64 {
let performance_score = self.expected_performance.quality;
let confidence_score = self.confidence;
let usage_score = (self.usage_count as f64).ln().max(0.0) / 10.0; let success_score = self.success_rate;
0.4 * performance_score + 0.3 * confidence_score + 0.1 * usage_score + 0.2 * success_score
}
}
impl AlgorithmStep {
pub fn new(algorithm: AlgorithmType) -> Self {
Self {
algorithm,
parameters: HashMap::new(),
quality_contribution: 0.0,
computational_cost: 1.0,
}
}
pub fn set_parameter(&mut self, name: &str, value: f64) {
self.parameters.insert(name.to_string(), value);
}
pub fn estimated_time(&self) -> f64 {
let base_time = match self.algorithm {
AlgorithmType::GaussianFilter => 0.1,
AlgorithmType::MedianFilter => 0.3,
AlgorithmType::BilateralFilter => 0.5,
AlgorithmType::EdgeDetection => 0.2,
AlgorithmType::MorphologyOperation => 0.25,
AlgorithmType::QuantumProcessing => 1.0,
AlgorithmType::NeuromorphicProcessing => 0.8,
AlgorithmType::ConsciousnessSimulation => 1.5,
AlgorithmType::AdvancedFusion => 1.2,
AlgorithmType::CustomAI => 0.7,
};
base_time * self.computational_cost
}
}