File size: 8,145 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 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 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 | // π [BioPhys 6.0 곡μ Rust SDK: biophys_engine::sdk] (src/sdk.rs)
// μΈλΆ μ ν리μΌμ΄μ
(Tauri, Axum, CLI, Python FFI)μμ 1μ€ μ½λλ‘ 16GB μ§νμ AIλ₯Ό ꡬλνλ κ°λ°μ ν€νΈ
use std::time::Instant;
use crate::applied_rust2026_features::StreamingTokenIterator;
use crate::dynamic_knowledge_rag::{DynamicKnowledgeRAG, DynamicDocument};
use crate::dynamic_phase_interpreter::{DynamicScriptParser, PhaseVM};
use crate::ecosystem_evolution::{MutationInjector, SubconsciousMixer, SporeArchiver};
use crate::generative_llm::{GenerativeEngine, GenerativeContext};
use crate::native_bpe_tokenizer::NativeBpeTokenizer;
use crate::parallel_engine::LargeScaleEngine;
use crate::solar_moe_router::SolarMoERouter;
use crate::tachyon_speculative::TachyonSpeculativeEngine;
use crate::token_autoregressive_snn::SpikingTokenEngine;
/// βοΈ [SDK κ΅¬μ± μ€μ (Builder Pattern)]
#[derive(Debug, Clone)]
pub struct BioPhysConfig {
pub lattice_size: usize, // 물리 격μ ν¬κΈ° (κΈ°λ³Έ 256x256)
pub temperature: f32, // μμ± λ€μμ± μ¨λ (0.0 ~ 1.0)
pub mutation_rate: f32, // μ°μ£Ό λ°©μ¬μ λμ°λ³μ΄μ¨
pub subconscious_bleed: f32, // μΈμ
κ° λ¬΄μμ λμμ¨ (κΈ°λ³Έ 0.03 = 3%)
pub top_k_retrieval: usize, // RAG μΈμΆ λ¬Έμ μ
pub lookahead_speculative: usize, // νν€μ¨ ν¬κΈ°μ λμ½λ© λ―Έλ ν ν° μ
}
impl Default for BioPhysConfig {
fn default() -> Self {
BioPhysConfig {
lattice_size: 256,
temperature: 0.3,
mutation_rate: 0.002,
subconscious_bleed: 0.03,
top_k_retrieval: 2,
lookahead_speculative: 4,
}
}
}
/// π¦ [SDK μμ ν μλ΅ κ²°κ³Ό κ°μ²΄]
#[derive(Debug, Clone)]
pub struct BioPhysResponse {
pub text: String, // μμ±λ ν
μ€νΈ
pub latency_ms: f64, // μ΄ μ²λ¦¬ μ§μ° μκ° (ms)
pub routed_planet: String, // ν λΉλ νμκ³ 6νμ± MoE λ μ΄λ¦
pub planet_orbit_au: f32, // κΆ€λ λ°κ²½ (AU)
pub energy_level: f32, // 물리 격μ κ³λ©΄ μλμ§
pub is_verified: bool, // μ‘°μ κ³ μ μμ± νκ° μ°¨λ¨ ν΅κ³Ό μ¬λΆ
pub resonance_score: f32, // μ§νμ 곡λͺ
μΌμΉλ
pub retrieved_docs_count: usize,// μ°Έμ‘°λ RAG μ§μ 건μ
}
/// π [SDK μ€μκ° ν
λ λ©νΈλ¦¬ μν]
#[derive(Debug, Clone)]
pub struct BioPhysTelemetry {
pub active_nodes: usize, // 격μ νμ± λ
Έλ μ (65,536)
pub avg_energy: f32, // νκ· κ³λ©΄ μλμ§
pub total_queries_served: usize,// λμ μ²λ¦¬ μ§μ μ
pub mutations_applied: usize, // λμ λμ°λ³μ΄ μ§ν νμ
pub subconscious_sessions: usize,// λμ 무μμ μΈμ
μ
}
/// π [BioPhys 6.0 곡μ ν΄λΌμ΄μΈνΈ (Main SDK Entrypoint)]
pub struct BioPhysClient {
pub config: BioPhysConfig,
engine: LargeScaleEngine,
rag: DynamicKnowledgeRAG,
solar_router: SolarMoERouter,
mutator: MutationInjector,
subconscious_mixer: SubconsciousMixer,
spore_archiver: SporeArchiver,
tokenizer: NativeBpeTokenizer,
tachyon_engine: TachyonSpeculativeEngine,
spiking_token_engine: SpikingTokenEngine,
vm: PhaseVM,
total_queries: usize,
}
impl BioPhysClient {
/// 1. κΈ°λ³Έ μ€μ μΌλ‘ SDK ν΄λΌμ΄μΈνΈ μ΄κΈ°ν (1μ€ μμ)
pub fn new() -> Self {
Self::with_config(BioPhysConfig::default())
}
/// 2. 컀μ€ν
μ€μ μ μ μ©νμ¬ SDK ν΄λΌμ΄μΈνΈ μ΄κΈ°ν
pub fn with_config(config: BioPhysConfig) -> Self {
let engine = LargeScaleEngine::new(config.lattice_size);
let rag = DynamicKnowledgeRAG::new("knowledge_corpus");
let solar_router = SolarMoERouter::new();
let mutator = MutationInjector::new(config.mutation_rate);
let subconscious_mixer = SubconsciousMixer::new(config.lattice_size, config.subconscious_bleed);
let spore_archiver = SporeArchiver::new();
let tokenizer = NativeBpeTokenizer::new();
let tachyon_engine = TachyonSpeculativeEngine::new(config.lattice_size, config.lookahead_speculative);
let spiking_token_engine = SpikingTokenEngine::new(config.lattice_size);
let vm = PhaseVM::new();
BioPhysClient {
config,
engine,
rag,
solar_router,
mutator,
subconscious_mixer,
spore_archiver,
tokenizer,
tachyon_engine,
spiking_token_engine,
vm,
total_queries: 0,
}
}
/// 3. [λκΈ°μ μμ±ν μ§μμλ΅ (Generate API)]
/// μ§λ¬Έμ λ°μ νμκ³ λΌμ°ν
, RAG μΈμΆ, 무μμ νΌν©, μμ± νκ° κ²μ¦μ κ±°μΉ μ΅μ’
μλ΅ λ°ν
pub fn generate(&mut self, prompt: &str) -> BioPhysResponse {
let start_time = Instant::now();
self.total_queries += 1;
// 1. νμκ³ MoE λμ λΌμ°ν
let target_planet = self.solar_router.route_query(prompt);
let planet_name = target_planet.name.clone();
let planet_au = target_planet.orbit_au;
// 2. 물리 격μ λμν μ°μ° & 무μμ λμ λ―Ήμ±
let avg_e = self.engine.step_parallel();
let mut latent = vec![avg_e; self.config.lattice_size];
self.subconscious_mixer.blend_subconscious(&mut latent);
// 3. μ°μ£Ό λ°©μ¬μ λμ°λ³μ΄ μν
let mut weights_sample = vec![0x55555555; 50];
self.mutator.inject_cosmic_mutation(&mut weights_sample, avg_e, |_| 0.521);
// 4. λΈλν μ§νμ RAG μΈμΆ
let search_results = self.rag.search_documents(prompt, self.config.top_k_retrieval);
let retrieved_docs: Vec<DynamicDocument> = search_results.into_iter().map(|(d, _)| d.clone()).collect();
let docs_count = retrieved_docs.len();
// 5. μ§νμ μμ± λ° μ‘°μ κ³ μ μμ± νκ° κ²μ¦
let mode = GenerativeEngine::detect_mode(prompt);
let ctx = GenerativeContext {
prompt: prompt.to_string(),
retrieved_docs,
temperature: self.config.temperature,
mode,
};
let response_text = GenerativeEngine::generate_response(&ctx, avg_e);
let (is_verified, resonance) = self.solar_router.verify_binary_singularity(&response_text, "BioPhys 2-Bit μ§νμ 물리");
let latency_ms = start_time.elapsed().as_secs_f64() * 1000.0;
BioPhysResponse {
text: response_text,
latency_ms,
routed_planet: planet_name,
planet_orbit_au: planet_au,
energy_level: avg_e,
is_verified,
resonance_score: resonance,
retrieved_docs_count: docs_count,
}
}
/// 4. [μ€μκ° ν ν° μ€νΈλ¦¬λ° (Streaming API)]
/// ν ν°μ΄ μμ±λλ μκ° 1κ°μ© μ¦μ λ°©μΆνλ Zero-Allocation μ€νΈλ¦Ό λ°λ³΅μ μμ±
pub fn stream_tokens<'a>(&'a mut self, max_tokens: usize) -> StreamingTokenIterator<'a> {
StreamingTokenIterator::new(&self.spiking_token_engine.vocab, max_tokens, 0)
}
/// 5. [λμ λ°μ΄νΈμ½λ μ€ν¬λ¦½νΈ μ€ν (Interpreter API)]
/// μΈκ³΅μ§λ₯μ΄ μμ±ν μμμ ν
μ€νΈ μ€ν¬λ¦½νΈλ₯Ό μλλ°μ€ VMμμ μ¦μ ν΄μ μ€ν
pub fn execute_script(&mut self, script: &str) -> Result<Option<f32>, String> {
let bytecodes = DynamicScriptParser::compile_script(script);
self.vm.load_program(bytecodes);
self.vm.run()
}
/// 6. [μ€μκ° ν
λ λ©νΈλ¦¬ μ‘°ν (Telemetry API)]
pub fn get_telemetry(&mut self) -> BioPhysTelemetry {
let avg_e = self.engine.step_parallel();
BioPhysTelemetry {
active_nodes: self.config.lattice_size * self.config.lattice_size,
avg_energy: avg_e,
total_queries_served: self.total_queries,
mutations_applied: self.mutator.total_mutations_applied,
subconscious_sessions: self.subconscious_mixer.session_count,
}
}
}
|