code wiki / _hdl_build / nx_analyst_store_gate.nx
nx_analyst_store_gate.nx source
↩ module page · 124 lines · 5984 B
1// nx_analyst_store_gate.nx -- GATE proving the analytics run on REAL STORED DATA (round-trip through the
2// sovereign seg_store). Writes a known dataset (rows "size<TAB>age<TAB>price", price=5*size-2*age+noise) into
3// a FRESH per-run store, reads it back via ss_scan, extracts columns, and analyzes them -- the report must
4// (a) profile every stored column, (b) name size as the strongest ASSOCIATION with price. Also asserts field-parse
5// correctness + row-count round-trip. expect_exit: 0 license_tier: ORIGINAL
6import "nx_syscalls.nx"
7import "_hdl_build/nx_analyst_store.nx"
8
9func sp(s: *u8) -> i64 { var n: i64=0; while s[n]!=(0 as u8){n=n+1} sys_write(1,s,n); return 0 }
10func snn(v: i64) -> i64 { var m: i64=v; if m<0{sp("-" as *u8);m=0-m} let t:*u8=sys_mmap(24); 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} let o:*u8=sys_mmap(24); var i:i64=0; while i<k{o[i]=t[k-1-i];i=i+1} sys_write(1,o,k); return 0 }
11func shas(hay: *u8, n: i64, needle: *u8) -> i64 {
12 var nl: i64 = 0
13 while needle[nl] != (0 as u8) { nl = nl + 1 }
14 var i: i64 = 0
15 while i + nl <= n { var j: i64 = 0; var eq: i64 = 1; while j < nl { if hay[i+j] != needle[j] { eq = 0; break } j = j + 1 } if eq == 1 { return 1 } i = i + 1 }
16 return 0
17}
18func lcg(s: i64) -> i64 { return (s * 1103515245 + 12345) & 0x7fffffff }
19// append decimal v to buf at o; return new o
20func scatn(buf: *u8, o: i64, v: i64) -> i64 {
21 var oo: i64 = o
22 var m: i64 = v
23 if m < 0 { buf[oo] = 45 as u8; oo = oo + 1; m = 0 - m }
24 let t: *u8 = sys_mmap(24)
25 var k: i64 = 0
26 if m == 0 { t[0] = 48 as u8; k = 1 }
27 while m > 0 { t[k] = (48 + (m % 10)) as u8; m = m / 10; k = k + 1 }
28 var i: i64 = k - 1
29 while i >= 0 { buf[oo] = t[i]; oo = oo + 1; i = i - 1 }
30 return oo
31}
32
33func main() -> i64 {
34 sp("=== nx_analyst_store_gate (analytics on REAL stored data) ===\n" as *u8)
35 var pass: i64 = 0
36 var fail: i64 = 0
37
38 // T0 field-parse correctness (independent of the store)
39 let sample: *u8 = "125\t18\t-609" as *u8
40 var t0: i64 = 1
41 if asr_field_i64(sample, 11, 0) != 125 { t0 = 0 }
42 if asr_field_i64(sample, 11, 1) != 18 { t0 = 0 }
43 if asr_field_i64(sample, 11, 2) != (0 - 609) { t0 = 0 }
44 if t0 == 1 { pass = pass + 1 } else { fail = fail + 1; sp("T0 FAIL field parse\n" as *u8) }
45
46 // build a FRESH per-run store prefix: /tmp/anstore_<now_us>
47 let prefix: *u8 = sys_mmap(128)
48 var po: i64 = 0
49 let pfx: *u8 = "/tmp/anstore_" as *u8
50 while pfx[po] != (0 as u8) { prefix[po] = pfx[po]; po = po + 1 }
51 let now: i64 = sys_now_us()
52 po = scatn(prefix, po, now)
53 prefix[po] = 0 as u8
54
55 // write N rows under key "dsrow". N<=256: the seg_store scan hard-caps at 256 results/key (documented
56 // in asr_load_field) -- 250 proves a CLEAN full round-trip within the store contract; sharded-load for
57 // >256 is the named scale follow-on.
58 let n: i64 = 250
59 let w: *i64 = ss_begin()
60 let row: *u8 = sys_mmap(64)
61 var s: i64 = 11
62 var i: i64 = 0
63 while i < n {
64 s = lcg(s)
65 let size: i64 = 50 + (s % 150)
66 s = lcg(s)
67 let age: i64 = s % 40
68 s = lcg(s)
69 let price: i64 = 5 * size - 2 * age + (s % 20)
70 var ro: i64 = 0
71 ro = scatn(row, ro, size)
72 row[ro] = 9 as u8; ro = ro + 1
73 ro = scatn(row, ro, age)
74 row[ro] = 9 as u8; ro = ro + 1
75 ro = scatn(row, ro, price)
76 ss_add(w, 1, "dsrow" as *u8, row, ro)
77 i = i + 1
78 }
79 let cr: i64 = ss_commit(prefix, w, now)
80 sp("committed rc=" as *u8); snn(cr); sp(" prefix="); sp(prefix); sp("\n" as *u8)
81
82 // T1 row-count round-trip: load field 0 -> exactly n rows back
83 let col: *i64 = sys_mmap(8 * (n + 16)) as *i64
84 let got: i64 = asr_load_field(prefix, "dsrow" as *u8, 0, col, n + 8)
85 sp("rows read back=" as *u8); snn(got); sp("\n" as *u8)
86 if got == n { pass = pass + 1 } else { fail = fail + 1; sp("T1 FAIL row-count round-trip\n" as *u8) }
87
88 // T2 a stored value parsed correctly: first row's size is in [50,199]
89 var t2: i64 = 1
90 if col[0] < 50 { t2 = 0 }
91 if col[0] > 199 { t2 = 0 }
92 if t2 == 1 { pass = pass + 1 } else { fail = fail + 1; sp("T2 FAIL stored value range\n" as *u8) }
93
94 // T3 FULL analyze on stored data -> report names size as the key driver of price
95 let names: *i64 = sys_mmap(8 * 3) as *i64
96 names[0] = "size" as *u8 as i64
97 names[1] = "age" as *u8 as i64
98 names[2] = "price" as *u8 as i64
99 let out: *u8 = sys_mmap(16384)
100 let rw: i64 = asr_analyze_stored(prefix, "dsrow" as *u8, names, 3, 2, n + 8, out, 16384)
101 sp(out); sp("\n---\n" as *u8)
102 var t3: i64 = 1
103 if rw <= 0 { t3 = 0 }
104 if shas(out, rw, "DATASET ANALYSIS" as *u8) == 0 { t3 = 0 }
105 if shas(out, rw, "DATA PROFILE: size" as *u8) == 0 { t3 = 0 }
106 if shas(out, rw, "DATA PROFILE: price" as *u8) == 0 { t3 = 0 }
107 if shas(out, rw, "size has the strongest association" as *u8) == 0 { t3 = 0 }
108 if t3 == 1 { pass = pass + 1 } else { fail = fail + 1; sp("T3 FAIL analyze-stored\n" as *u8) }
109
110 sp("pass=" as *u8); snn(pass); sp(" fail=" as *u8); snn(fail); sp("\n" as *u8)
111 let log: *u8 = sys_mmap(128)
112 var lo: i64 = 0
113 let pre: *u8 = "ANALYSTSTORE authored=organ verdict=" as *u8
114 var pi: i64 = 0
115 while pre[pi] != (0 as u8) { log[lo] = pre[pi]; lo = lo + 1; pi = pi + 1 }
116 if fail == 0 { let g: *u8 = "GREEN\n" as *u8; var gi: i64 = 0; while g[gi] != (0 as u8) { log[lo] = g[gi]; lo = lo + 1; gi = gi + 1 } } else { let r: *u8 = "RED\n" as *u8; var ri: i64 = 0; while r[ri] != (0 as u8) { log[lo] = r[ri]; lo = lo + 1; ri = ri + 1 } }
117 let fd: i64 = sys_openat_wr("knowledge/status/analyst_store.log" as *u8, 0x1A4)
118 if fd >= 0 { sys_write(fd, log, lo); sys_close(fd) }
119
120 if fail == 0 { sp("=== ANALYST-STORE-GATE verdict=GREEN ===\n" as *u8); sys_exit(0); return 0 }
121 sp("=== ANALYST-STORE-GATE verdict=RED ===\n" as *u8)
122 sys_exit(1)
123 return 1
124}