File size: 8,752 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
// 🌌 BioPhys v5.0 λ§ˆμŠ€ν„° λŒ€ν™”ν˜• μ•± + μžκ°€νšŒκ·€ 생성(LLM) + 동적 RAG 톡합 (src/bin/biophys_app.rs)
#[path="../dynamic_knowledge_rag.rs"] mod dynamic_knowledge_rag;
#[path="../generative_llm.rs"] mod generative_llm;
#[path="../korean_telemetry.rs"] mod korean_telemetry;
#[path="../parallel_engine.rs"] mod parallel_engine;

use std::io::{self, Write};
use std::time::Instant;
use dynamic_knowledge_rag::DynamicKnowledgeRAG;
use generative_llm::{GenerativeEngine, GenerativeContext, GenerationMode};
use parallel_engine::LargeScaleEngine;
use korean_telemetry::TelemetryReporter;

pub struct BioPhysMasterApp {
    rag: DynamicKnowledgeRAG,
    engine: LargeScaleEngine,
}

impl BioPhysMasterApp {
    pub fn new() -> Self {
        BioPhysMasterApp {
            rag: DynamicKnowledgeRAG::new("knowledge_corpus"),
            engine: LargeScaleEngine::new(256),
        }
    }

    pub fn render_header(&self) {
        println!("╔════════════════════════════════════════════════════════════════════════════╗");
        println!("β•‘                 🌌 BioPhys v5.0 Master Generative & RAG Desktop App        β•‘");
        println!("β•‘            Rust Native Autoregressive LLM + Dynamic Open-World Engine      β•‘");
        println!("╠════════════════════════════════════════════════════════════════════════════╣");
        println!("β•‘  [λͺ¨λ“œ 1] πŸ’» 자유 μ½”λ“œ 생성: '파이썬 μ›Ήμ„œλ²„ μ½”λ“œ 짜쀘', 'Rust 비동기 μ½”λ“œ'   β•‘");
        println!("β•‘  [λͺ¨λ“œ 2] πŸ–‹οΈ 창의 λ¬Έν•™ μ°½μž‘: 'μš°μ£Όμ™€ AI에 κ΄€ν•œ λ‹¨νŽΈ μ†Œμ„€ 써쀘'              β•‘");
        println!("β•‘  [λͺ¨λ“œ 3] 🌐 동적 지식 μ£Όμž…: 'ν•™μŠ΅ [λΆ„μ•Ό] | [제λͺ©] | [λ‚΄μš©]' (무컴파일 RAG) β•‘");
        println!("β•‘  [λͺ¨λ“œ 4] πŸ’¬ μ „ ν•™μ œ 질의  : μ§ˆλ¬Έμ„ 자유둭게 μž…λ ₯ μ‹œ μ‹€μ‹œκ°„ RAG 검색 & λ‹΅λ³€β•‘");
        println!("β•‘  β€’ μ’…λ£Œ 방법: 'q' λ˜λŠ” 'exit' μž…λ ₯                                         β•‘");
        println!("β•šβ•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•\n");
    }

