code wiki / _hdl_build / nx_mt_ruen.nx
nx_mt_ruen.nx source
↩ module page · 104 lines · 5344 B
1// nx_mt_ruen.nx -- sovereign BIDIRECTIONAL RU<->EN phrase-table translator (the Belarus<->Texas pair). Token-
2// level, Cyrillic-aware tokenizer (UTF-8 multibyte bytes >=0x80 are token chars), NO float, deterministic.
3// dir 0 = EN->RU (output Cyrillic), dir 1 = RU->EN. Unknown tokens pass through verbatim (Cardinal 25). Lexicon
4// is edit-here R1 (R2 -> seg_store per language-pair, Cardinal 11); OPEN-DOMAIN neural MT + ASR are the
5// RESEARCHER long-poles (V-NMT-1/V-ASR-1) -- this is the gated, real, bidirectional R1. license_tier: ORIGINAL
6import "nx_syscalls.nx"
7
8func mr_lc(c: i64) -> i64 { if c >= 65 { if c <= 90 { return c + 32 } } return c }
9// token char = ASCII letter/digit OR any UTF-8 multibyte byte (Cyrillic)
10func mr_is_tok(c: i64) -> i64 {
11 if c >= 48 { if c <= 57 { return 1 } }
12 if c >= 65 { if c <= 90 { return 1 } }
13 if c >= 97 { if c <= 122 { return 1 } }
14 if c >= 128 { return 1 }
15 return 0
16}
17// ASCII case-insensitive token match (key = lowercase ASCII)
18func mr_eq_ci(src: *u8, s: i64, e: i64, key: *u8) -> i64 {
19 var i: i64 = s; var k: i64 = 0
20 while i < e {
21 if key[k] == (0 as u8) { return 0 }
22 if mr_lc(src[i] as i64) != (key[k] as i64) { return 0 }
23 i = i + 1; k = k + 1
24 }
25 if key[k] != (0 as u8) { return 0 }
26 return 1
27}
28// byte-exact token match (for Cyrillic keys)
29func mr_eq_exact(src: *u8, s: i64, e: i64, key: *u8) -> i64 {
30 var i: i64 = s; var k: i64 = 0
31 while i < e {
32 if key[k] == (0 as u8) { return 0 }
33 if (src[i] as i64) != (key[k] as i64) { return 0 }
34 i = i + 1; k = k + 1
35 }
36 if key[k] != (0 as u8) { return 0 }
37 return 1
38}
39// EN token -> RU (Cyrillic), or 0
40func mr_ru_for_en(src: *u8, s: i64, e: i64) -> *u8 {
41 if mr_eq_ci(src,s,e,"hello" as *u8)==1 { return "привет" as *u8 }
42 if mr_eq_ci(src,s,e,"hi" as *u8)==1 { return "привет" as *u8 }
43 if mr_eq_ci(src,s,e,"friend" as *u8)==1 { return "друг" as *u8 }
44 if mr_eq_ci(src,s,e,"thanks" as *u8)==1 { return "спасибо" as *u8 }
45 if mr_eq_ci(src,s,e,"thank" as *u8)==1 { return "спасибо" as *u8 }
46 if mr_eq_ci(src,s,e,"love" as *u8)==1 { return "любовь" as *u8 }
47 if mr_eq_ci(src,s,e,"yes" as *u8)==1 { return "да" as *u8 }
48 if mr_eq_ci(src,s,e,"no" as *u8)==1 { return "нет" as *u8 }
49 if mr_eq_ci(src,s,e,"you" as *u8)==1 { return "ты" as *u8 }
50 if mr_eq_ci(src,s,e,"good" as *u8)==1 { return "хорошо" as *u8 }
51 if mr_eq_ci(src,s,e,"bye" as *u8)==1 { return "пока" as *u8 }
52 if mr_eq_ci(src,s,e,"water" as *u8)==1 { return "вода" as *u8 }
53 if mr_eq_ci(src,s,e,"how" as *u8)==1 { return "как" as *u8 }
54 if mr_eq_ci(src,s,e,"texas" as *u8)==1 { return "техас" as *u8 }
55 if mr_eq_ci(src,s,e,"boy" as *u8)==1 { return "мальчик" as *u8 }
56 if mr_eq_ci(src,s,e,"girl" as *u8)==1 { return "девочка" as *u8 }
57 return 0 as *u8
58}
59// RU token (Cyrillic) -> EN, or 0
60func mr_en_for_ru(src: *u8, s: i64, e: i64) -> *u8 {
61 if mr_eq_exact(src,s,e,"привет" as *u8)==1 { return "hello" as *u8 }
62 if mr_eq_exact(src,s,e,"друг" as *u8)==1 { return "friend" as *u8 }
63 if mr_eq_exact(src,s,e,"спасибо" as *u8)==1 { return "thanks" as *u8 }
64 if mr_eq_exact(src,s,e,"любовь" as *u8)==1 { return "love" as *u8 }
65 if mr_eq_exact(src,s,e,"да" as *u8)==1 { return "yes" as *u8 }
66 if mr_eq_exact(src,s,e,"нет" as *u8)==1 { return "no" as *u8 }
67 if mr_eq_exact(src,s,e,"ты" as *u8)==1 { return "you" as *u8 }
68 if mr_eq_exact(src,s,e,"хорошо" as *u8)==1 { return "good" as *u8 }
69 if mr_eq_exact(src,s,e,"пока" as *u8)==1 { return "bye" as *u8 }
70 if mr_eq_exact(src,s,e,"вода" as *u8)==1 { return "water" as *u8 }
71 if mr_eq_exact(src,s,e,"как" as *u8)==1 { return "how" as *u8 }
72 if mr_eq_exact(src,s,e,"техас" as *u8)==1 { return "texas" as *u8 }
73 if mr_eq_exact(src,s,e,"мальчик" as *u8)==1 { return "boy" as *u8 }
74 if mr_eq_exact(src,s,e,"девочка" as *u8)==1 { return "girl" as *u8 }
75 return 0 as *u8
76}
77func mr_app(dst: *u8, pos: *i64, cap: i64, s: *u8) -> i64 {
78 var i: i64 = 0
79 while s[i] != (0 as u8) { let p: i64 = *pos; if p < cap { dst[p]=s[i]; *pos=p+1 } i=i+1 }
80 return 0
81}
82func mr_appb(dst: *u8, pos: *i64, cap: i64, b: i64) -> i64 { let p: i64 = *pos; if p < cap { dst[p]=b as u8; *pos=p+1 } return 0 }
83
84// dir: 0 = EN->RU, 1 = RU->EN. returns dst length.
85func nx_ruen_translate(src: *u8, n: i64, dir: i64, dst: *u8, cap: i64) -> i64 {
86 let pos: *i64 = sys_mmap(8) as *i64
87 *pos = 0
88 var i: i64 = 0
89 var first: i64 = 1
90 while i < n {
91 while i < n { if mr_is_tok(src[i] as i64) == 1 { break } i = i + 1 }
92 if i >= n { break }
93 let s: i64 = i
94 while i < n { if mr_is_tok(src[i] as i64) == 1 { i = i + 1 } else { break } }
95 let e: i64 = i
96 if first == 0 { mr_appb(dst, pos, cap, 32) }
97 first = 0
98 var tr: *u8 = 0 as *u8
99 if dir == 0 { tr = mr_ru_for_en(src, s, e) } else { tr = mr_en_for_ru(src, s, e) }
100 if (tr as i64) != 0 { mr_app(dst, pos, cap, tr) }
101 else { var k: i64 = s; while k < e { mr_appb(dst, pos, cap, src[k] as i64); k = k + 1 } }
102 }
103 return *pos
104}