use neuropool::{NeuronPool, PoolConfig, SignalType, TemplateRequest, TemplateType};
fn main() {
println!("╔══════════════════════════════════════════════════════════════════╗");
println!("║ NEURAL WORD PROCESSING - PROOF OF WORK ║");
println!("╚══════════════════════════════════════════════════════════════════╝\n");
let mut pool = NeuronPool::new("word_brain", 0, PoolConfig::default());
pool.init_spatial([10.0, 10.0, 10.0]);
let sensory_id = pool.spawn_template(
TemplateRequest {
template_type: TemplateType::SensoryArray { dimensions: 128 },
input_signal: SignalType::SensoryRaw,
output_signal: SignalType::TextRaw,
position_hint: Some([1.0, 5.0, 5.0]),
},
100,
).unwrap();
let encoder_id = pool.spawn_template(
TemplateRequest {
template_type: TemplateType::LateralInhibition { scale: 32, surround_ratio: 2 },
input_signal: SignalType::TextRaw,
output_signal: SignalType::WordPattern,
position_hint: Some([3.0, 5.0, 5.0]),
},
200,
).unwrap();
let memory_id = pool.spawn_template(
TemplateRequest {
template_type: TemplateType::AttractorMemory { capacity: 24 },
input_signal: SignalType::WordPattern,
output_signal: SignalType::MemoryRecall,
position_hint: Some([5.0, 5.0, 5.0]),
},
300,
).unwrap();
let intent_id = pool.spawn_template(
TemplateRequest {
template_type: TemplateType::WinnerTakeAll { competitors: 6 },
input_signal: SignalType::MemoryRecall,
output_signal: SignalType::CognitiveDecision,
position_hint: Some([7.0, 5.0, 5.0]),
},
400,
).unwrap();
let ff_synapses = pool.wire_inter_template(4.0, 0.8, 999);
let recurrent_synapses = pool.wire_intra_template(memory_id, 0.5, 12345);
let sensory_neurons = pool.get_template(sensory_id).unwrap().neuron_indices.clone();
let encoder_neurons = pool.get_template(encoder_id).unwrap().neuron_indices.clone();
let memory_neurons = pool.get_template(memory_id).unwrap().neuron_indices.clone();
let intent_neurons = pool.get_template(intent_id).unwrap().neuron_indices.clone();
println!("Architecture:");
println!(" Sensory: {} neurons (ear)", sensory_neurons.len());
println!(" Encoder: {} neurons (pattern sharpening)", encoder_neurons.len());
println!(" Memory: {} neurons (attractor storage)", memory_neurons.len());
println!(" Intent: {} neurons (category decision)", intent_neurons.len());
println!(" Synapses: {} feed-forward + {} recurrent\n", ff_synapses, recurrent_synapses);
#[derive(Clone, Copy, Debug, PartialEq)]
enum Intent { Animal, Action, Object, Place, Unknown }
let vocabulary: Vec<(&str, &[u8], Intent)> = vec![
("cat", &[99, 97, 116], Intent::Animal),
("dog", &[100, 111, 103], Intent::Animal),
("bat", &[98, 97, 116], Intent::Animal),
("run", &[114, 117, 110], Intent::Action),
("eat", &[101, 97, 116], Intent::Action),
("sit", &[115, 105, 116], Intent::Action),
("cup", &[99, 117, 112], Intent::Object),
("box", &[98, 111, 120], Intent::Object),
];
println!("═══ PHASE 1: BASELINE ENCODING (no learning) ═══\n");
let mut baseline_patterns: Vec<(&str, Vec<u32>, Intent)> = Vec::new();
for (word, bytes, intent) in &vocabulary {
let resting = pool.config.resting_potential;
pool.neurons.membrane.iter_mut().for_each(|m| *m = resting);
pool.neurons.spike_out.iter_mut().for_each(|s| *s = false);
let mut total_spikes: Vec<u32> = vec![0; 4];
for &byte in *bytes {
for tick in 0..8 {
if tick % 2 == 0 {
pool.inject_sensory(sensory_id, &[byte], 15000);
}
pool.tick_simple(&[]);
total_spikes[0] += sensory_neurons.iter().filter(|&&i| pool.neurons.spike_out[i]).count() as u32;
total_spikes[1] += encoder_neurons.iter().filter(|&&i| pool.neurons.spike_out[i]).count() as u32;
total_spikes[2] += memory_neurons.iter().filter(|&&i| pool.neurons.spike_out[i]).count() as u32;
total_spikes[3] += intent_neurons.iter().filter(|&&i| pool.neurons.spike_out[i]).count() as u32;
}
}
let resting = pool.config.resting_potential;
let threshold = resting + 500;
let memory_pattern: Vec<u32> = memory_neurons.iter().enumerate()
.filter(|(_, &i)| pool.neurons.membrane[i] > threshold)
.map(|(idx, _)| idx as u32)
.collect();
println!(" {:5} [{:?}] → spikes: S={:3} E={:3} M={:3} I={:3} | active: {:?}",
word, intent, total_spikes[0], total_spikes[1], total_spikes[2], total_spikes[3],
memory_pattern);
baseline_patterns.push((word, memory_pattern, *intent));
}
let learned_patterns = baseline_patterns.clone();
println!("\n═══ PHASE 4: RECALL TEST ═══\n");
println!(" Testing: Present word → check if memory activates same pattern\n");
let mut recall_correct = 0;
let mut recall_total = 0;
for (expected_word, bytes, expected_intent) in &vocabulary {
let resting = pool.config.resting_potential;
pool.neurons.membrane.iter_mut().for_each(|m| *m = resting);
pool.neurons.spike_out.iter_mut().for_each(|s| *s = false);
pool.spike_counts.iter_mut().for_each(|c| *c = 0);
for &byte in *bytes {
for tick in 0..8 {
if tick % 2 == 0 {
pool.inject_sensory(sensory_id, &[byte], 15000);
}
pool.tick_simple(&[]);
}
}
let resting = pool.config.resting_potential;
let threshold = resting + 500;
let query_pattern: Vec<u32> = memory_neurons.iter().enumerate()
.filter(|(_, &i)| pool.neurons.membrane[i] > threshold)
.map(|(idx, _)| idx as u32)
.collect();
let mut best_word = "";
let mut best_overlap = 0usize;
let mut best_intent = Intent::Unknown;
for (word, pattern, intent) in &learned_patterns {
let overlap = query_pattern.iter()
.filter(|n| pattern.contains(n))
.count();
if overlap > best_overlap || (overlap == best_overlap && best_word.is_empty()) {
best_overlap = overlap;
best_word = word;
best_intent = *intent;
}
}
let correct = best_word == *expected_word;
if correct { recall_correct += 1; }
recall_total += 1;
let intent_match = best_intent == *expected_intent;
println!(" {:5} → {:5} (overlap: {:2} neurons) {} | intent: {:?} {}",
expected_word, best_word, best_overlap,
if correct { "✓" } else { "✗" },
best_intent,
if intent_match { "✓" } else { "✗" });
}
println!("\n═══ PHASE 5: NOVEL WORDS (generalization) ═══\n");
let novel_words: Vec<(&str, &[u8])> = vec![
("car", &[99, 97, 114]), ("fog", &[102, 111, 103]), ("rat", &[114, 97, 116]), ("jog", &[106, 111, 103]), ("mug", &[109, 117, 103]), ];
for (novel_word, bytes) in &novel_words {
let resting = pool.config.resting_potential;
pool.neurons.membrane.iter_mut().for_each(|m| *m = resting);
pool.neurons.spike_out.iter_mut().for_each(|s| *s = false);
pool.spike_counts.iter_mut().for_each(|c| *c = 0);
for &byte in *bytes {
for tick in 0..8 {
if tick % 2 == 0 {
pool.inject_sensory(sensory_id, &[byte], 15000);
}
pool.tick_simple(&[]);
}
}
let resting = pool.config.resting_potential;
let threshold = resting + 500;
let query_pattern: Vec<u32> = memory_neurons.iter().enumerate()
.filter(|(_, &i)| pool.neurons.membrane[i] > threshold)
.map(|(idx, _)| idx as u32)
.collect();
let mut matches: Vec<(&str, usize, Intent)> = learned_patterns.iter()
.map(|(word, pattern, intent)| {
let overlap = query_pattern.iter().filter(|n| pattern.contains(n)).count();
(*word, overlap, *intent)
})
.filter(|(_, overlap, _)| *overlap > 0)
.collect();
matches.sort_by(|a, b| b.1.cmp(&a.1));
let inferred_intent = if !matches.is_empty() {
matches[0].2
} else {
Intent::Unknown
};
let top_matches: Vec<String> = matches.iter().take(3)
.map(|(w, o, _)| format!("{}({})", w, o))
.collect();
println!(" {:5} (novel) → matches: {:30} → inferred: {:?}",
novel_word,
if top_matches.is_empty() { "none".to_string() } else { top_matches.join(", ") },
inferred_intent);
}
println!("\n═══ PHASE 6: PATTERN DISTINCTIVENESS ═══\n");
println!(" Overlap matrix (shared active neurons):\n");
print!(" ");
for (word, _, _) in &learned_patterns {
print!("{:5} ", word);
}
println!();
for (word1, pattern1, _) in &learned_patterns {
print!(" {:5} ", word1);
for (_, pattern2, _) in &learned_patterns {
let overlap = pattern1.iter().filter(|n| pattern2.contains(n)).count();
print!("{:5} ", overlap);
}
println!();
}
println!("\n═══ PHASE 7: INTENT CLUSTERING ═══\n");
let intents = [Intent::Animal, Intent::Action, Intent::Object];
for intent in &intents {
let words_with_intent: Vec<&str> = learned_patterns.iter()
.filter(|(_, _, i)| i == intent)
.map(|(w, _, _)| *w)
.collect();
let patterns: Vec<&Vec<u32>> = learned_patterns.iter()
.filter(|(_, _, i)| i == intent)
.map(|(_, p, _)| p)
.collect();
if patterns.len() >= 2 {
let shared: Vec<u32> = patterns[0].iter()
.filter(|n| patterns.iter().skip(1).all(|p| p.contains(n)))
.cloned()
.collect();
println!(" {:?}: {} | shared neurons: {:?}", intent, words_with_intent.join(", "), shared);
}
}
println!("\n╔══════════════════════════════════════════════════════════════════╗");
println!("║ RESULTS ║");
println!("╚══════════════════════════════════════════════════════════════════╝\n");
let recall_accuracy = (recall_correct as f32 / recall_total as f32) * 100.0;
println!(" Recall accuracy: {}/{} ({:.0}%)", recall_correct, recall_total, recall_accuracy);
let total_active: usize = baseline_patterns.iter().map(|(_, p, _)| p.len()).sum();
let avg_active = total_active as f32 / baseline_patterns.len() as f32;
println!(" Avg active neurons: {:.1} per word", avg_active);
let mut collisions = 0;
for i in 0..baseline_patterns.len() {
for j in (i+1)..baseline_patterns.len() {
if baseline_patterns[i].1 == baseline_patterns[j].1 {
collisions += 1;
}
}
}
println!(" Pattern collisions: {} (0 = all distinct)", collisions);
let mut total_jaccard = 0.0f32;
let mut pair_count = 0;
for i in 0..baseline_patterns.len() {
for j in (i+1)..baseline_patterns.len() {
let p1 = &baseline_patterns[i].1;
let p2 = &baseline_patterns[j].1;
let overlap = p1.iter().filter(|n| p2.contains(n)).count();
let union = p1.len() + p2.len() - overlap;
if union > 0 {
total_jaccard += overlap as f32 / union as f32;
pair_count += 1;
}
}
}
let avg_jaccard = if pair_count > 0 { total_jaccard / pair_count as f32 } else { 0.0 };
println!(" Avg Jaccard sim: {:.3} (lower = more distinct)", avg_jaccard);
let verdict = if recall_accuracy >= 75.0 {
"NEURAL SYSTEM WORKS - genuine pattern recognition"
} else if recall_accuracy >= 50.0 {
"PARTIAL SUCCESS - learning helps but needs tuning"
} else {
"NEEDS WORK - insufficient discrimination"
};
println!("\n VERDICT: {}", verdict);
}