code wiki / _hdl_build / nx_fuzzy_gate.nx
nx_fuzzy_gate.nx source
↩ module page · 38 lines · 3539 B
1// nx_fuzzy_gate.nx -- KAT for R-UX-1 (nx_fuzzy): typos within edit-distance 1 of the right term match; unrelated
2// terms are far. Real andelinwest vocabulary. expect_exit: 0 license_tier: ORIGINAL
3import "nx_syscalls.nx"
4import "nx_fuzzy.nx"
5
6func fz_puts(s: *u8) -> i64 { var n: i64=0; while s[n]!=(0 as u8){n=n+1} sys_write(1,s,n); return 0 }
7func fz_pn(v: i64) -> i64 { let bb: *u8=sys_mmap(28); var m: i64=v; if m<0{m=0-m;sys_write(1,"-" as *u8,1)}; let t: *u8=sys_mmap(28); var k: i64=0; if m==0{t[0]=(48 as u8);k=1}; while m>0{t[k]=((48+(m%10)) as u8);m=m/10;k=k+1}; var i: i64=0; while i<k{bb[i]=t[k-1-i];i=i+1}; sys_write(1,bb,k); return 0 }
8func fz_w(fd: i64, s: *u8) -> i64 { var n: i64=0; while s[n]!=(0 as u8){n=n+1} sys_write(fd,s,n); return 0 }
9func fz_wn(fd: i64, v: i64) -> i64 { let bb: *u8=sys_mmap(28); var m: i64=v; if m<0{m=0-m}; let t: *u8=sys_mmap(28); var k: i64=0; if m==0{t[0]=(48 as u8);k=1}; while m>0{t[k]=((48+(m%10)) as u8);m=m/10;k=k+1}; var i: i64=0; while i<k{bb[i]=t[k-1-i];i=i+1}; sys_write(fd,bb,k); return 0 }
10func fz_len(s: *u8) -> i64 { var n: i64=0; while s[n]!=(0 as u8){n=n+1} return n }
11
12func fz_case(label: *u8, a: *u8, b: *u8, expect: i64) -> i64 {
13 let d: i64=vr_fuzzy(a, fz_len(a), b, fz_len(b))
14 fz_puts(" " as *u8); fz_puts(label); fz_puts(" dist=" as *u8); fz_pn(d); fz_puts(" exp=" as *u8); fz_pn(expect); fz_puts(" " as *u8)
15 if d==expect { fz_puts("PASS\n" as *u8); return 1 }
16 fz_puts("FAIL\n" as *u8); return 0
17}
18
19func main() -> i64 {
20 fz_puts("=== R-UX-1 FUZZY/TYPO TOLERANCE -- Levenshtein edit distance (real search vocab) ===\n" as *u8)
21 var pass: i64=0; var total: i64=0
22 total=total+1; pass=pass + fz_case("divorse~divorce (1 subst) " as *u8, "divorse\x00" as *u8, "divorce\x00" as *u8, 1)
23 total=total+1; pass=pass + fz_case("custdy~custody (1 insert) " as *u8, "custdy\x00" as *u8, "custody\x00" as *u8, 1)
24 total=total+1; pass=pass + fz_case("injury~injury (identical)" as *u8, "injury\x00" as *u8, "injury\x00" as *u8, 0)
25 total=total+1; pass=pass + fz_case("contrac~contract(1 delete) " as *u8, "contrac\x00" as *u8, "contract\x00" as *u8, 1)
26 // typo within bound=1 matches the right term; an unrelated term does NOT
27 let w1: i64=vr_fuzzy_within("divorse\x00" as *u8, 7, "divorce\x00" as *u8, 7, 1)
28 let w2: i64=vr_fuzzy_within("divorse\x00" as *u8, 7, "estate\x00" as *u8, 6, 1)
29 total=total+1; fz_puts(" within<=1: 'divorse'->divorce? " as *u8); fz_pn(w1); fz_puts(" (exp1) 'divorse'->estate? " as *u8); fz_pn(w2); fz_puts(" (exp0) " as *u8); if w1==1 { if w2==0 { pass=pass+1; fz_puts("PASS\n" as *u8) } else { fz_puts("FAIL\n" as *u8) } } else { fz_puts("FAIL\n" as *u8) }
30
31 fz_puts("----\nFUZZY gate " as *u8); fz_pn(pass); fz_puts("/" as *u8); fz_pn(total); fz_puts(" passed\n" as *u8)
32 fz_puts("HONEST: exact Levenshtein; a BK-tree over the vocab makes within-bound lookup sub-linear at scale\n" as *u8)
33 fz_puts(" (the named extension). Search use: a 0-postings term falls back to within-bound vocab terms.\n" as *u8)
34 let lg: i64=sys_openat_append("knowledge/status/fuzzy_gate.log" as *u8, 0x1a4)
35 if lg>=0 { fz_w(lg, "R-UX-1 fuzzy gate pass=" as *u8); fz_wn(lg, pass); fz_w(lg, "/" as *u8); fz_wn(lg, total); if pass==total { fz_w(lg, " GREEN\n" as *u8) } else { fz_w(lg, " RED\n" as *u8) } sys_close(lg) }
36 if pass==total { fz_puts("R-UX-1 GREEN (sovereign fuzzy/typo tolerance proven)\n" as *u8); sys_exit(0); return 0 }
37 fz_puts("R-UX-1 RED\n" as *u8); sys_exit(1); return 1
38}