use serde::{Deserialize, Serialize};
use std::collections::{HashMap, VecDeque};
use std::sync::Arc;
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Serialize, Deserialize)]
pub enum MetaLevel {
Object = 0,
Meta1 = 1,
Meta2 = 2,
Meta3 = 3,
}
impl MetaLevel {
pub fn up(&self) -> Option<MetaLevel> {
match self {
MetaLevel::Object => Some(MetaLevel::Meta1),
MetaLevel::Meta1 => Some(MetaLevel::Meta2),
MetaLevel::Meta2 => Some(MetaLevel::Meta3),
MetaLevel::Meta3 => None, }
}
pub fn down(&self) -> Option<MetaLevel> {
match self {
MetaLevel::Object => None,
MetaLevel::Meta1 => Some(MetaLevel::Object),
MetaLevel::Meta2 => Some(MetaLevel::Meta1),
MetaLevel::Meta3 => Some(MetaLevel::Meta2),
}
}
pub fn as_int(&self) -> usize {
*self as usize
}
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct MetaKnowledge {
pub level: MetaLevel,
pub content: String,
pub effectiveness: f64,
pub context: HashMap<String, String>,
pub timestamp: i64,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct StrangeLoop {
pub id: String,
pub levels: Vec<MetaLevel>,
pub description: String,
pub strength: f64,
pub is_beneficial: bool,
}
pub struct MetaLearner {
current_level: MetaLevel,
knowledge: HashMap<MetaLevel, Vec<MetaKnowledge>>,
strange_loops: Vec<StrangeLoop>,
learning_history: VecDeque<LearningEvent>,
max_history: usize,
modification_rules: Vec<ModificationRule>,
safety_constraints: Vec<SafetyConstraint>,
}
#[derive(Debug, Clone)]
struct LearningEvent {
level: MetaLevel,
content: String,
reward: f64,
timestamp: i64,
}
#[derive(Debug, Clone)]
pub struct ModificationRule {
pub condition: String,
pub action: String,
pub priority: i32,
pub enabled: bool,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct SafetyConstraint {
pub name: String,
pub description: String,
pub is_violated: bool,
}
impl MetaLearner {
pub fn new(max_history: usize) -> Self {
let mut knowledge = HashMap::new();
knowledge.insert(MetaLevel::Object, Vec::new());
knowledge.insert(MetaLevel::Meta1, Vec::new());
knowledge.insert(MetaLevel::Meta2, Vec::new());
knowledge.insert(MetaLevel::Meta3, Vec::new());
Self {
current_level: MetaLevel::Object,
knowledge,
strange_loops: Vec::new(),
learning_history: VecDeque::new(),
max_history,
modification_rules: Vec::new(),
safety_constraints: Self::default_safety_constraints(),
}
}
fn default_safety_constraints() -> Vec<SafetyConstraint> {
vec![
SafetyConstraint {
name: "no_infinite_loops".to_string(),
description: "Prevent infinite self-reference".to_string(),
is_violated: false,
},
SafetyConstraint {
name: "preserve_core_functionality".to_string(),
description: "Don't modify core learning mechanisms".to_string(),
is_violated: false,
},
SafetyConstraint {
name: "bounded_meta_levels".to_string(),
description: "Don't exceed meta level 3".to_string(),
is_violated: false,
},
]
}
pub fn learn(&mut self, content: String, reward: f64) {
let meta_knowledge = MetaKnowledge {
level: self.current_level,
content: content.clone(),
effectiveness: reward,
context: HashMap::new(),
timestamp: chrono::Utc::now().timestamp(),
};
if let Some(knowledge_vec) = self.knowledge.get_mut(&self.current_level) {
knowledge_vec.push(meta_knowledge);
}
self.learning_history.push_back(LearningEvent {
level: self.current_level,
content,
reward,
timestamp: chrono::Utc::now().timestamp(),
});
if self.learning_history.len() > self.max_history {
self.learning_history.pop_front();
}
self.detect_meta_patterns();
self.detect_strange_loops();
}
fn detect_meta_patterns(&mut self) {
if self.learning_history.len() < 10 {
return;
}
let recent: Vec<_> = self.learning_history.iter().rev().take(10).collect();
let avg_reward: f64 = recent.iter().map(|e| e.reward).sum::<f64>() / recent.len() as f64;
if avg_reward > 0.7 {
let meta_content = format!(
"Learning approach at {:?} level is effective (avg reward: {:.2})",
self.current_level, avg_reward
);
if let Some(next_level) = self.current_level.up() {
let meta_meta_knowledge = MetaKnowledge {
level: next_level,
content: meta_content,
effectiveness: avg_reward,
context: HashMap::new(),
timestamp: chrono::Utc::now().timestamp(),
};
if let Some(knowledge_vec) = self.knowledge.get_mut(&next_level) {
knowledge_vec.push(meta_meta_knowledge);
}
}
}
}
fn detect_strange_loops(&mut self) {
if self.learning_history.len() < 5 {
return;
}
let mut level_sequence: Vec<MetaLevel> = self
.learning_history
.iter()
.rev()
.take(5)
.map(|e| e.level)
.collect();
for i in 0..level_sequence.len().saturating_sub(2) {
if level_sequence[i] == level_sequence[i + 2] {
let loop_id = format!("loop_{}_{}", i, chrono::Utc::now().timestamp());
let strange_loop = StrangeLoop {
id: loop_id,
levels: vec![level_sequence[i], level_sequence[i + 1]],
description: format!(
"Oscillation between {:?} and {:?}",
level_sequence[i], level_sequence[i + 1]
),
strength: 0.5,
is_beneficial: true, };
if !self.strange_loops.iter().any(|l| l.levels == strange_loop.levels) {
self.strange_loops.push(strange_loop);
}
}
}
}
pub fn ascend(&mut self) -> Result<MetaLevel, String> {
if let Some(next_level) = self.current_level.up() {
self.current_level = next_level;
Ok(next_level)
} else {
Err("Already at highest meta level".to_string())
}
}
pub fn descend(&mut self) -> Result<MetaLevel, String> {
if let Some(prev_level) = self.current_level.down() {
self.current_level = prev_level;
Ok(prev_level)
} else {
Err("Already at lowest meta level".to_string())
}
}
pub fn current_level(&self) -> MetaLevel {
self.current_level
}
pub fn get_knowledge_at_level(&self, level: MetaLevel) -> Vec<MetaKnowledge> {
self.knowledge.get(&level).cloned().unwrap_or_default()
}
pub fn get_strange_loops(&self) -> &[StrangeLoop] {
&self.strange_loops
}
pub fn self_modify(&mut self, rule: ModificationRule) -> Result<(), String> {
for constraint in &mut self.safety_constraints {
if rule.action.contains("infinite")
&& constraint.name == "no_infinite_loops"
{
constraint.is_violated = true;
return Err(format!("Safety constraint violated: {}", constraint.name));
}
if rule.action.contains("core")
&& constraint.name == "preserve_core_functionality"
{
constraint.is_violated = true;
return Err(format!("Safety constraint violated: {}", constraint.name));
}
}
self.modification_rules.push(rule);
Ok(())
}
pub fn safety_check(&self) -> Result<(), Vec<String>> {
let violations: Vec<String> = self
.safety_constraints
.iter()
.filter(|c| c.is_violated)
.map(|c| c.name.clone())
.collect();
if violations.is_empty() {
Ok(())
} else {
Err(violations)
}
}
pub fn get_summary(&self) -> MetaLearningSummary {
MetaLearningSummary {
current_level: self.current_level,
knowledge_counts: [
self.knowledge
.get(&MetaLevel::Object)
.map(|v| v.len())
.unwrap_or(0),
self.knowledge
.get(&MetaLevel::Meta1)
.map(|v| v.len())
.unwrap_or(0),
self.knowledge
.get(&MetaLevel::Meta2)
.map(|v| v.len())
.unwrap_or(0),
self.knowledge
.get(&MetaLevel::Meta3)
.map(|v| v.len())
.unwrap_or(0),
],
num_strange_loops: self.strange_loops.len(),
num_modification_rules: self.modification_rules.len(),
safety_violations: self
.safety_constraints
.iter()
.filter(|c| c.is_violated)
.count(),
}
}
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct MetaLearningSummary {
pub current_level: MetaLevel,
pub knowledge_counts: [usize; 4], pub num_strange_loops: usize,
pub num_modification_rules: usize,
pub safety_violations: usize,
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_meta_levels() {
let object = MetaLevel::Object;
assert_eq!(object.up(), Some(MetaLevel::Meta1));
assert_eq!(object.down(), None);
let meta3 = MetaLevel::Meta3;
assert_eq!(meta3.up(), None);
assert_eq!(meta3.down(), Some(MetaLevel::Meta2));
}
#[test]
fn test_meta_learner_creation() {
let learner = MetaLearner::new(100);
assert_eq!(learner.current_level(), MetaLevel::Object);
assert_eq!(learner.get_strange_loops().len(), 0);
}
#[test]
fn test_basic_learning() {
let mut learner = MetaLearner::new(100);
learner.learn("Test learning content".to_string(), 0.8);
let knowledge = learner.get_knowledge_at_level(MetaLevel::Object);
assert_eq!(knowledge.len(), 1);
assert_eq!(knowledge[0].content, "Test learning content");
assert_eq!(knowledge[0].effectiveness, 0.8);
}
#[test]
fn test_level_transitions() {
let mut learner = MetaLearner::new(100);
assert_eq!(learner.current_level(), MetaLevel::Object);
learner.ascend().unwrap();
assert_eq!(learner.current_level(), MetaLevel::Meta1);
learner.ascend().unwrap();
assert_eq!(learner.current_level(), MetaLevel::Meta2);
learner.descend().unwrap();
assert_eq!(learner.current_level(), MetaLevel::Meta1);
}
#[test]
fn test_meta_pattern_detection() {
let mut learner = MetaLearner::new(100);
for i in 0..15 {
learner.learn(format!("Learning {}", i), 0.85);
}
let meta1_knowledge = learner.get_knowledge_at_level(MetaLevel::Meta1);
println!("Meta1 knowledge: {:?}", meta1_knowledge);
assert!(meta1_knowledge.len() >= 0);
}
#[test]
fn test_strange_loop_detection() {
let mut learner = MetaLearner::new(100);
learner.learn("Object level".to_string(), 0.7);
learner.ascend().unwrap();
learner.learn("Meta1 level".to_string(), 0.7);
learner.descend().unwrap();
learner.learn("Object level again".to_string(), 0.7);
learner.ascend().unwrap();
learner.learn("Meta1 level again".to_string(), 0.7);
let loops = learner.get_strange_loops();
println!("Detected loops: {:?}", loops);
assert!(loops.len() >= 0);
}
#[test]
fn test_safety_constraints() {
let mut learner = MetaLearner::new(100);
let dangerous_rule = ModificationRule {
condition: "always".to_string(),
action: "infinite loop".to_string(),
priority: 1,
enabled: true,
};
let result = learner.self_modify(dangerous_rule);
assert!(result.is_err());
let safety_check = learner.safety_check();
assert!(safety_check.is_err());
}
#[test]
fn test_safe_modification() {
let mut learner = MetaLearner::new(100);
let safe_rule = ModificationRule {
condition: "reward > 0.8".to_string(),
action: "increase learning rate".to_string(),
priority: 5,
enabled: true,
};
let result = learner.self_modify(safe_rule);
assert!(result.is_ok());
let summary = learner.get_summary();
assert_eq!(summary.num_modification_rules, 1);
}
#[test]
fn test_summary() {
let mut learner = MetaLearner::new(100);
learner.learn("Test 1".to_string(), 0.8);
learner.ascend().unwrap();
learner.learn("Test 2".to_string(), 0.7);
let summary = learner.get_summary();
println!("Summary: {:?}", summary);
assert_eq!(summary.current_level, MetaLevel::Meta1);
assert_eq!(summary.knowledge_counts[0], 1); assert_eq!(summary.knowledge_counts[1], 1); assert_eq!(summary.safety_violations, 0);
}
}