// 🌌 [BioPhys 6.0 μ‚΄μ•„μžˆλŠ” 유기적 μƒνƒœκ³„ μ§„ν™” μ—”μ§„] (src/ecosystem_evolution.rs) // 1. μ˜λ„μ  λΉ„νŠΈ ν”Œλ¦½ λŒμ—°λ³€μ΄ (Mutation Injector) // 2. μ„œλΈŒλ£¨ν‹΄ λ¬΄μ˜μ‹ λˆ„μˆ˜ λ―Ήμ„œ (Subconscious Bleed Mixer) // 3. μ—΄μ„± μœ μ „μž 1-Bit 포자 μ••μΆ• 및 비상 λ°œμ•„κΈ° (Spore Archiver & Germinator) use std::collections::HashMap; use std::time::Instant; /// 🧬 [1. μ˜λ„μ  λΉ„νŠΈ ν”Œλ¦½ λŒμ—°λ³€μ΄ 인젝터] pub struct MutationInjector { pub mutation_rate: f32, // λŒμ—°λ³€μ΄ λ°œμƒ ν™•λ₯  (κΈ°λ³Έ 0.001 = 0.1%) pub total_mutations_applied: usize, pub beneficial_mutations: usize, } impl MutationInjector { pub fn new(mutation_rate: f32) -> Self { MutationInjector { mutation_rate, total_mutations_applied: 0, beneficial_mutations: 0, } } /// 2-Bit νŒ¨ν‚Ήλœ κ°€μ€‘μΉ˜ 배열에 μ‹€μ œ 우주 방사선(λΉ„νŠΈ ν”Œλ¦½)을 κ°€ν•˜κ³  적합도(Fitness) 평가 pub fn inject_cosmic_mutation( &mut self, packed_weights: &mut [u32], baseline_energy: f32, eval_fn: impl Fn(&[u32]) -> f32, ) -> bool { let len = packed_weights.len(); if len == 0 { return false; } let mut mutated_indices = Vec::new(); let mut old_values = Vec::new(); // 1. ν™•λ₯ μ  λΉ„νŠΈ ν”Œλ¦½ μˆ˜ν–‰ for i in 0..len { let pseudo_rand = ((i as u32 * 1103515245 + 12345) & 0x7FFFFFFF) as f32 / 2147483648.0; if pseudo_rand < self.mutation_rate { let bit_shift = (i % 16) * 2; let flip_mask = 0b11 << bit_shift; old_values.push((i, packed_weights[i])); packed_weights[i] ^= flip_mask; // 2-Bit μœ„μƒ 전이 mutated_indices.push(i); self.total_mutations_applied += 1; } } if mutated_indices.is_empty() { return false; } // 2. 적합도(Fitness) 평가: μƒˆλ‘œμš΄ 계면 μ—λ„ˆμ§€κ°€ 카였슀 졜적점(0.50~0.55)에 더 κ°€κΉŒμ›Œμ‘ŒλŠ”μ§€ 검증 let new_energy = eval_fn(packed_weights); let old_diff = (baseline_energy - 0.52).abs(); let new_diff = (new_energy - 0.52).abs(); if new_diff <= old_diff { // μœ μ΅ν•œ λŒμ—°λ³€μ΄: 영ꡬ 보쑴(보쑴) self.beneficial_mutations += 1; true } else { // ν•΄λ‘œμš΄ λŒμ—°λ³€μ΄: μžμ—° λ„νƒœ (원볡 Rollback) for (idx, old_val) in old_values { packed_weights[idx] = old_val; } false } } } /// 🌊 [2. μ„œλΈŒλ£¨ν‹΄ λ¬΄μ˜μ‹ λˆ„μˆ˜ λ―Ήμ„œ (Subconscious Bleed Mixer)] pub struct SubconsciousMixer { pub residual_wave: Vec, // 이전 μ„Έμ…˜μ˜ λ¬΄μ˜μ‹μ  μž”μ—¬ 진동 νŒŒν˜• pub bleed_ratio: f32, // λˆ„μˆ˜ λΉ„μœ¨ (κΈ°λ³Έ 0.03 = 3%) pub session_count: usize, } impl SubconsciousMixer { pub fn new(dim: usize, bleed_ratio: f32) -> Self { SubconsciousMixer { residual_wave: vec![0.0; dim], bleed_ratio, session_count: 0, } } /// 이전 μ„Έμ…˜μ˜ 생각(잠재 μƒνƒœ)을 ν˜„μž¬ 연산에 3% λ―Έμ„Έ κ²°ν•©ν•˜μ—¬ 창의적 영감 μœ λ„ pub fn blend_subconscious(&mut self, current_hidden: &mut [f32]) { self.session_count += 1; let len = current_hidden.len().min(self.residual_wave.len()); for i in 0..len { // λ¬΄μ˜μ‹ λˆ„μˆ˜: ν˜„μž¬ 생각 + (이전 μž”μ—¬ κΈ°μ–΅ * 3%) let inspiration = self.residual_wave[i] * self.bleed_ratio; current_hidden[i] += inspiration; // ν˜„μž¬ μƒκ°μ˜ 20%λ₯Ό λ‹€μŒ μ„Έμ…˜μ˜ λ¬΄μ˜μ‹ μž”μ—¬ νŒŒν˜•μœΌλ‘œ μ €μž₯ (감쇠 μ €μž₯) self.residual_wave[i] = (self.residual_wave[i] * 0.7) + (current_hidden[i] * 0.2); } } } /// πŸ„ [3. μ—΄μ„± μœ μ „μž 1-Bit 포자 μ••μΆ• 및 비상 λ°œμ•„κΈ°] pub struct SporeArchiver { pub spores: HashMap>, // 1-Bit 극단 μ••μΆ•λœ 씨앗 μ €μž₯μ†Œ pub total_archived: usize, pub total_germinated: usize, } impl SporeArchiver { pub fn new() -> Self { SporeArchiver { spores: HashMap::new(), total_archived: 0, total_germinated: 0, } } /// λΉ„ν™œμ„±/μ—΄μ„± κ°€μ€‘μΉ˜ ν…μ„œλ₯Ό 1-Bit 포자(Spore) ν˜•νƒœλ‘œ μ••μΆ• μ €μž₯ (8λ°° μΆ”κ°€ μ••μΆ•) pub fn archive_to_spore(&mut self, gene_name: &str, packed_2bit: &[u32]) { let mut spore_bytes = Vec::with_capacity(packed_2bit.len() / 2); for chunk in packed_2bit.chunks(8) { let mut byte: u8 = 0; for (bit_idx, &word) in chunk.iter().enumerate() { // μƒμœ„ ν₯λΆ„μ„± μœ„μƒ(0b11, 0b01)만 1둜 μΆ”μΆœν•˜μ—¬ 1-Bit둜 극단 μ••μΆ• let is_active = (word & 0x55555555).count_ones() > 8; if is_active { byte |= 1 << bit_idx; } } spore_bytes.push(byte); } self.spores.insert(gene_name.to_string(), spore_bytes); self.total_archived += 1; } /// λͺ¨λ“œ λΆ•κ΄΄(Mode Collapse) λ˜λŠ” λ―Έμ§€μ˜ ν”„λ‘¬ν”„νŠΈ λ°œμƒ μ‹œ 1-Bit 포자λ₯Ό 2-Bit κ°€μ€‘μΉ˜λ‘œ 즉각 λ°œμ•„(Re-activate) pub fn germinate_spore(&mut self, gene_name: &str, output_len: usize) -> Option> { if let Some(spore_bytes) = self.spores.get(gene_name) { self.total_germinated += 1; let mut recovered_2bit = Vec::with_capacity(output_len); for &b in spore_bytes { for bit_idx in 0..8 { if recovered_2bit.len() >= output_len { break; } let bit = (b >> bit_idx) & 1; let reconstructed_word = if bit == 1 { 0x55555555 } else { 0x00000000 }; recovered_2bit.push(reconstructed_word); } } while recovered_2bit.len() < output_len { recovered_2bit.push(0x00000000); } Some(recovered_2bit) } else { None } } }