File size: 3,465 Bytes
be99550 | 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 | use rand::Rng;
/// π BioPhys 6.0: νμ± μνκ³ μ§ν μμ§ (The Living Planet)
// ---------------------------------------------------------
// 1. π λμ°λ³μ΄ λ°μκΈ° (Mutation Injector)
// ---------------------------------------------------------
pub struct MutationInjector;
impl MutationInjector {
/// λ°©μ¬μ λ 벨(νλ₯ )μ λ°λΌ μλμ μΌλ‘ λΉνΈλ₯Ό λ€μ§μ΄ λμ°λ³μ΄(μλ‘μ΄ μ°½μμ±)λ₯Ό μ°½μ‘°ν©λλ€.
pub fn inject_radiation(weights: &mut [u32], radiation_level: f64) {
let mut rng = rand::thread_rng();
let mutation_chance = (radiation_level * 1000000.0) as u32; // λ°±λ§λΆμ¨
for w in weights.iter_mut() {
if rng.gen_ratio(mutation_chance, 1_000_000) {
// μμμ 1λΉνΈλ₯Ό λ€μ§μ (Bit Flip)
let flip_mask = 1 << rng.gen_range(0..32);
*w ^= flip_mask;
}
}
}
}
// ---------------------------------------------------------
// 2. π§ 무μμμ μκ° λμ (Subconscious Bleed)
// ---------------------------------------------------------
pub struct SubconsciousMemory {
pub kv_cache_pool: Vec<f32>, // μ΄μ μΈμ
λ€μ λ¬Έλ§₯ μ°κΊΌκΈ°
}
impl SubconsciousMemory {
pub fn new(size: usize) -> Self {
Self { kv_cache_pool: vec![0.0; size] }
}
/// μ΄μ λνμ λ¬Έλ§₯μ μμ ν μ§μ°μ§ μκ³ 1~5% νλ₯ λ‘ νμ¬ μμ
μ λμμν΅λλ€.
pub fn bleed_into_current(&self, current_context: &mut [f32], bleed_rate: f32) {
for (curr, prev) in current_context.iter_mut().zip(self.kv_cache_pool.iter()) {
if rand::thread_rng().gen_bool(bleed_rate as f64) {
*curr = (*curr * 0.5) + (*prev * 0.5); // λ¬Έλ§₯ νΌν© (무μμμ μ΅ν©)
}
}
}
pub fn save_to_subconscious(&mut self, current_context: &[f32]) {
self.kv_cache_pool.copy_from_slice(current_context);
}
}
// ---------------------------------------------------------
// 3. π± μ΄μ± μ μ μ ν¬μ μμΆκΈ° (Spore Archiver)
// ---------------------------------------------------------
pub struct SporeArchiver;
impl SporeArchiver {
/// μ±λ₯μ΄ λ¨μ΄μ§λ κ°μ€μΉλ₯Ό μ£½μ΄μ§ μκ³ , 1-Bit 'μ¨μ(ν¬μ)' ννλ‘ κ·Ήν μμΆνμ¬ ν΄λ©΄μν΅λλ€.
pub fn hibernate_to_spore(weak_weights: &[u32]) -> Vec<u8> {
let mut spores = Vec::with_capacity(weak_weights.len() / 8);
let mut current_byte = 0u8;
for (i, &w) in weak_weights.iter().enumerate() {
// μ§λ μ€μ¬μ΄ 0λ³΄λ€ ν°μ§ μ¬λΆλ§ 1-Bitλ‘ λ¨κΉ
if w.count_ones() > 16 {
current_byte |= 1 << (i % 8);
}
if i % 8 == 7 {
spores.push(current_byte);
current_byte = 0;
}
}
spores
}
/// νκ²½μ΄ κΈλ³νμ λ, μ λ€μ΄ μλ ν¬μλ₯Ό λ€μ νμ± κ°μ€μΉλ‘ λ°μμν΅λλ€.
pub fn germinate_spore(spores: &[u8]) -> Vec<u32> {
let mut reactivated = Vec::with_capacity(spores.len() * 8);
for &byte in spores {
for bit in 0..8 {
if (byte & (1 << bit)) != 0 {
reactivated.push(0xFFFFFFFF); // μ΄μ± μ μ μμ λΆν (κ±°μΉ νν)
} else {
reactivated.push(0x00000000);
}
}
}
reactivated
}
}
|