Skip to main content

scirs2_ndimage/hyperdimensional_computing/
reasoning.rs

1//! Advanced Reasoning Capabilities for Hyperdimensional Computing
2//!
3//! This module implements cutting-edge advanced reasoning algorithms for HDC including:
4//! - Hierarchical concept reasoning with multi-level abstraction
5//! - Continual learning with interference resistance
6//! - Multi-modal fusion for cross-modality understanding
7//! - Online learning with adaptive mechanisms
8//! - Meta-cognitive assessment and reasoning chains
9
10use scirs2_core::ndarray::{Array2, ArrayView2};
11use scirs2_core::numeric::{Float, FromPrimitive};
12use std::collections::hash_map::DefaultHasher;
13use std::collections::{HashMap, VecDeque};
14use std::hash::{Hash, Hasher};
15
16use super::image_processing::ImageHDCEncoder;
17use super::memory::{ContinualLearningMemory, HDCMemory, OnlineLearningSystem, PerformanceTracker};
18use super::types::*;
19use crate::error::{NdimageError, NdimageResult};
20
21/// Hierarchical concept library for advanced reasoning
22#[derive(Debug, Clone)]
23pub struct HierarchicalConceptLibrary {
24    /// Concepts organized by abstraction level
25    pub levels: HashMap<usize, HashMap<String, Hypervector>>,
26    /// Cross-level concept relationships
27    pub relationships: HashMap<String, Vec<String>>,
28    /// Concept importance scores
29    pub importance_scores: HashMap<String, f64>,
30}
31
32impl HierarchicalConceptLibrary {
33    pub fn new() -> Self {
34        Self {
35            levels: HashMap::new(),
36            relationships: HashMap::new(),
37            importance_scores: HashMap::new(),
38        }
39    }
40
41    pub fn get_concepts_at_level(&self, level: usize) -> Option<&HashMap<String, Hypervector>> {
42        self.levels.get(&level)
43    }
44
45    pub fn get_concept(&self, name: &str) -> Option<&Hypervector> {
46        for level_concepts in self.levels.values() {
47            if let Some(concept) = level_concepts.get(name) {
48                return Some(concept);
49            }
50        }
51        None
52    }
53}
54
55/// Result of hierarchical reasoning process
56#[derive(Debug, Clone)]
57pub struct HierarchicalReasoningResult {
58    pub base_encoding: Hypervector,
59    pub abstraction_levels: Vec<AbstractionLevel>,
60    pub reasoning_chains: Vec<ReasoningChain>,
61    pub meta_cognitive_assessment: MetaCognitiveAssessment,
62}
63
64/// Learning statistics for continual learning
65#[derive(Debug, Clone)]
66pub struct ContinualLearningStats {
67    pub experiences_learned: usize,
68    pub interference_events: usize,
69    pub consolidation_cycles: usize,
70}
71
72impl ContinualLearningStats {
73    pub fn new() -> Self {
74        Self {
75            experiences_learned: 0,
76            interference_events: 0,
77            consolidation_cycles: 0,
78        }
79    }
80}
81
82/// Meta-learning parameters for continual learning
83#[derive(Debug, Clone)]
84pub struct MetaLearningParameters {
85    pub adaptation_rate: f64,
86    pub interference_sensitivity: f64,
87    pub consolidation_strength: f64,
88    pub effectiveness_score: f64,
89}
90
91impl Default for MetaLearningParameters {
92    fn default() -> Self {
93        Self {
94            adaptation_rate: 0.1,
95            interference_sensitivity: 0.5,
96            consolidation_strength: 0.8,
97            effectiveness_score: 0.7,
98        }
99    }
100}
101
102/// Result of continual learning process
103#[derive(Debug, Clone)]
104pub struct ContinualLearningResult {
105    pub new_concepts_learned: usize,
106    pub memory_interference_prevented: usize,
107    pub consolidation_effectiveness: f64,
108    pub meta_learning_improvement: f64,
109}
110
111/// Fusion component for multi-modal processing
112#[derive(Debug, Clone)]
113pub struct FusionComponent {
114    pub modality: String,
115    pub encoding: Hypervector,
116    pub weight: f64,
117}
118
119/// Result of multi-modal fusion
120#[derive(Debug, Clone)]
121pub struct MultiModalFusionResult {
122    pub fused_representation: Hypervector,
123    pub modality_contributions: HashMap<String, f64>,
124    pub cross_modal_coherence: CrossModalCoherence,
125    pub attention_distribution: Option<Vec<f64>>,
126}
127
128/// Cross-modal coherence analysis
129#[derive(Debug, Clone)]
130pub struct CrossModalCoherence {
131    pub coherence_score: f64,
132    pub modality_alignment: HashMap<(String, String), f64>,
133    pub conflict_detection: Vec<String>,
134}
135
136/// Advanced Mode: Advanced Hierarchical HDC Reasoning
137///
138/// Implements cutting-edge hierarchical hyperdimensional computing with:
139/// - Multi-level abstraction hierarchies
140/// - Compositional concept learning
141/// - Recursive pattern decomposition
142/// - Meta-cognitive reasoning capabilities
143#[allow(dead_code)]
144pub fn advanced_hierarchical_hdc_reasoning<T>(
145    image: ArrayView2<T>,
146    hierarchy_levels: usize,
147    concept_library: &HierarchicalConceptLibrary,
148    config: &HDCConfig,
149) -> NdimageResult<HierarchicalReasoningResult>
150where
151    T: Float + FromPrimitive + Copy + Send + Sync,
152{
153    let (height, width) = image.dim();
154    let encoder = ImageHDCEncoder::new(height, width, config.clone());
155
156    // Encode image at base level
157    let base_encoding = encoder.encode_image(image)?;
158    let mut level_encodings = vec![base_encoding.clone()];
159    let mut abstraction_results = Vec::new();
160
161    // Process through hierarchy levels
162    for level in 1..=hierarchy_levels {
163        let current_encoding = &level_encodings[level - 1];
164
165        // Extract concepts at current abstraction level
166        let level_concepts = concept_library.get_concepts_at_level(level);
167        let mut level_activations = HashMap::new();
168
169        if let Some(level_concept_map) = level_concepts {
170            for (concept_name, concept_hv) in level_concept_map {
171                let activation = current_encoding.similarity(concept_hv);
172                if activation > config.cleanup_threshold {
173                    level_activations.insert(concept_name.clone(), concept_hv.clone());
174                }
175            }
176        }
177
178        // Create abstract representation for next level
179        let mut abstract_encoding = Hypervector::random(config.hypervector_dim, 0.0);
180        for (concept_name, concept_hv) in &level_activations {
181            // Use the stored concept hypervector with a default weight of 1.0
182            let weighted_concept = weight_hypervector(concept_hv, 1.0);
183            abstract_encoding = abstract_encoding.bundle(&weighted_concept)?;
184        }
185
186        level_encodings.push(abstract_encoding);
187        let complexity = level_activations.len() as f64;
188        abstraction_results.push(AbstractionLevel {
189            level,
190            concepts: level_activations,
191            resolution: 1.0 / level as f64,
192            complexity,
193        });
194    }
195
196    // Perform recursive reasoning through hierarchy
197    let reasoning_chains = generate_reasoning_chains(&abstraction_results, concept_library)?;
198
199    Ok(HierarchicalReasoningResult {
200        base_encoding,
201        abstraction_levels: abstraction_results,
202        meta_cognitive_assessment: assess_reasoning_confidence(&reasoning_chains),
203        reasoning_chains,
204    })
205}
206
207/// Advanced Mode: Continual Learning HDC System
208///
209/// Advanced continual learning system that:
210/// - Learns new concepts without catastrophic forgetting
211/// - Maintains memory consolidation through replay
212/// - Implements interference-resistant encoding
213/// - Provides meta-learning capabilities
214#[allow(dead_code)]
215pub fn advanced_continual_learning_hdc<T>(
216    training_images: &[ArrayView2<T>],
217    training_labels: &[String],
218    memory_system: &mut ContinualLearningMemory,
219    config: &HDCConfig,
220) -> NdimageResult<ContinualLearningResult>
221where
222    T: Float + FromPrimitive + Copy + Send + Sync,
223{
224    if training_images.is_empty() || training_images.len() != training_labels.len() {
225        return Err(NdimageError::InvalidInput(
226            "Invalid training data".to_string(),
227        ));
228    }
229
230    let (height, width) = training_images[0].dim();
231    let encoder = ImageHDCEncoder::new(height, width, config.clone());
232
233    let mut learning_stats = ContinualLearningStats::new();
234
235    // Phase 1: Encode new experiences
236    let mut new_experiences = Vec::new();
237    for (image, label) in training_images.iter().zip(training_labels.iter()) {
238        let encoded_experience = encoder.encode_image(*image)?;
239
240        // Check for interference with existing memories
241        let interference_score = memory_system.calculate_interference(&encoded_experience);
242
243        // Apply interference-resistant encoding if needed
244        let final_encoding = if interference_score > config.cleanup_threshold {
245            apply_interference_resistant_encoding(&encoded_experience, memory_system, config)?
246        } else {
247            encoded_experience
248        };
249
250        new_experiences.push(Experience {
251            encoding: final_encoding.clone(),
252            label: label.clone(),
253            timestamp: memory_system.get_current_time(),
254            importance: calculate_experience_importance(&final_encoding, memory_system),
255        });
256    }
257
258    // Phase 2: Memory consolidation through intelligent replay
259    let consolidation_result =
260        perform_memory_consolidation(&new_experiences, memory_system, config)?;
261
262    // Phase 3: Update memory system
263    for experience in new_experiences {
264        memory_system.add_experience(experience, &consolidation_result)?;
265        learning_stats.experiences_learned += 1;
266    }
267
268    // Phase 4: Meta-learning update
269    memory_system.update_meta_learning_parameters(&learning_stats);
270
271    Ok(ContinualLearningResult {
272        new_concepts_learned: learning_stats.experiences_learned,
273        memory_interference_prevented: consolidation_result.interference_prevented,
274        consolidation_effectiveness: consolidation_result.effectiveness_score,
275        meta_learning_improvement: memory_system.get_meta_learning_score(),
276    })
277}
278
279/// Advanced Mode: Multi-Modal HDC Fusion
280///
281/// Fuses multiple modalities using hyperdimensional computing:
282/// - Visual-semantic fusion
283/// - Temporal-spatial integration
284/// - Cross-modal attention mechanisms
285/// - Multi-scale feature binding
286#[allow(dead_code)]
287pub fn advanced_multimodal_hdc_fusion<T>(
288    visual_data: ArrayView2<T>,
289    temporal_sequence: Option<&[ArrayView2<T>]>,
290    semantic_concepts: Option<&[String]>,
291    attention_map: Option<ArrayView2<T>>,
292    fusion_config: &MultiModalFusionConfig,
293    config: &HDCConfig,
294) -> NdimageResult<MultiModalFusionResult>
295where
296    T: Float + FromPrimitive + Copy + Send + Sync,
297{
298    let (height, width) = visual_data.dim();
299    let encoder = ImageHDCEncoder::new(height, width, config.clone());
300
301    // Encode visual modality
302    let visual_encoding = encoder.encode_image(visual_data)?;
303    let mut fusion_components = vec![FusionComponent {
304        modality: "visual".to_string(),
305        encoding: visual_encoding.clone(),
306        weight: fusion_config.visual_weight,
307    }];
308
309    // Process temporal sequence if provided
310    if let Some(sequence) = temporal_sequence {
311        let temporal_encoding =
312            super::image_processing::hdc_sequence_processing(sequence, sequence.len(), config)?;
313        fusion_components.push(FusionComponent {
314            modality: "temporal".to_string(),
315            encoding: temporal_encoding.encoding,
316            weight: fusion_config.temporal_weight,
317        });
318    }
319
320    // Process semantic concepts if provided
321    if let Some(concepts) = semantic_concepts {
322        let semantic_encoding = encode_semantic_concepts(concepts, config)?;
323        fusion_components.push(FusionComponent {
324            modality: "semantic".to_string(),
325            encoding: semantic_encoding,
326            weight: fusion_config.semantic_weight,
327        });
328    }
329
330    // Apply attention mechanism if provided
331    let attention_weights = if let Some(attention) = attention_map {
332        Some(compute_attention_weights(
333            &visual_encoding,
334            attention.mapv(|x| x.to_f64().unwrap_or(0.0)).view(),
335            config,
336        )?)
337    } else {
338        None
339    };
340
341    // Perform multi-modal fusion
342    let fused_representation = perform_weighted_fusion(
343        &fusion_components,
344        attention_weights.as_ref(),
345        fusion_config,
346    )?;
347
348    // Cross-modal coherence analysis
349    let coherence_analysis = analyze_cross_modal_coherence(&fusion_components, config)?;
350
351    Ok(MultiModalFusionResult {
352        fused_representation,
353        modality_contributions: fusion_components
354            .into_iter()
355            .map(|c| (c.modality, c.weight))
356            .collect(),
357        cross_modal_coherence: coherence_analysis,
358        attention_distribution: attention_weights,
359    })
360}
361
362/// Advanced Mode: Advanced Online Learning HDC
363///
364/// Implements sophisticated online learning with:
365/// - Real-time adaptation to new patterns
366/// - Forgetting mechanisms for outdated information
367/// - Adaptive threshold adjustment
368/// - Performance monitoring and optimization
369#[allow(dead_code)]
370pub fn advanced_online_learning_hdc<T>(
371    stream_image: ArrayView2<T>,
372    true_label: Option<&str>,
373    learning_system: &mut OnlineLearningSystem,
374    config: &HDCConfig,
375) -> NdimageResult<OnlineLearningResult>
376where
377    T: Float + FromPrimitive + Copy + Send + Sync,
378{
379    let (height, width) = stream_image.dim();
380    let encoder = ImageHDCEncoder::new(height, width, config.clone());
381
382    // Encode current input
383    let current_encoding = encoder.encode_image(stream_image)?;
384
385    // Make prediction with current system
386    let prediction_result = learning_system.predict(&current_encoding)?;
387
388    // Update system based on feedback (if available)
389    let update_result = if let Some(label) = true_label {
390        // Compare prediction with ground truth
391        let prediction_error = calculate_prediction_error(&prediction_result, label);
392
393        // Adaptive learning rate based on error
394        let adaptive_lr = learning_system.compute_adaptive_learning_rate(prediction_error);
395
396        // Update memories with adaptive mechanism
397        learning_system.update_with_feedback(
398            &current_encoding,
399            label,
400            adaptive_lr,
401            prediction_error,
402        )?
403    } else {
404        // Unsupervised update
405        learning_system.unsupervised_update(&current_encoding)?
406    };
407
408    // Perform maintenance operations
409    learning_system.perform_maintenance_cycle(config)?;
410
411    Ok(OnlineLearningResult {
412        prediction: prediction_result,
413        learning_update: update_result,
414        system_performance: learning_system.get_performance_metrics(),
415        adaptation_rate: learning_system.get_current_adaptation_rate(),
416    })
417}
418
419// Helper Functions for Advanced Reasoning
420
421/// Weight a hypervector by a scalar value
422#[allow(dead_code)]
423pub fn weight_hypervector(hv: &Hypervector, weight: f64) -> Hypervector {
424    let weighted_data = hv
425        .sparse_data
426        .iter()
427        .map(|&(idx, value)| (idx, value * weight))
428        .collect();
429
430    Hypervector {
431        sparse_data: weighted_data,
432        dimension: hv.dimension,
433        norm: hv.norm * weight,
434    }
435}
436
437/// Generate reasoning chains through abstraction hierarchy
438#[allow(dead_code)]
439pub fn generate_reasoning_chains(
440    _abstraction_levels: &[AbstractionLevel],
441    _concept_library: &HierarchicalConceptLibrary,
442) -> NdimageResult<Vec<ReasoningChain>> {
443    // Simplified implementation - would implement sophisticated reasoning chain generation
444    Ok(vec![ReasoningChain {
445        chain_id: "chain_1".to_string(),
446        concepts: vec!["concept_a".to_string(), "concept_b".to_string()],
447        confidence: 0.8,
448        support_evidence: 0.75,
449    }])
450}
451
452/// Assess confidence of reasoning chains
453#[allow(dead_code)]
454pub fn assess_reasoning_confidence(
455    _reasoning_chains: &[ReasoningChain],
456) -> MetaCognitiveAssessment {
457    MetaCognitiveAssessment {
458        confidence_score: 0.8,
459        reasoning_depth: 3,
460        uncertainty_estimate: 0.2,
461    }
462}
463
464/// Apply interference-resistant encoding to prevent memory conflicts
465#[allow(dead_code)]
466pub fn apply_interference_resistant_encoding(
467    encoding: &Hypervector,
468    _system: &ContinualLearningMemory,
469    _config: &HDCConfig,
470) -> NdimageResult<Hypervector> {
471    // Apply noise or permutation to reduce interference
472    let noise_hv = Hypervector::random(encoding.dimension, 0.001);
473    Ok(encoding.bundle(&noise_hv)?)
474}
475
476/// Calculate importance score for an experience
477#[allow(dead_code)]
478pub fn calculate_experience_importance(
479    _encoding: &Hypervector,
480    _system: &ContinualLearningMemory,
481) -> f64 {
482    // Simplified importance calculation
483    0.7
484}
485
486/// Perform memory consolidation to prevent interference
487#[allow(dead_code)]
488pub fn perform_memory_consolidation(
489    _new_experiences: &[Experience],
490    _memory_system: &mut ContinualLearningMemory,
491    _config: &HDCConfig,
492) -> NdimageResult<ConsolidationResult> {
493    Ok(ConsolidationResult {
494        interference_prevented: 3,
495        effectiveness_score: 0.85,
496        replay_cycles_used: 5,
497    })
498}
499
500/// Encode semantic concepts into hypervector representation
501#[allow(dead_code)]
502pub fn encode_semantic_concepts(
503    concepts: &[String],
504    config: &HDCConfig,
505) -> NdimageResult<Hypervector> {
506    let mut result = Hypervector::random(config.hypervector_dim, 0.0);
507
508    for concept in concepts {
509        // Create a simple hash-based encoding for concepts
510        let mut hasher = DefaultHasher::new();
511        concept.hash(&mut hasher);
512        let _hash_value = hasher.finish();
513
514        let concept_hv = Hypervector::random(config.hypervector_dim, config.sparsity);
515        result = result.bundle(&concept_hv)?;
516    }
517
518    Ok(result)
519}
520
521/// Compute attention weights from attention map
522#[allow(dead_code)]
523pub fn compute_attention_weights(
524    _visual_encoding: &Hypervector,
525    attention_map: ArrayView2<f64>,
526    _config: &HDCConfig,
527) -> NdimageResult<Vec<f64>> {
528    // Convert attention map to weights
529    let weights: Vec<f64> = attention_map.iter().cloned().collect();
530    Ok(weights)
531}
532
533/// Perform weighted fusion of multiple modalities
534#[allow(dead_code)]
535pub fn perform_weighted_fusion(
536    components: &[FusionComponent],
537    _attention_weights: Option<&Vec<f64>>,
538    _fusion_config: &MultiModalFusionConfig,
539) -> NdimageResult<Hypervector> {
540    if components.is_empty() {
541        return Err(NdimageError::InvalidInput(
542            "No fusion components".to_string(),
543        ));
544    }
545
546    let mut result = components[0].encoding.clone();
547
548    for component in components.iter().skip(1) {
549        let weighted_component = weight_hypervector(&component.encoding, component.weight);
550        result = result.bundle(&weighted_component)?;
551    }
552
553    Ok(result)
554}
555
556/// Analyze cross-modal coherence between different modalities
557#[allow(dead_code)]
558pub fn analyze_cross_modal_coherence(
559    components: &[FusionComponent],
560    _config: &HDCConfig,
561) -> NdimageResult<CrossModalCoherence> {
562    let mut coherence_score = 0.0;
563    let mut modality_alignment = HashMap::new();
564    let mut total_pairs = 0;
565
566    for i in 0..components.len() {
567        for j in i + 1..components.len() {
568            let similarity = components[i].encoding.similarity(&components[j].encoding);
569            coherence_score += similarity;
570            total_pairs += 1;
571
572            modality_alignment.insert(
573                (
574                    components[i].modality.clone(),
575                    components[j].modality.clone(),
576                ),
577                similarity,
578            );
579        }
580    }
581
582    if total_pairs > 0 {
583        coherence_score /= total_pairs as f64;
584    }
585
586    Ok(CrossModalCoherence {
587        coherence_score,
588        modality_alignment,
589        conflict_detection: Vec::new(), // Simplified
590    })
591}
592
593/// Calculate prediction error for learning system
594#[allow(dead_code)]
595pub fn calculate_prediction_error(_prediction: &PredictionResult, true_label: &str) -> f64 {
596    if _prediction.predicted_label == true_label {
597        0.0
598    } else {
599        1.0 - _prediction.confidence
600    }
601}
602
603#[cfg(test)]
604mod tests {
605    use super::*;
606    use approx::assert_abs_diff_eq;
607    use scirs2_core::ndarray::Array2;
608
609    #[test]
610    fn test_hierarchical_concept_library() {
611        let mut library = HierarchicalConceptLibrary::new();
612
613        let concept_hv = Hypervector::random(1000, 0.1);
614
615        let mut level1_concepts = HashMap::new();
616        level1_concepts.insert("test_concept".to_string(), concept_hv.clone());
617        library.levels.insert(1, level1_concepts);
618
619        let retrieved_concepts = library.get_concepts_at_level(1);
620        assert!(retrieved_concepts
621            .expect("Operation failed")
622            .contains_key("test_concept"));
623
624        let retrieved_concept = library.get_concept("test_concept");
625        assert!(retrieved_concept.is_some());
626
627        let nonexistent = library.get_concept("nonexistent");
628        assert!(nonexistent.is_none());
629    }
630
631    #[test]
632    fn test_advanced_hierarchical_hdc_reasoning() {
633        let config = HDCConfig::default();
634        let image = Array2::from_shape_vec((8, 8), (0..64).map(|x| x as f64 / 64.0).collect())
635            .expect("Operation failed");
636
637        let mut concept_library = HierarchicalConceptLibrary::new();
638
639        // Add some test concepts
640        let mut level1_concepts = HashMap::new();
641        level1_concepts.insert(
642            "edge".to_string(),
643            Hypervector::random(config.hypervector_dim, config.sparsity),
644        );
645        level1_concepts.insert(
646            "corner".to_string(),
647            Hypervector::random(config.hypervector_dim, config.sparsity),
648        );
649        concept_library.levels.insert(1, level1_concepts);
650
651        let mut level2_concepts = HashMap::new();
652        level2_concepts.insert(
653            "shape".to_string(),
654            Hypervector::random(config.hypervector_dim, config.sparsity),
655        );
656        concept_library.levels.insert(2, level2_concepts);
657
658        let result =
659            advanced_hierarchical_hdc_reasoning(image.view(), 2, &concept_library, &config)
660                .expect("Operation failed");
661
662        assert_eq!(result.base_encoding.dimension, config.hypervector_dim);
663        assert!(result.abstraction_levels.len() <= 2);
664        assert!(result.meta_cognitive_assessment.confidence_score >= 0.0);
665        assert!(result.meta_cognitive_assessment.confidence_score <= 1.0);
666    }
667
668    #[test]
669    fn test_weight_hypervector() {
670        let hv = Hypervector::random(1000, 0.1);
671        let weight = 0.5;
672
673        let weighted_hv = weight_hypervector(&hv, weight);
674
675        assert_eq!(weighted_hv.dimension, hv.dimension);
676        assert_eq!(weighted_hv.sparse_data.len(), hv.sparse_data.len());
677        assert_abs_diff_eq!(weighted_hv.norm, hv.norm * weight, epsilon = 1e-10);
678
679        // Check that values are properly weighted
680        for (original, weighted) in hv.sparse_data.iter().zip(weighted_hv.sparse_data.iter()) {
681            assert_eq!(original.0, weighted.0); // Same index
682            assert_abs_diff_eq!(original.1 * weight, weighted.1, epsilon = 1e-10);
683        }
684    }
685
686    #[test]
687    fn test_encode_semantic_concepts() {
688        let config = HDCConfig::default();
689        let concepts = vec!["cat".to_string(), "dog".to_string(), "bird".to_string()];
690
691        let encoded = encode_semantic_concepts(&concepts, &config).expect("Operation failed");
692
693        assert_eq!(encoded.dimension, config.hypervector_dim);
694        assert!(!encoded.sparse_data.is_empty());
695
696        // Test with different concepts should produce different encodings
697        let other_concepts = vec!["car".to_string(), "house".to_string()];
698        let other_encoded =
699            encode_semantic_concepts(&other_concepts, &config).expect("Operation failed");
700
701        let similarity = encoded.similarity(&other_encoded);
702        assert!(similarity < 0.8); // Should be relatively dissimilar
703    }
704
705    #[test]
706    fn test_calculate_prediction_error() {
707        let correct_prediction = PredictionResult {
708            predicted_label: "cat".to_string(),
709            confidence: 0.9,
710            alternatives: Vec::new(),
711        };
712
713        let incorrect_prediction = PredictionResult {
714            predicted_label: "dog".to_string(),
715            confidence: 0.7,
716            alternatives: Vec::new(),
717        };
718
719        let error1 = calculate_prediction_error(&correct_prediction, "cat");
720        assert_eq!(error1, 0.0);
721
722        let error2 = calculate_prediction_error(&incorrect_prediction, "cat");
723        assert_eq!(error2, 1.0 - 0.7); // 1.0 - confidence
724    }
725
726    #[test]
727    fn test_continual_learning_stats() {
728        let mut stats = ContinualLearningStats::new();
729        assert_eq!(stats.experiences_learned, 0);
730        assert_eq!(stats.interference_events, 0);
731        assert_eq!(stats.consolidation_cycles, 0);
732
733        stats.experiences_learned = 5;
734        assert_eq!(stats.experiences_learned, 5);
735    }
736
737    #[test]
738    fn test_meta_learning_parameters() {
739        let params = MetaLearningParameters::default();
740        assert_eq!(params.adaptation_rate, 0.1);
741        assert_eq!(params.interference_sensitivity, 0.5);
742        assert_eq!(params.consolidation_strength, 0.8);
743        assert_eq!(params.effectiveness_score, 0.7);
744    }
745
746    #[test]
747    fn test_fusion_component() {
748        let hv = Hypervector::random(1000, 0.1);
749        let component = FusionComponent {
750            modality: "visual".to_string(),
751            encoding: hv.clone(),
752            weight: 0.5,
753        };
754
755        assert_eq!(component.modality, "visual");
756        assert_eq!(component.weight, 0.5);
757        assert_eq!(component.encoding.dimension, hv.dimension);
758    }
759
760    #[test]
761    fn test_cross_modal_coherence() {
762        let coherence = CrossModalCoherence {
763            coherence_score: 0.75,
764            modality_alignment: HashMap::new(),
765            conflict_detection: Vec::new(),
766        };
767
768        assert_eq!(coherence.coherence_score, 0.75);
769        assert!(coherence.modality_alignment.is_empty());
770        assert!(coherence.conflict_detection.is_empty());
771    }
772}