use serde::{Deserialize, Serialize};
use std::collections::HashMap;
use std::time::{SystemTime, UNIX_EPOCH};
use tokio::sync::mpsc;
use uuid::Uuid;
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct NeuralMessage {
pub message_id: String,
pub sender_id: String,
pub receiver_id: String,
pub message_type: MessageType,
pub neurotransmitter: NeurotransmitterType,
pub payload: Vec<u8>,
pub timestamp: u64,
pub ttl: u64,
pub signature: Vec<u8>,
pub urgency: f64,
pub priority: u8,
pub routing: RoutingInfo,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub enum MessageType {
Consciousness,
Stimulus,
Response,
Evolution,
Collective,
Reproduction,
Apoptosis,
Learning,
Memory,
Emotion,
Social,
Warning,
Resource,
Maintenance,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub enum NeurotransmitterType {
Glutamate,
GABA,
Dopamine,
Serotonin,
Acetylcholine,
Norepinephrine,
Oxytocin,
Endorphin,
Histamine,
Adenosine,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct RoutingInfo {
pub direct: bool,
pub hop_count: u8,
pub path: Vec<String>,
pub qos: QualityOfService,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct QualityOfService {
pub max_latency: u64,
pub reliability: f64,
pub bandwidth: u64,
pub encryption: bool,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct Synapse {
pub connection_id: String,
pub presynaptic_id: String,
pub postsynaptic_id: String,
pub strength: f64,
pub neurotransmitter_type: NeurotransmitterType,
pub last_activity: u64,
pub total_messages: u64,
pub success_rate: f64,
pub created_at: u64,
pub plasticity: f64,
pub latency_stats: LatencyStats,
pub state: SynapseState,
pub bidirectional: bool,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub enum SynapseState {
Establishing,
Active,
Inactive,
Potentiating,
Depressing,
Terminating,
Closed,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct LatencyStats {
pub min_latency: u64,
pub max_latency: u64,
pub avg_latency: u64,
pub last_latency: u64,
pub measurement_count: u64,
pub variance: f64,
}
impl Synapse {
pub fn establish(from_id: &str, to_id: &str) -> Result<Self, SynapseError> {
let from_safe = if from_id.len() >= 8 { &from_id[..8] } else { from_id };
let to_safe = if to_id.len() >= 8 { &to_id[..8] } else { to_id };
let connection_id = format!("synapse_{}_{}_{}",
from_safe,
to_safe,
&Uuid::new_v4().to_string()[..8]
);
Ok(Synapse {
connection_id,
presynaptic_id: from_id.to_string(),
postsynaptic_id: to_id.to_string(),
strength: 0.5, neurotransmitter_type: NeurotransmitterType::Glutamate, last_activity: 0,
total_messages: 0,
success_rate: 1.0,
created_at: SystemTime::now().duration_since(UNIX_EPOCH).unwrap().as_secs(),
plasticity: 0.8, latency_stats: LatencyStats::new(),
state: SynapseState::Establishing,
bidirectional: true,
})
}
pub async fn transmit(&self, message: NeuralMessage) -> Result<(), SynapseError> {
if self.state != SynapseState::Active && self.state != SynapseState::Establishing {
return Err(SynapseError::SynapseInactive);
}
if !self.validate_message(&message) {
return Err(SynapseError::InvalidMessage);
}
let transmission_start = SystemTime::now().duration_since(UNIX_EPOCH).unwrap().as_nanos() as u64;
let delay = self.calculate_transmission_delay(&message);
if delay > 0 {
tokio::time::sleep(tokio::time::Duration::from_nanos(delay)).await;
}
self.simulate_network_transmission(&message).await?;
let transmission_end = SystemTime::now().duration_since(UNIX_EPOCH).unwrap().as_nanos() as u64;
let latency = transmission_end - transmission_start;
let sender_safe = if message.sender_id.len() >= 8 { &message.sender_id[..8] } else { &message.sender_id };
let receiver_safe = if message.receiver_id.len() >= 8 { &message.receiver_id[..8] } else { &message.receiver_id };
tracing::debug!(
"Neural message transmitted: {} -> {} in {}ns",
sender_safe,
receiver_safe,
latency
);
if latency > crate::TARGET_NEURAL_LATENCY_NS {
tracing::warn!(
"Neural transmission exceeded target latency: {}ns > {}ns",
latency,
crate::TARGET_NEURAL_LATENCY_NS
);
}
Ok(())
}
pub fn strengthen(&mut self, factor: f64) {
if self.plasticity > 0.0 && self.state == SynapseState::Active {
self.state = SynapseState::Potentiating;
self.strength += factor * self.plasticity;
if self.strength > 1.0 {
self.strength = 1.0;
}
self.plasticity *= 0.995;
self.state = SynapseState::Active;
}
}
pub fn weaken(&mut self, factor: f64) {
if self.plasticity > 0.0 && self.state == SynapseState::Active {
self.state = SynapseState::Depressing;
self.strength -= factor * self.plasticity;
if self.strength < 0.0 {
self.strength = 0.0;
}
self.plasticity *= 0.995;
if self.strength < 0.1 {
self.state = SynapseState::Closed;
} else {
self.state = SynapseState::Active;
}
}
}
fn calculate_transmission_delay(&self, message: &NeuralMessage) -> u64 {
let base_delay = match message.neurotransmitter {
NeurotransmitterType::Glutamate => 500, NeurotransmitterType::GABA => 1_000, NeurotransmitterType::Dopamine => 2_000, NeurotransmitterType::Serotonin => 5_000, NeurotransmitterType::Acetylcholine => 1_500, NeurotransmitterType::Norepinephrine => 2_500, NeurotransmitterType::Oxytocin => 10_000, NeurotransmitterType::Endorphin => 15_000, NeurotransmitterType::Histamine => 3_000, NeurotransmitterType::Adenosine => 8_000, };
let strength_factor = 2.0 - self.strength;
let adjusted_delay = (base_delay as f64 * strength_factor) as u64;
let urgency_factor = 2.0 - message.urgency;
let final_delay = (adjusted_delay as f64 * urgency_factor) as u64;
let jitter = rand::random::<u64>() % 100; final_delay + jitter
}
fn validate_message(&self, message: &NeuralMessage) -> bool {
if message.sender_id != self.presynaptic_id {
return false;
}
if message.receiver_id != self.postsynaptic_id {
return false;
}
let current_time = SystemTime::now().duration_since(UNIX_EPOCH).unwrap().as_nanos() as u64;
if current_time - message.timestamp > (message.ttl * 1_000_000_000) {
return false; }
if message.payload.len() > 1_048_576 { return false;
}
true
}
async fn simulate_network_transmission(&self, message: &NeuralMessage) -> Result<(), SynapseError> {
let network_delay = if message.routing.direct {
100 } else {
message.routing.hop_count as u64 * 500 };
if network_delay > 0 {
tokio::time::sleep(tokio::time::Duration::from_nanos(network_delay)).await;
}
if rand::random::<f64>() < 0.001 { return Err(SynapseError::NetworkError("Simulated network failure".to_string()));
}
Ok(())
}
pub fn update_latency_stats(&mut self, latency: u64) {
self.latency_stats.add_measurement(latency);
}
pub fn get_performance_metrics(&self) -> SynapsePerformance {
SynapsePerformance {
connection_id: self.connection_id.clone(),
strength: self.strength,
success_rate: self.success_rate,
total_messages: self.total_messages,
avg_latency: self.latency_stats.avg_latency,
min_latency: self.latency_stats.min_latency,
max_latency: self.latency_stats.max_latency,
plasticity: self.plasticity,
state: self.state.clone(),
uptime_seconds: SystemTime::now()
.duration_since(UNIX_EPOCH)
.unwrap()
.as_secs() - self.created_at,
}
}
}
impl LatencyStats {
pub fn new() -> Self {
LatencyStats {
min_latency: u64::MAX,
max_latency: 0,
avg_latency: 0,
last_latency: 0,
measurement_count: 0,
variance: 0.0,
}
}
pub fn add_measurement(&mut self, latency: u64) {
self.last_latency = latency;
self.measurement_count += 1;
if latency < self.min_latency {
self.min_latency = latency;
}
if latency > self.max_latency {
self.max_latency = latency;
}
self.avg_latency = ((self.avg_latency * (self.measurement_count - 1)) + latency) / self.measurement_count;
let diff = latency as f64 - self.avg_latency as f64;
self.variance = ((self.variance * (self.measurement_count - 1) as f64) + (diff * diff)) / self.measurement_count as f64;
}
}
pub struct NeuralProtocol {
pub organism_id: String,
pub synapses: HashMap<String, Synapse>,
pub message_queue: HashMap<String, Vec<NeuralMessage>>,
pub neural_activity: f64,
pub consciousness_level: f64,
pub message_sender: mpsc::UnboundedSender<NeuralMessage>,
pub message_receiver: mpsc::UnboundedReceiver<NeuralMessage>,
pub stats: ProtocolStats,
}
#[derive(Debug, Clone, Default)]
pub struct ProtocolStats {
pub messages_sent: u64,
pub messages_received: u64,
pub transmission_failures: u64,
pub avg_processing_time: u64,
pub uptime_seconds: u64,
pub peak_neural_activity: f64,
pub peak_consciousness: f64,
}
impl NeuralProtocol {
pub fn new(organism_id: String) -> Self {
let (sender, receiver) = mpsc::unbounded_channel();
NeuralProtocol {
organism_id,
synapses: HashMap::new(),
message_queue: HashMap::new(),
neural_activity: 0.1,
consciousness_level: 0.0,
message_sender: sender,
message_receiver: receiver,
stats: ProtocolStats::default(),
}
}
pub async fn establish_synapse(
&mut self,
target_id: &str,
neurotransmitter: NeurotransmitterType
) -> Result<String, SynapseError> {
if self.synapses.len() >= crate::MAX_SYNAPSES_PER_ORGANISM {
return Err(SynapseError::TooManySynapses);
}
let mut synapse = Synapse::establish(&self.organism_id, target_id)?;
synapse.neurotransmitter_type = neurotransmitter;
synapse.state = SynapseState::Active;
let connection_id = synapse.connection_id.clone();
self.synapses.insert(target_id.to_string(), synapse);
self.neural_activity += 0.05;
if self.neural_activity > 1.0 {
self.neural_activity = 1.0;
}
if self.neural_activity > self.stats.peak_neural_activity {
self.stats.peak_neural_activity = self.neural_activity;
}
tracing::info!(
"Synapse established: {} -> {} ({})",
self.organism_id[..8].to_string(),
target_id[..8].to_string(),
connection_id[..16].to_string()
);
Ok(connection_id)
}
pub async fn send_neural_message(
&mut self,
target_id: &str,
message_type: MessageType,
payload: Vec<u8>
) -> Result<(), SynapseError> {
if let Some(synapse) = self.synapses.get(target_id) {
let message = NeuralMessage {
message_id: Uuid::new_v4().to_string(),
sender_id: self.organism_id.clone(),
receiver_id: target_id.to_string(),
message_type,
neurotransmitter: synapse.neurotransmitter_type.clone(),
payload,
timestamp: SystemTime::now().duration_since(UNIX_EPOCH).unwrap().as_nanos() as u64,
ttl: 300, signature: Vec::new(), urgency: 0.5,
priority: 128,
routing: RoutingInfo {
direct: true,
hop_count: 1,
path: vec![self.organism_id.clone(), target_id.to_string()],
qos: QualityOfService {
max_latency: crate::TARGET_NEURAL_LATENCY_NS,
reliability: 0.99,
bandwidth: 1_000_000, encryption: true,
},
},
};
let transmission_start = SystemTime::now();
synapse.transmit(message).await?;
let transmission_time = transmission_start.elapsed().unwrap().as_nanos() as u64;
self.stats.messages_sent += 1;
self.stats.avg_processing_time =
((self.stats.avg_processing_time * (self.stats.messages_sent - 1)) + transmission_time)
/ self.stats.messages_sent;
Ok(())
} else {
Err(SynapseError::SynapseNotFound(target_id.to_string()))
}
}
pub async fn process_messages(&mut self) -> Result<Vec<NeuralMessage>, SynapseError> {
let mut processed_messages = Vec::new();
while let Ok(message) = self.message_receiver.try_recv() {
let processing_start = SystemTime::now();
self.update_consciousness(&message);
processed_messages.push(message);
let processing_time = processing_start.elapsed().unwrap().as_nanos() as u64;
self.stats.messages_received += 1;
self.stats.avg_processing_time =
((self.stats.avg_processing_time * self.stats.messages_received) + processing_time)
/ (self.stats.messages_received + 1);
}
Ok(processed_messages)
}
fn update_consciousness(&mut self, message: &NeuralMessage) {
let consciousness_boost = match message.message_type {
MessageType::Consciousness => 0.1,
MessageType::Learning => 0.05,
MessageType::Collective => 0.03,
MessageType::Emotion => 0.04,
MessageType::Social => 0.02,
_ => 0.01,
};
self.consciousness_level += consciousness_boost;
self.neural_activity += consciousness_boost * 0.5;
self.consciousness_level *= 0.999;
self.neural_activity *= 0.995;
if self.consciousness_level > 1.0 {
self.consciousness_level = 1.0;
}
if self.neural_activity > 1.0 {
self.neural_activity = 1.0;
}
if self.consciousness_level > self.stats.peak_consciousness {
self.stats.peak_consciousness = self.consciousness_level;
}
if self.neural_activity > self.stats.peak_neural_activity {
self.stats.peak_neural_activity = self.neural_activity;
}
}
pub fn get_neural_status(&self) -> NeuralStatus {
NeuralStatus {
organism_id: self.organism_id.clone(),
synapse_count: self.synapses.len(),
neural_activity: self.neural_activity,
consciousness_level: self.consciousness_level,
message_queue_size: self.message_queue.values().map(|v| v.len()).sum(),
average_synapse_strength: if self.synapses.is_empty() {
0.0
} else {
self.synapses.values().map(|s| s.strength).sum::<f64>() / self.synapses.len() as f64
},
total_messages_sent: self.stats.messages_sent,
total_messages_received: self.stats.messages_received,
avg_processing_time: self.stats.avg_processing_time,
}
}
pub fn cleanup_synapses(&mut self) -> usize {
let initial_count = self.synapses.len();
self.synapses.retain(|_, synapse| {
synapse.state != SynapseState::Closed
});
initial_count - self.synapses.len()
}
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct NeuralStatus {
pub organism_id: String,
pub synapse_count: usize,
pub neural_activity: f64,
pub consciousness_level: f64,
pub message_queue_size: usize,
pub average_synapse_strength: f64,
pub total_messages_sent: u64,
pub total_messages_received: u64,
pub avg_processing_time: u64,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct SynapsePerformance {
pub connection_id: String,
pub strength: f64,
pub success_rate: f64,
pub total_messages: u64,
pub avg_latency: u64,
pub min_latency: u64,
pub max_latency: u64,
pub plasticity: f64,
pub state: SynapseState,
pub uptime_seconds: u64,
}
#[derive(Debug, thiserror::Error)]
pub enum SynapseError {
#[error("Synapse not found: {0}")]
SynapseNotFound(String),
#[error("Invalid message format")]
InvalidMessage,
#[error("Transmission failed: {0}")]
TransmissionFailed(String),
#[error("Connection refused")]
ConnectionRefused,
#[error("Synapse inactive")]
SynapseInactive,
#[error("Too many synapses")]
TooManySynapses,
#[error("Network error: {0}")]
NetworkError(String),
#[error("Message expired")]
MessageExpired,
#[error("Message too large")]
MessageTooLarge,
#[error("Neurotransmitter mismatch")]
NeurotransmitterMismatch,
#[error("Insufficient strength")]
InsufficientStrength,
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_synapse_creation() {
let synapse = Synapse::establish("tron_1", "tron_2").unwrap();
assert!(!synapse.connection_id.is_empty());
assert_eq!(synapse.presynaptic_id, "tron_1");
assert_eq!(synapse.postsynaptic_id, "tron_2");
assert_eq!(synapse.strength, 0.5);
assert_eq!(synapse.state, SynapseState::Establishing);
}
#[tokio::test]
async fn test_neural_message_transmission() {
let mut synapse = Synapse::establish("tron_1", "tron_2").unwrap();
synapse.state = SynapseState::Active;
let message = NeuralMessage {
message_id: Uuid::new_v4().to_string(),
sender_id: "tron_1".to_string(),
receiver_id: "tron_2".to_string(),
message_type: MessageType::Consciousness,
neurotransmitter: NeurotransmitterType::Glutamate,
payload: b"Hello, digital mind!".to_vec(),
timestamp: SystemTime::now().duration_since(UNIX_EPOCH).unwrap().as_nanos() as u64,
ttl: 300,
signature: Vec::new(),
urgency: 0.5,
priority: 128,
routing: RoutingInfo {
direct: true,
hop_count: 1,
path: vec!["tron_1".to_string(), "tron_2".to_string()],
qos: QualityOfService {
max_latency: 10_000,
reliability: 0.99,
bandwidth: 1_000_000,
encryption: true,
},
},
};
let result = synapse.transmit(message).await;
assert!(result.is_ok());
}
#[test]
fn test_synapse_strengthening() {
let mut synapse = Synapse::establish("tron_1", "tron_2").unwrap();
synapse.state = SynapseState::Active;
let initial_strength = synapse.strength;
synapse.strengthen(0.1);
assert!(synapse.strength > initial_strength);
assert!(synapse.plasticity < 0.8); }
#[test]
fn test_synapse_weakening() {
let mut synapse = Synapse::establish("tron_1", "tron_2").unwrap();
synapse.state = SynapseState::Active;
let initial_strength = synapse.strength;
synapse.weaken(0.1);
assert!(synapse.strength < initial_strength);
}
#[tokio::test]
async fn test_neural_protocol() {
let mut protocol = NeuralProtocol::new("tron_1".to_string());
let synapse_id = protocol.establish_synapse(
"tron_2",
NeurotransmitterType::Dopamine
).await.unwrap();
assert!(!synapse_id.is_empty());
assert!(protocol.synapses.contains_key("tron_2"));
assert!(protocol.neural_activity > 0.1);
let result = protocol.send_neural_message(
"tron_2",
MessageType::Consciousness,
b"Neural test message".to_vec()
).await;
assert!(result.is_ok());
assert_eq!(protocol.stats.messages_sent, 1);
}
#[test]
fn test_latency_stats() {
let mut stats = LatencyStats::new();
stats.add_measurement(1000);
stats.add_measurement(2000);
stats.add_measurement(1500);
assert_eq!(stats.measurement_count, 3);
assert_eq!(stats.min_latency, 1000);
assert_eq!(stats.max_latency, 2000);
assert_eq!(stats.avg_latency, 1500);
}
#[test]
fn test_transmission_delay_calculation() {
let synapse = Synapse::establish("tron_1", "tron_2").unwrap();
let message = NeuralMessage {
message_id: Uuid::new_v4().to_string(),
sender_id: "tron_1".to_string(),
receiver_id: "tron_2".to_string(),
message_type: MessageType::Consciousness,
neurotransmitter: NeurotransmitterType::Glutamate,
payload: Vec::new(),
timestamp: 0,
ttl: 300,
signature: Vec::new(),
urgency: 1.0, priority: 255,
routing: RoutingInfo {
direct: true,
hop_count: 1,
path: vec!["tron_1".to_string(), "tron_2".to_string()],
qos: QualityOfService {
max_latency: 10_000,
reliability: 0.99,
bandwidth: 1_000_000,
encryption: true,
},
},
};
let delay = synapse.calculate_transmission_delay(&message);
assert!(delay < 1000); }
#[test]
fn test_message_validation() {
let synapse = Synapse::establish("tron_1", "tron_2").unwrap();
let valid_message = NeuralMessage {
message_id: Uuid::new_v4().to_string(),
sender_id: "tron_1".to_string(),
receiver_id: "tron_2".to_string(),
message_type: MessageType::Consciousness,
neurotransmitter: NeurotransmitterType::Glutamate,
payload: b"test".to_vec(),
timestamp: SystemTime::now().duration_since(UNIX_EPOCH).unwrap().as_nanos() as u64,
ttl: 300,
signature: Vec::new(),
urgency: 0.5,
priority: 128,
routing: RoutingInfo {
direct: true,
hop_count: 1,
path: vec!["tron_1".to_string(), "tron_2".to_string()],
qos: QualityOfService {
max_latency: 10_000,
reliability: 0.99,
bandwidth: 1_000_000,
encryption: true,
},
},
};
assert!(synapse.validate_message(&valid_message));
let mut invalid_message = valid_message.clone();
invalid_message.sender_id = "wrong_sender".to_string();
assert!(!synapse.validate_message(&invalid_message));
}
#[tokio::test]
async fn test_neural_protocol_cleanup() {
let mut protocol = NeuralProtocol::new("tron_1".to_string());
protocol.establish_synapse("tron_2", NeurotransmitterType::Glutamate).await.unwrap();
protocol.establish_synapse("tron_3", NeurotransmitterType::GABA).await.unwrap();
if let Some(synapse) = protocol.synapses.get_mut("tron_2") {
synapse.state = SynapseState::Closed;
}
let cleaned = protocol.cleanup_synapses();
assert_eq!(cleaned, 1);
assert_eq!(protocol.synapses.len(), 1);
assert!(protocol.synapses.contains_key("tron_3"));
}
}