code wiki / _hdl_build / nx_editdist_gate.nx

nx_editdist_gate.nx source

↩ module page · 41 lines · 2671 B

1// nx_editdist_gate.nx -- KATs for the bounded Levenshtein (the typo rung's math floor). license_tier: ORIGINAL 2import "nx_editdist.nx" 3 4func g_puts(s: *u8) -> i64 { var n: i64 = 0; while s[n] != (0 as u8) { n = n + 1 } sys_write(1, s, n); return 0 } 5func g_len(s: *u8) -> i64 { var n: i64 = 0; while s[n] != (0 as u8) { n = n + 1 } return n } 6func g_num(v: i64) -> i64 { 7 let bb: *u8 = sys_mmap(28); var m: i64 = v 8 if m < 0 { sys_write(1, "-" as *u8, 1); m = 0 - m } 9 let t: *u8 = sys_mmap(28); var k: i64 = 0 10 if m == 0 { t[0] = 48 as u8; k = 1 } 11 while m > 0 { t[k] = (48 + (m % 10)) as u8; m = m / 10; k = k + 1 } 12 var i: i64 = 0; while i < k { bb[i] = t[k - 1 - i]; i = i + 1 } 13 sys_write(1, bb, k); return 0 14} 15func g_ed(a: *u8, b: *u8, bound: i64) -> i64 { return ed_bounded(a, g_len(a), b, g_len(b), bound) } 16func g_check(name: *u8, cond: i64, pass: *i64, total: *i64) -> i64 { 17 total[0] = total[0] + 1 18 g_puts(name) 19 if cond == 1 { pass[0] = pass[0] + 1; g_puts(" PASS\n" as *u8) } else { g_puts(" FAIL\n" as *u8) } 20 return 0 21} 22 23func main() -> i64 { 24 g_puts("=== nx_editdist gate (bounded Levenshtein KATs) ===\n" as *u8) 25 let pass: *i64 = sys_mmap(16) as *i64; pass[0] = 0 26 let total: *i64 = sys_mmap(16) as *i64; total[0] = 0 27 28 g_check("T1 identical -> 0" as *u8, (g_ed("probate" as *u8, "probate" as *u8, 2) == 0) as i64, pass, total) 29 g_check("T2 one substitution -> 1 (probete/probate)" as *u8, (g_ed("probete" as *u8, "probate" as *u8, 2) == 1) as i64, pass, total) 30 g_check("T3 one deletion -> 1 (probat/probate)" as *u8, (g_ed("probat" as *u8, "probate" as *u8, 2) == 1) as i64, pass, total) 31 g_check("T4 one insertion -> 1 (proobate/probate)" as *u8, (g_ed("proobate" as *u8, "probate" as *u8, 2) == 1) as i64, pass, total) 32 g_check("T5 kitten/sitting -> 3 exceeds bound 2 -> 3" as *u8, (g_ed("kitten" as *u8, "sitting" as *u8, 2) == 3) as i64, pass, total) 33 g_check("T6 length-gap early-out (ab/abcdef bound 2 -> 3)" as *u8, (g_ed("ab" as *u8, "abcdef" as *u8, 2) == 3) as i64, pass, total) 34 g_check("T7 transposition counts 2 (recieve/receive)" as *u8, (g_ed("recieve" as *u8, "receive" as *u8, 2) == 2) as i64, pass, total) 35 // null ptr + len 0 (NEVER the `"" as *u8` literal -- the banked miscompile; len 0 is checked pre-deref) 36 g_check("T8 empty vs word -> len" as *u8, (ed_bounded(0 as *u8, 0, "abc" as *u8, 3, 3) == 3) as i64, pass, total) 37 38 g_puts("=== editdist gate: " as *u8); g_num(pass[0]); g_puts("/" as *u8); g_num(total[0]); g_puts(" " as *u8) 39 if pass[0] == total[0] { g_puts("verdict=GREEN\n" as *u8); return 0 } 40 g_puts("verdict=RED\n" as *u8); return 1 41}