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}