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}