BioPhys-Neural-Agent / src /dynamic_phase_interpreter.rs
minseok
๐ŸŒŒ Release BioPhys 6.0 Grand Master: 16GB (14.89GB) Gemma-4 100% Devour, Ecosystem Evolution, Solar MoE, SNN Autoregressive SDK, Dynamic PhaseVM
be99550
Raw
History Blame Contribute Delete
6.39 kB
// ๐ŸŒŒ [BioPhys 6.0 ๋„ค์ดํ‹ฐ๋ธŒ ๋™์  ๋ฐ”์ดํŠธ์ฝ”๋“œ ์ธํ„ฐํ”„๋ฆฌํ„ฐ ์—”์ง„] (src/dynamic_phase_interpreter.rs)
// Rust์˜ ์ •์  ์ปดํŒŒ์ผ ํ•œ๊ณ„๋ฅผ ๊ทน๋ณตํ•˜๊ธฐ ์œ„ํ•ด, ์ธ๊ณต์ง€๋Šฅ์ด ์ƒ์„ฑํ•œ ์ƒˆ๋กœ์šด ์•Œ๊ณ ๋ฆฌ์ฆ˜๊ณผ ๊ทœ์น™์„ 0ns๋กœ ์ฆ‰์‹œ ์‹คํ–‰ํ•˜๋Š” ๋‚ด์žฅ VM
use std::collections::HashMap;
/// ๐Ÿ“œ [1. ์ธํ„ฐํ”„๋ฆฌํ„ฐ ๋ช…๋ น์–ด ์„ธํŠธ (Bytecode Opcodes)]
#[derive(Debug, Clone, PartialEq)]
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
}
}