mod adaptive_consensus;
mod predictive_validator;
pub use adaptive_consensus::AdaptiveConsensus;
pub use predictive_validator::PredictiveValidator;
use crate::ineru::IneruMemory;
use crate::nested_learning::NestedLearning;
use crate::types::{AiTransaction, ConsensusLevel, ValidationPrediction};
pub struct AiLayer {
ineru: IneruMemory,
nested: NestedLearning,
predictor: PredictiveValidator,
consensus: AdaptiveConsensus,
}
impl AiLayer {
pub fn new() -> Self {
use crate::ineru::IneruConfig;
use crate::nested_learning::NestedConfig;
Self {
ineru: IneruMemory::new(IneruConfig::default()),
nested: NestedLearning::new(NestedConfig::default()),
predictor: PredictiveValidator::new(),
consensus: AdaptiveConsensus::new(),
}
}
pub fn process(&mut self, tx: &AiTransaction) -> AiProcessResult {
let ineru_result = self.ineru.process(tx).ok();
let nested_result = self.nested.process(tx).ok();
let prediction = self.predictor.predict(tx, &self.ineru, &self.nested);
let consensus_level = self.consensus.determine_level(tx, &prediction);
AiProcessResult {
prediction,
consensus_level,
stored_pattern: ineru_result.map(|r| r.stored_long_term).unwrap_or(false),
validation_strategy: nested_result.map(|r| r.strategy),
}
}
pub fn query_similar(&self, tx: &AiTransaction, limit: usize) -> Vec<PatternMatch> {
let pattern = tx.to_pattern();
self.ineru
.query(&pattern, limit)
.into_iter()
.map(|m| PatternMatch {
similarity: m.similarity,
source: format!("{:?}", m.source),
})
.collect()
}
pub fn stats(&self) -> AiLayerStats {
let ineru_stats = self.ineru.stats();
let nested_stats = self.nested.stats();
AiLayerStats {
ineru_short_term_size: ineru_stats.short_term_size,
ineru_long_term_size: ineru_stats.long_term_size,
nested_tx_count: nested_stats.tx_count,
nested_block_count: nested_stats.block_count,
}
}
}
impl Default for AiLayer {
fn default() -> Self {
Self::new()
}
}
#[derive(Debug, Clone)]
pub struct AiProcessResult {
pub prediction: ValidationPrediction,
pub consensus_level: ConsensusLevel,
pub stored_pattern: bool,
pub validation_strategy: Option<crate::nested_learning::ValidationStrategy>,
}
#[derive(Debug, Clone)]
pub struct PatternMatch {
pub similarity: f32,
pub source: String,
}
#[derive(Debug, Clone)]
pub struct AiLayerStats {
pub ineru_short_term_size: usize,
pub ineru_long_term_size: usize,
pub nested_tx_count: u64,
pub nested_block_count: u64,
}
#[cfg(test)]
mod tests {
use super::*;
fn make_test_tx(id: u8) -> AiTransaction {
AiTransaction {
hash: [id; 32],
timestamp: 1702656000000 + (id as u64 * 1000),
agent: [1u8; 32],
entry_type: "test".to_string(),
data: vec![id; 10],
size: 10,
}
}
#[test]
fn test_ai_layer_basic() {
let mut layer = AiLayer::new();
let tx = make_test_tx(1);
let result = layer.process(&tx);
assert!(result.prediction.confidence >= 0.0);
}
#[test]
fn test_ai_layer_query() {
let mut layer = AiLayer::new();
for i in 0..10 {
let tx = make_test_tx(i);
layer.process(&tx);
}
let tx = make_test_tx(5);
let matches = layer.query_similar(&tx, 3);
assert!(matches.len() <= 3);
}
}