    pub fn process_input(&mut self, prompt: &str) {
        let trimmed = prompt.trim();
        if trimmed.is_empty() { return; }

        let t_start = Instant::now();

        // 1. μ‹€μ‹œκ°„ 동적 지식 μ£Όμž… λͺ…λ Ήμ–΄ 처리 (ex: ν•™μŠ΅ μ–‘μžIT | QuantumX-9000 | μŠ€νŽ™μ„€λͺ…)
        if trimmed.starts_with("ν•™μŠ΅") {
            let rest = trimmed.trim_start_matches("ν•™μŠ΅").trim();
            let parts: Vec<&str> = rest.split('|').map(|s| s.trim()).collect();
            if parts.len() >= 3 {
                self.rag.ingest_new_knowledge(parts[0], parts[1], parts[2]);
                println!("β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€");
                println!("β”‚ βœ… [동적 지식 μ‹€μ‹œκ°„ μ£Όμž… μ™„λ£Œ! (컴파일 λΆˆν•„μš”)]");
                println!("β”‚    β”œβ”€ λΆ„μ•Ό: [{}]", parts[0]);
                println!("β”‚    β”œβ”€ 제λͺ©: γ€Š {} 》", parts[1]);
                println!("β”‚    └─ λ‚΄μš©: {}", parts[2]);
                println!("β”‚ πŸ“ μ½”νΌμŠ€ μ €μž₯: knowledge_corpus/world_knowledge_2026.jsonl (총 {}건 λ¬Έμ„œ)", self.rag.documents.len());
                println!("└────────────────────────────────────────────────────────────────────────────\n");
                return;
            } else {
                println!("πŸ’‘ [μ‚¬μš©λ²• μ•ˆλ‚΄]: ν•™μŠ΅ [λΆ„μ•Ό] | [제λͺ©] | [상세 λ‚΄μš©] ν˜•μ‹μœΌλ‘œ μž…λ ₯ν•˜μ„Έμš”.\n");
                return;
            }
        }

        // 2. λͺ¨λ“œ νŒλ³„ 및 μ‹œλ§¨ν‹± RAG 검색
        let mode = GenerativeEngine::detect_mode(trimmed);
        let search_results = self.rag.search_documents(trimmed, 3);
        let retrieved_docs = search_results.into_iter().map(|(d, _)| d.clone()).collect();

        // 3. 256x256 격자 동역학 μ—°μ‚°
        let prompt_energy: f32 = trimmed.bytes().map(|b| b as f32).sum::<f32>() / 1000.0;
        for b in self.engine.bedrock.iter_mut() {
            *b = (*b * 0.5) + (prompt_energy.sin() * 0.5);
        }
        let avg_e = self.engine.step_parallel();

        let temperature = match mode {
            GenerationMode::CodeGeneration => 0.2,
            GenerationMode::CreativeWriting => 0.8,
            GenerationMode::AnalyticalDialogue => 0.4,
        };

        let ctx = GenerativeContext {
            prompt: trimmed.to_string(),
            retrieved_docs,
            temperature,
            mode,
        };

        let generated_text = GenerativeEngine::generate_response(&ctx, avg_e);
        let dur = t_start.elapsed().as_secs_f64() * 1000.0;

        println!("β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€");
        println!("β”‚ πŸ—£οΈ [μ‚¬μš©μž μž…λ ₯]: \"{}\"", trimmed);
        println!("β”‚ 🎯 [νŒλ³„ λͺ¨λ“œ]: {:?}", mode);
        println!("β”‚");
        for line in generated_text.lines() {
            println!("β”‚   {}", line);
        }
        println!("β”‚");
        println!("β”‚ ⏱️ [μžκ°€νšŒκ·€ & RAG 생성 μ§€μ—°μ‹œκ°„]: {:.3} ms | 물리 계면 μ—λ„ˆμ§€: {:.4}", dur, avg_e);
        println!("└────────────────────────────────────────────────────────────────────────────\n");
    }

    pub fn render_2d_lattice(&mut self) {
        println!("β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€");
        println!("β”‚ ⚑ [256x256 λ³΅μž‘κ³„ 8λŒ€ μœ„μƒ 격자 μ‹€μ‹œκ°„ 2D λ§΅]");
        println!("β”‚    λ²”λ‘€: [β–²β–²]κ³Όν₯λΆ„  [β–²]ν₯λΆ„  [Β·]νœ΄μ§€κΈ°  [β–Ό]μ–΅μ œ  [β–Όβ–Ό]κ³Όμ–΅μ œ\nβ”‚");
        
        for y in 0..4 {
            print!("β”‚    ");
            for x in 0..18 {
                let state = self.engine.topsoil[y * 256 + x];
                let symbol = match state.value() {
                    v if v >= 1.5 => "β–²β–²",
                    v if v > 0.0 => "β–² ",
                    0.0 => "Β· ",
                    v if v <= -1.5 => "β–Όβ–Ό",
                    _ => "β–Ό ",
                };
                print!("{} ", symbol);
            }
            println!();
        }
        println!("β”‚\nβ”‚ βœ… 65,536개 μ‹œλƒ…μŠ€ μ „ λ…Έλ“œ 정상 ν‰ν˜• μ‹€μ‹œκ°„ 동기화 μ™„λ£Œ");
        println!("└────────────────────────────────────────────────────────────────────────────\n");
    }
}

fn main() {
    let mut app = BioPhysMasterApp::new();
    app.render_header();

    println!("============================================================");
    println!(" πŸ’¬ μ‹€μ‹œκ°„ λŒ€ν™”ν˜• ν”„λ‘¬ν”„νŠΈ ν™œμ„±ν™” (질문 / μ½”λ“œ μš”μ²­ / μ†Œμ„€ μš”μ²­ / 'ν•™μŠ΅' μž…λ ₯)");
    println!("============================================================\n");

    let stdin = io::stdin();
    let mut buffer = String::new();

    loop {
        print!("BioPhys πŸ’¬ μž…λ ₯ > ");
        let _ = io::stdout().flush();
        buffer.clear();

        if stdin.read_line(&mut buffer).is_err() { break; }
        let trimmed = buffer.trim();

        if trimmed == "q" || trimmed == "exit" || trimmed == "quit" {
            println!("\nπŸ‘‹ BioPhys 앱을 μ’…λ£Œν•©λ‹ˆλ‹€. μ—”ν„°λ₯Ό λˆ„λ₯΄λ©΄ 창이 λ‹«νž™λ‹ˆλ‹€.");
            let _ = stdin.read_line(&mut buffer);
            break;
        }

        if !trimmed.is_empty() {
            app.process_input(trimmed);
            app.render_2d_lattice();
        }
    }
}