scirs2_ndimage/ai_driven_adaptive_processing/
knowledge.rs1use scirs2_core::ndarray::{Array1, Array2};
7use std::collections::HashMap;
8
9use super::config::{AlgorithmType, PatternType};
10use super::learning::PredictionModel;
11
12#[derive(Debug, Clone)]
14pub struct MultiModalKnowledgeBase {
15 pub visual_patterns: HashMap<String, VisualKnowledge>,
17 pub temporal_patterns: HashMap<String, TemporalKnowledge>,
19 pub contextual_knowledge: HashMap<String, ContextualKnowledge>,
21 pub cross_modal_associations: Vec<CrossModalAssociation>,
23}
24
25#[derive(Debug, Clone)]
27pub struct VisualKnowledge {
28 pub features: Array1<f64>,
30 pub optimal_methods: Vec<AlgorithmType>,
32 pub expected_outcomes: Array1<f64>,
34 pub confidence: f64,
36}
37
38#[derive(Debug, Clone)]
40pub struct TemporalKnowledge {
41 pub patterns: Array2<f64>,
43 pub prediction_models: Vec<PredictionModel>,
45 pub dependencies: Vec<TemporalDependency>,
47}
48
49#[derive(Debug, Clone)]
51pub struct ContextualKnowledge {
52 pub contextfeatures: Array1<f64>,
54 pub preferences: HashMap<String, f64>,
56 pub adaptation_strategies: Vec<super::strategies::AdaptationStrategy>,
58}
59
60#[derive(Debug, Clone)]
62pub struct CrossModalAssociation {
63 pub source_modality: String,
65 pub target_modality: String,
67 pub strength: f64,
69 pub transfer_function: Array2<f64>,
71}
72
73#[derive(Debug, Clone)]
75pub struct TemporalDependency {
76 pub source_step: usize,
78 pub target_step: usize,
80 pub strength: f64,
82 pub dependency_type: String,
84}
85
86#[derive(Debug, Clone)]
88pub struct ProcessingContext {
89 pub image_type: PatternType,
91 pub user_preferences: HashMap<String, f64>,
93 pub available_resources: ResourceAvailability,
95 pub time_constraints: Option<f64>,
97 pub quality_requirements: Option<f64>,
99}
100
101#[derive(Debug, Clone)]
103pub struct ResourceAvailability {
104 pub cpu_cores: usize,
106 pub memory_mb: f64,
108 pub gpu_available: bool,
110 pub quantum_available: bool,
112}
113
114impl MultiModalKnowledgeBase {
115 pub fn new() -> Self {
117 Self {
118 visual_patterns: HashMap::new(),
119 temporal_patterns: HashMap::new(),
120 contextual_knowledge: HashMap::new(),
121 cross_modal_associations: Vec::new(),
122 }
123 }
124
125 pub fn add_visual_knowledge(&mut self, key: String, knowledge: VisualKnowledge) {
127 self.visual_patterns.insert(key, knowledge);
128 }
129
130 pub fn get_visual_knowledge(&self, key: &str) -> Option<&VisualKnowledge> {
132 self.visual_patterns.get(key)
133 }
134
135 pub fn add_cross_modal_association(&mut self, association: CrossModalAssociation) {
137 self.cross_modal_associations.push(association);
138 }
139
140 pub fn find_relevant_knowledge(&self, pattern_features: &Array1<f64>) -> Vec<String> {
142 let mut relevant_keys = Vec::new();
143
144 for (key, knowledge) in &self.visual_patterns {
145 let similarity = self.calculate_similarity(pattern_features, &knowledge.features);
147 if similarity > 0.7 {
148 relevant_keys.push(key.clone());
150 }
151 }
152
153 relevant_keys
154 }
155
156 fn calculate_similarity(&self, features1: &Array1<f64>, features2: &Array1<f64>) -> f64 {
158 if features1.len() != features2.len() {
159 return 0.0;
160 }
161
162 let mut dot_product = 0.0;
163 let mut norm1 = 0.0;
164 let mut norm2 = 0.0;
165
166 for i in 0..features1.len() {
167 dot_product += features1[i] * features2[i];
168 norm1 += features1[i] * features1[i];
169 norm2 += features2[i] * features2[i];
170 }
171
172 if norm1 == 0.0 || norm2 == 0.0 {
173 return 0.0;
174 }
175
176 dot_product / (norm1.sqrt() * norm2.sqrt())
177 }
178}
179
180impl ProcessingContext {
181 pub fn default() -> Self {
183 Self {
184 image_type: PatternType::Natural,
185 user_preferences: HashMap::new(),
186 available_resources: ResourceAvailability {
187 cpu_cores: 4,
188 memory_mb: 8192.0,
189 gpu_available: false,
190 quantum_available: false,
191 },
192 time_constraints: None,
193 quality_requirements: None,
194 }
195 }
196
197 pub fn update_context(&mut self, image_type: PatternType, preferences: HashMap<String, f64>) {
199 self.image_type = image_type;
200 self.user_preferences.extend(preferences);
201 }
202
203 pub fn is_time_constrained(&self) -> bool {
205 self.time_constraints.is_some()
206 }
207
208 pub fn get_processing_power_score(&self) -> f64 {
210 let mut score = self.available_resources.cpu_cores as f64;
211
212 if self.available_resources.gpu_available {
213 score += 10.0; }
215
216 if self.available_resources.quantum_available {
217 score += 50.0; }
219
220 score
221 }
222}