use scirs2_core::ndarray::{Array1, Array2, Array3};
use std::collections::{HashMap, VecDeque};
use super::config::ImagePattern;
use super::knowledge::{MultiModalKnowledgeBase, ProcessingContext};
use super::learning::{
ContinualLearningState, ExplanationTracker, FewShotLearningEntry, NeuralModel,
ProcessingExperience, TransferLearningModel,
};
use super::strategies::ProcessingStrategy;
#[derive(Debug, Clone)]
pub struct AIProcessingState {
pub decision_network: Array3<f64>,
pub experience_buffer: VecDeque<ProcessingExperience>,
pub processing_strategies: HashMap<ImagePattern, ProcessingStrategy>,
pub performancehistory: VecDeque<f64>,
pub knowledge_base: MultiModalKnowledgeBase,
pub currentcontext: ProcessingContext,
pub continual_learningstate: ContinualLearningState,
pub explanation_tracker: ExplanationTracker,
pub transfer_models: Vec<TransferLearningModel>,
pub few_shot_cache: HashMap<String, FewShotLearningEntry>,
pub algorithm_confidence: HashMap<String, f64>,
pub neural_network: NeuralModel,
pub pattern_strategy_mapping: HashMap<String, String>,
pub algorithm_usage_count: HashMap<String, usize>,
pub strategy_performance: HashMap<String, f64>,
pub patternhistory: VecDeque<ImagePattern>,
pub learnedfeatures: HashMap<String, Array1<f64>>,
}
impl AIProcessingState {
pub fn new() -> Self {
Self {
decision_network: Array3::zeros((10, 10, 5)), experience_buffer: VecDeque::new(),
processing_strategies: HashMap::new(),
performancehistory: VecDeque::new(),
knowledge_base: MultiModalKnowledgeBase::new(),
currentcontext: ProcessingContext::default(),
continual_learningstate: ContinualLearningState {
task_knowledge: Vec::new(),
forgetting_prevention: super::learning::ForgettingPreventionState {
ewc_params: Array1::zeros(100),
fisher_information: Array2::zeros((100, 100)),
importance_mask: Array1::from_elem(100, false),
memory_strength: 1.0,
},
meta_learning_params: Array1::zeros(50),
adaptationhistory: Vec::new(),
},
explanation_tracker: ExplanationTracker {
decision_explanations: VecDeque::new(),
feature_importance: HashMap::new(),
justifications: HashMap::new(),
confidence_scores: HashMap::new(),
},
transfer_models: Vec::new(),
few_shot_cache: HashMap::new(),
algorithm_confidence: HashMap::new(),
neural_network: NeuralModel {
weights: Array2::zeros((100, 50)),
biases: Array1::zeros(50),
architecture: "feedforward".to_string(),
},
pattern_strategy_mapping: HashMap::new(),
algorithm_usage_count: HashMap::new(),
strategy_performance: HashMap::new(),
patternhistory: VecDeque::new(),
learnedfeatures: HashMap::new(),
}
}
pub fn add_experience(&mut self, experience: ProcessingExperience) {
self.experience_buffer.push_back(experience);
if self.experience_buffer.len() > 10000 {
self.experience_buffer.pop_front();
}
}
pub fn get_experience_batch(&self, batch_size: usize) -> Vec<ProcessingExperience> {
if self.experience_buffer.is_empty() {
return Vec::new();
}
let buffer_size = self.experience_buffer.len();
let actual_batch_size = batch_size.min(buffer_size);
let mut batch = Vec::new();
let step = buffer_size / actual_batch_size;
for i in 0..actual_batch_size {
let index = (i * step) % buffer_size;
if let Some(experience) = self.experience_buffer.get(index) {
batch.push(experience.clone());
}
}
batch
}
pub fn update_strategy(&mut self, pattern: ImagePattern, strategy: ProcessingStrategy) {
self.processing_strategies.insert(pattern, strategy);
}
pub fn get_best_strategy(&self, pattern: &ImagePattern) -> Option<&ProcessingStrategy> {
self.processing_strategies.get(pattern)
}
pub fn add_performance_record(&mut self, performance: f64) {
self.performancehistory.push_back(performance);
if self.performancehistory.len() > 1000 {
self.performancehistory.pop_front();
}
}
pub fn get_average_performance(&self, recent_count: usize) -> f64 {
if self.performancehistory.is_empty() {
return 0.0;
}
let count = recent_count.min(self.performancehistory.len());
let start_index = self.performancehistory.len() - count;
let sum: f64 = self.performancehistory.iter().skip(start_index).sum();
sum / count as f64
}
pub fn update_algorithm_confidence(&mut self, algorithm: &str, confidence: f64) {
self.algorithm_confidence
.insert(algorithm.to_string(), confidence);
}
pub fn get_algorithm_confidence(&self, algorithm: &str) -> f64 {
self.algorithm_confidence
.get(algorithm)
.copied()
.unwrap_or(0.5)
}
pub fn add_pattern_to_history(&mut self, pattern: ImagePattern) {
self.patternhistory.push_back(pattern);
if self.patternhistory.len() > 500 {
self.patternhistory.pop_front();
}
}
pub fn has_seen_pattern_recently(&self, pattern: &ImagePattern, within_last: usize) -> bool {
let check_count = within_last.min(self.patternhistory.len());
let start_index = self.patternhistory.len() - check_count;
self.patternhistory
.iter()
.skip(start_index)
.any(|p| p == pattern)
}
pub fn get_state_summary(&self) -> StateSummary {
StateSummary {
experience_count: self.experience_buffer.len(),
strategy_count: self.processing_strategies.len(),
average_performance: self.get_average_performance(100),
patterns_learned: self.patternhistory.len(),
algorithms_used: self.algorithm_usage_count.len(),
}
}
}
#[derive(Debug, Clone)]
pub struct StateSummary {
pub experience_count: usize,
pub strategy_count: usize,
pub average_performance: f64,
pub patterns_learned: usize,
pub algorithms_used: usize,
}