File size: 4,834 Bytes
1bfe9c1 | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 | // ๐ [BioPhys 6.0] ์ฑ์๊ต์ธํฌ(Astrocyte) 3์ค ์๋
์ค ์ฅ๊ธฐ ๊ธฐ์ต ์กฐ์ ๊ธฐ (src/astrocyte_glia_controller.rs)
// ๋ฐ๋ฆฌ์ด(ms) ๋ด๋ฐ ์คํ์ดํฌ ์์ ์ด(sec) ๋จ์ ์นผ์ ํ๋(Caยฒโบ Waves)์ ์ค๋ฒ๋ ์ดํ์ฌ ์ฅ๊ธฐ ๊ฐํ(LTP) ๋ฐ ๋ง๊ฐ(LTD)์ ๋ฉํ ์กฐ์ ํ๋ ๊ธ๋ฆฌ์ ์ ๊ฒฝ๋ง ์์ง
use std::time::Instant;
/// ๐ฌ ์ฑ์๊ต์ธํฌ ์ค์ ํ๋ผ๋ฏธํฐ (Config)
#[derive(Clone, Debug)]
pub struct AstrocyteConfig {
pub num_astrocytes: usize,
pub calcium_decay_rate: f32, // ์นผ์ ๋๋ ์์ฐ ๊ฐ์ ์จ (๊ธฐ๋ณธ: 0.08)
pub gliotransmitter_potency: f32, // ๊ธ๋ฆฌ์คํธ๋์ค๋ฏธํฐ ๋ฐฉ์ถ ๊ฐ๋ (๊ธฐ๋ณธ: 1.45)
pub ltp_consolidation_threshold: f32, // ์ฅ๊ธฐ ๊ธฐ์ต ๊ณ ์ ์๊ณ์น (๊ธฐ๋ณธ: 0.65)
}
impl Default for AstrocyteConfig {
fn default() -> Self {
Self {
num_astrocytes: 64,
calcium_decay_rate: 0.08,
gliotransmitter_potency: 1.45,
ltp_consolidation_threshold: 0.65,
}
}
}
/// ๐ ๊ฐ๋ณ ์ฑ์๊ต์ธํฌ ๋๋ฉ์ธ ๋
ธ๋ (Astrocyte Micro-Domain)
#[derive(Clone, Debug)]
pub struct AstrocyteDomain {
pub domain_id: usize,
pub intracellular_calcium: f32, // ์ธํฌ๋ด ์นผ์ ์ด์จ ๋๋ [Caยฒโบ]
pub gliotransmitter_level: f32, // ๊ธ๋ฆฌ์คํธ๋์ค๋ฏธํฐ(D-Serine/ATP) ๋ถ๋น๋
pub consolidated_memory_strength: f32, // ์๊ตฌ ๋ณด์กด ๊ธฐ์ต ๊ฐ๋
}
impl AstrocyteDomain {
pub fn new(domain_id: usize) -> Self {
Self {
domain_id,
intracellular_calcium: 0.1,
gliotransmitter_level: 0.0,
consolidated_memory_strength: 1.0,
}
}
}
/// ๐๏ธ ์ฑ์๊ต์ธํฌ ๊ธ๋ฆฌ์ ๋ฉํ ์ปจํธ๋กค๋ฌ (Main Engine Struct)
pub struct AstrocyteGliaController {
pub config: AstrocyteConfig,
pub astrocytes: Vec<AstrocyteDomain>,
pub global_calcium_wave_energy: f32,
pub total_memories_consolidated: usize,
}
impl AstrocyteGliaController {
pub fn new(config: AstrocyteConfig) -> Self {
let astrocytes = (0..config.num_astrocytes)
.map(|i| AstrocyteDomain::new(i))
.collect();
Self {
config,
astrocytes,
global_calcium_wave_energy: 0.0,
total_memories_consolidated: 0,
}
}
/// [3์ค ์๋
์ค ์ํธ์์ฉ ๋ฐ ์นผ์ ํ๋ ์ ํ]: ๋ด๋ฐ ์คํ์ดํฌ๋ฅผ ๊ฐ์งํ๊ณ ๋ฉํ ๊ฐ์์ฑ ์กฐ์
pub fn modulate_synaptic_field(&mut self, spike_activities: &[f32]) -> (f32, u128) {
let t_start = Instant::now();
let num_astro = self.astrocytes.len();
let mut total_calcium = 0.0f32;
for (i, ast) in self.astrocytes.iter_mut().enumerate() {
// 1. ์๋
์ค ํ๋ ๊ฐ์ง ๋ฐ ์นผ์ ์ ์
(IP3-mediated Caยฒโบ release)
let sensory_idx = i % spike_activities.len().max(1);
let raw_activity = if !spike_activities.is_empty() { spike_activities[sensory_idx].abs() } else { 0.0 };
ast.intracellular_calcium += raw_activity * 0.25;
ast.intracellular_calcium *= 1.0 - self.config.calcium_decay_rate; // ์์ฐ ๊ฐ์
// 2. ๊ธ๋ฆฌ์คํธ๋์ค๋ฏธํฐ ๋ฐฉ์ถ
if ast.intracellular_calcium > 0.3 {
ast.gliotransmitter_level = (ast.intracellular_calcium * self.config.gliotransmitter_potency).min(2.0);
} else {
ast.gliotransmitter_level *= 0.9;
}
// 3. ์ฅ๊ธฐ ๊ธฐ์ต ๊ณ ์ (LTP Consolidation)
if ast.gliotransmitter_level > self.config.ltp_consolidation_threshold {
ast.consolidated_memory_strength += 0.05;
self.total_memories_consolidated += 1;
} else if ast.intracellular_calcium < 0.05 {
// ๋
ธ์ด์ฆ์ฑ ๋จ๊ธฐ ๊ธฐ์ต ์์ฐ ๋ง๊ฐ (LTD)
ast.consolidated_memory_strength = (ast.consolidated_memory_strength * 0.98).max(0.5);
}
total_calcium += ast.intracellular_calcium;
}
self.global_calcium_wave_energy = total_calcium / num_astro as f32;
let latency_us = t_start.elapsed().as_micros();
(self.global_calcium_wave_energy, latency_us)
}
/// [๊ธ๋ฆฌ์ ๋ฉํ-๊ฐ์์ฑ ๊ฐ์ค์น ์ค์ผ์ผ ๋ฐํ]
pub fn get_synaptic_gain(&self, domain_idx: usize) -> f32 {
let idx = domain_idx % self.astrocytes.len();
self.astrocytes[idx].consolidated_memory_strength
}
/// [์ฑ์๊ต์ธํฌ ์ํ ์์ฝ]
pub fn telemetry_summary(&self) -> String {
format!(
"๐งฌ [์ฑ์๊ต์ธํฌ ๊ธ๋ฆฌ์]: ๋๋ฉ์ธ {}๊ฐ | ๊ธ๋ก๋ฒ Caยฒโบ ํ๋ ์๋์ง: {:.4} | ๊ณ ์ ๋ ์ฅ๊ธฐ ๊ธฐ์ต ์: {}๊ฐ",
self.config.num_astrocytes, self.global_calcium_wave_energy, self.total_memories_consolidated
)
}
}
|