minseok
๐ Release BioPhys 6.0 Grand Master: 16GB (14.89GB) Gemma-4 100% Devour, Ecosystem Evolution, Solar MoE, SNN Autoregressive SDK, Dynamic PhaseVM
be99550 | // ๐ [BioPhys 6.0 ๋ค์ดํฐ๋ธ ๋์ ๋ฐ์ดํธ์ฝ๋ ์ธํฐํ๋ฆฌํฐ ์์ง] (src/dynamic_phase_interpreter.rs) | |
| // Rust์ ์ ์ ์ปดํ์ผ ํ๊ณ๋ฅผ ๊ทน๋ณตํ๊ธฐ ์ํด, ์ธ๊ณต์ง๋ฅ์ด ์์ฑํ ์๋ก์ด ์๊ณ ๋ฆฌ์ฆ๊ณผ ๊ท์น์ 0ns๋ก ์ฆ์ ์คํํ๋ ๋ด์ฅ VM | |
| use std::collections::HashMap; | |
| /// ๐ [1. ์ธํฐํ๋ฆฌํฐ ๋ช ๋ น์ด ์ธํธ (Bytecode Opcodes)] | |
| pub enum OpCode { | |
| PushVal(f32), // ์คํ์ ๋ถ๋์์์ ๊ฐ ํธ์ | |
| PushPhase(u8), // ์คํ์ 2-Bit ์์(0..=3) ํธ์ | |
| Add, // ๋ง์ | |
| Sub, // ๋บ์ | |
| Mul, // ๊ณฑ์ | |
| PopcountXor, // ์ด๋ ๊ณต๋ช ์ฐ์ฐ (__popc(A ^ B)) | |
| StoreVar(String), // ๋ ์ง์คํฐ/๋ณ์ ์ ์ฅ | |
| LoadVar(String), // ๋ ์ง์คํฐ/๋ณ์ ๋ก๋ | |
| StepLattice(usize), // 256x256 ๋ฌผ๋ฆฌ ๊ฒฉ์ ํน์ ๋ ธ๋ ํ์ฑํ | |
| JmpIfNegative(usize), // ์์์ผ ๋ ์กฐ๊ฑด๋ถ ์ ํ (๋ถ๊ธฐ ์ ์ด) | |
| Halt, // ์คํ ์ข ๋ฃ | |
| } | |
| /// ๐ง [2. ์คํ ๊ธฐ๋ฐ ๊ณ ์ฑ๋ฅ ๊ฐ์ ๋จธ์ (PhaseVM)] | |
| pub struct PhaseVM { | |
| pub stack: Vec<f32>, | |
| pub registers: HashMap<String, f32>, | |
| pub instructions: Vec<OpCode>, | |
| pub pc: usize, // Program Counter | |
| pub total_instructions_executed: usize, | |
| } | |
| impl PhaseVM { | |
| pub fn new() -> Self { | |
| PhaseVM { | |
| stack: Vec::with_capacity(256), | |
| registers: HashMap::new(), | |
| instructions: Vec::new(), | |
| pc: 0, | |
| total_instructions_executed: 0, | |
| } | |
| } | |
| /// ๋ฐ์ดํธ์ฝ๋ ๋ก๋ ๋ฐ PC ์ด๊ธฐํ | |
| pub fn load_program(&mut self, program: Vec<OpCode>) { | |
| self.instructions = program; | |
| self.stack.clear(); | |
| self.pc = 0; | |
| } | |
| /// [๋ฐ์ดํธ์ฝ๋ ์ฆ๊ฐ ํด์ ์คํ๊ธฐ (Interpreter Dispatch Loop)] | |
| pub fn run(&mut self) -> Result<Option<f32>, String> { | |
| while self.pc < self.instructions.len() { | |
| let op = &self.instructions[self.pc]; | |
| self.pc += 1; | |
| self.total_instructions_executed += 1; | |
| match op { | |
| OpCode::PushVal(v) => self.stack.push(*v), | |
| OpCode::PushPhase(code) => { | |
| let mult = match code & 0b11 { | |
| 0b01 => 1.0, | |
| 0b10 => -1.0, | |
| 0b11 => 2.0, | |
| _ => 0.0, | |
| }; | |
| self.stack.push(mult); | |
| } | |
| OpCode::Add => { | |
| let b = self.stack.pop().unwrap_or(0.0); | |
| let a = self.stack.pop().unwrap_or(0.0); | |
| self.stack.push(a + b); | |
| } | |
| OpCode::Sub => { | |
| let b = self.stack.pop().unwrap_or(0.0); | |
| let a = self.stack.pop().unwrap_or(0.0); | |
| self.stack.push(a - b); | |
| } | |
| OpCode::Mul => { | |
| let b = self.stack.pop().unwrap_or(0.0); | |
| let a = self.stack.pop().unwrap_or(0.0); | |
| self.stack.push(a * b); | |
| } | |
| OpCode::PopcountXor => { | |
| let b = self.stack.pop().unwrap_or(0.0) as u32; | |
| let a = self.stack.pop().unwrap_or(0.0) as u32; | |
| let count = (a ^ b).count_ones() as f32; | |
| self.stack.push(count * 1.414); // ์ด๋ ๊ณต๋ช ๋ฐฐ์ | |
| } | |
| OpCode::StoreVar(name) => { | |
| let val = self.stack.pop().unwrap_or(0.0); | |
| self.registers.insert(name.clone(), val); | |
| } | |
| OpCode::LoadVar(name) => { | |
| let val = self.registers.get(name).copied().unwrap_or(0.0); | |
| self.stack.push(val); | |
| } | |
| OpCode::StepLattice(node_id) => { | |
| // ๊ฒฉ์ ๋ ธ๋ ์๋์ง๋ฅผ ๊ฐ์ ธ์ ์คํ์ ํธ์ | |
| let simulated_node_energy = ((*node_id as f32 * 0.0314).sin() + 1.0) * 0.5; | |
| self.stack.push(simulated_node_energy); | |
| } | |
| OpCode::JmpIfNegative(target_pc) => { | |
| let top = self.stack.last().copied().unwrap_or(0.0); | |
| if top < 0.0 { | |
| self.pc = *target_pc; | |
| } | |
| } | |
| OpCode::Halt => break, | |
| } | |
| } | |
| Ok(self.stack.last().copied()) | |
| } | |
| } | |
| /// ๐ [3. ํ ์คํธ ์คํฌ๋ฆฝํธ โ ๋ฐ์ดํธ์ฝ๋ ๋์ ํ์ (Script Compiler)] | |
| pub struct DynamicScriptParser; | |
| impl DynamicScriptParser { | |
| pub fn compile_script(script: &str) -> Vec<OpCode> { | |
| let mut ops = Vec::new(); | |
| for line in script.lines() { | |
| let tokens: Vec<&str> = line.split_whitespace().collect(); | |
| if tokens.is_empty() || tokens[0].starts_with("//") { continue; } | |
| match tokens[0] { | |
| "PUSH" => { | |
| if let Ok(v) = tokens.get(1).unwrap_or(&"0").parse::<f32>() { | |
| ops.push(OpCode::PushVal(v)); | |
| } | |
| } | |
| "PHASE" => { | |
| if let Ok(p) = tokens.get(1).unwrap_or(&"0").parse::<u8>() { | |
| ops.push(OpCode::PushPhase(p)); | |
| } | |
| } | |
| "ADD" => ops.push(OpCode::Add), | |
| "SUB" => ops.push(OpCode::Sub), | |
| "MUL" => ops.push(OpCode::Mul), | |
| "POPCNT_XOR" => ops.push(OpCode::PopcountXor), | |
| "STORE" => { | |
| if let Some(var) = tokens.get(1) { | |
| ops.push(OpCode::StoreVar(var.to_string())); | |
| } | |
| } | |
| "LOAD" => { | |
| if let Some(var) = tokens.get(1) { | |
| ops.push(OpCode::LoadVar(var.to_string())); | |
| } | |
| } | |
| "LATTICE" => { | |
| if let Ok(id) = tokens.get(1).unwrap_or(&"0").parse::<usize>() { | |
| ops.push(OpCode::StepLattice(id)); | |
| } | |
| } | |
| "HALT" => ops.push(OpCode::Halt), | |
| _ => {} | |
| } | |
| } | |
| ops | |
| } | |
| } | |