code wiki / _hdl_build / nx_research_relation_test.nx

nx_research_relation_test.nx source

↩ module page · 75 lines · 3501 B

1// nx_research_relation_test.nx -- KAT gate for the grown-organ relation extractor. 2// Known sentences -> known (relation, subject, object) triples. Proves the 3// qualitative-claim extractor is correct + inspectable. expect_exit: 0. 4 5import "nx_syscalls.nx" 6import "nx_research_extract.nx" 7import "nx_research_relation.nx" 8 9func w(s: *u8) -> i64 { var n: i64 = 0; while s[n] != (0 as u8) { n = n + 1 } sys_write(1, s, n); return 0 } 10func wn(v: i64) -> i64 { 11 let b: *u8 = sys_mmap(28); var m: i64 = v 12 if m < 0 { m = 0 - m; sys_write(1, "-" as *u8, 1) } 13 let t: *u8 = sys_mmap(28); var k: i64 = 0 14 if m == 0 { t[0] = 48 as u8; k = 1 } 15 while m > 0 { t[k] = (48 + (m % 10)) as u8; m = m / 10; k = k + 1 } 16 var i: i64 = 0; while i < k { b[i] = t[k - 1 - i]; i = i + 1 } 17 sys_write(1, b, k); return 0 18} 19 20func streq(a: *u8, b: *u8) -> i64 { 21 var i: i64 = 0 22 while i < 4096 { 23 if a[i] != b[i] { return 0 } 24 if a[i] == (0 as u8) { return 1 } 25 i = i + 1 26 } 27 return 1 28} 29 30func chk(cond: i64, pass: *i64, fail: *i64, label: *u8) -> i64 { 31 if cond == 1 { pass[0] = pass[0] + 1; w(" ok " as *u8); w(label); w("\n" as *u8) } 32 else { fail[0] = fail[0] + 1; w(" XX " as *u8); w(label); w("\n" as *u8) } 33 return 0 34} 35 36// run extraction on a sentence and assert relation/subject/object 37func tcase(s: *u8, exp_rel: *u8, exp_subj: *u8, exp_obj: *u8, pass: *i64, fail: *i64) -> i64 { 38 let subj: *u8 = sys_mmap(512) 39 let obj: *u8 = sys_mmap(512) 40 let n: i64 = re_strlen(s) 41 let ri: i64 = nx_rel_extract(s, n, subj, obj) 42 w(" SENT: " as *u8); w(s); w("\n" as *u8) 43 if ri < 0 { 44 w(" -> (no cue)\n" as *u8) 45 chk(streq(exp_rel, "NONE" as *u8), pass, fail, "rel==NONE" as *u8) 46 return 0 47 } 48 w(" -> [" as *u8); w(rel_name(ri)); w("] subj='" as *u8); w(subj) 49 w("' obj='" as *u8); w(obj); w("'\n" as *u8) 50 chk(streq(rel_name(ri), exp_rel), pass, fail, "rel" as *u8) 51 chk(streq(subj, exp_subj), pass, fail, "subj" as *u8) 52 chk(streq(obj, exp_obj), pass, fail, "obj" as *u8) 53 return 0 54} 55 56func main() -> i64 { 57 let pass: *i64 = (sys_mmap(8)) as *i64 58 let fail: *i64 = (sys_mmap(8)) as *i64 59 pass[0] = 0 60 fail[0] = 0 61 62 w("=== nx_research_relation KAT (grown-organ qualitative claim extract) ===\n" as *u8) 63 tcase("A game engine is a software framework." as *u8, "IS_A" as *u8, "A game engine" as *u8, "software framework" as *u8, pass, fail) 64 tcase("Real-time strategy requires deterministic lockstep." as *u8, "REQUIRES" as *u8, "Real-time strategy" as *u8, "deterministic lockstep" as *u8, pass, fail) 65 tcase("WebGPU enables compute shaders." as *u8, "ENABLES" as *u8, "WebGPU" as *u8, "compute shaders" as *u8, pass, fail) 66 tcase("The renderer uses WebGPU." as *u8, "USES" as *u8, "The renderer" as *u8, "WebGPU" as *u8, pass, fail) 67 tcase("An engine consists of subsystems, tools, and assets." as *u8, "CONSISTS_OF" as *u8, "An engine" as *u8, "subsystems" as *u8, pass, fail) 68 tcase("Vulkan provides low-level GPU access." as *u8, "PROVIDES" as *u8, "Vulkan" as *u8, "low-level GPU access" as *u8, pass, fail) 69 tcase("A shader is a program." as *u8, "IS_A" as *u8, "A shader" as *u8, "program" as *u8, pass, fail) 70 tcase("Hello world." as *u8, "NONE" as *u8, "" as *u8, "" as *u8, pass, fail) 71 72 w("=== VERDICT pass=" as *u8); wn(pass[0]); w(" fail=" as *u8); wn(fail[0]); w(" ===\n" as *u8) 73 if fail[0] == 0 { return 0 } 74 return 1 75}