code wiki / _hdl_build / nx_seg_columnar_gate.nx
nx_seg_columnar_gate.nx source
↩ module page · 51 lines · 3194 B
1import "nx_gate_gn.nx"
2// nx_seg_columnar_gate.nx -- exceed-gate for CAP-SEG-COLUMNAR. Proves lossless compression on a column: RLE encodes
3// runs to fewer pairs and decodes back byte-exact; dictionary reduces a low-cardinality column to distinct values +
4// small ids and decodes back byte-exact. This is the analytic-scan win a row store can't give.
5// Sovereign: nx_syscalls + nx_seg_columnar. expect_exit: 0
6import "nx_syscalls.nx"
7import "nx_seg_columnar.nx"
8import "nx_gate_verdict.nx"
9
10func gp(s: *u8) -> i64 { var n: i64=0; while s[n]!=(0 as u8){n=n+1} sys_write(1,s,n); return 0 }
11func geq(a: *i64, b: *i64, n: i64) -> i64 { var i: i64=0; while i<n { if a[i]!=b[i] { return 0 } i=i+1 } return 1 }
12
13func main(argc: i64, argv: *i64) -> i64 {
14 gp("=== nx_seg_columnar_gate (columnar RLE + dictionary compression, lossless) ===\n" as *u8)
15 var pass: i64=0; var fail: i64=0
16
17 // RLE column: 8 values with runs -> 3 (count,value) runs
18 let vals: *i64=sys_mmap(8*8) as *i64
19 vals[0]=5; vals[1]=5; vals[2]=5; vals[3]=5; vals[4]=3; vals[5]=3; vals[6]=3; vals[7]=9
20 let pairs: *i64=sys_mmap(8*16) as *i64
21 let np: i64 = col_rle_encode(vals, 8, pairs)
22 if np == 3 { pass=pass+1; gp(" T1 RLE encode 8 values -> 3 runs PASS\n" as *u8) } else { fail=fail+1; gp(" T1 FAIL np=" as *u8); gn(np); gp("\n" as *u8) }
23
24 let dec: *i64=sys_mmap(8*16) as *i64
25 let dn2: i64 = col_rle_decode(pairs, np, dec)
26 if dn2 == 8 { if geq(dec, vals, 8)==1 { pass=pass+1; gp(" T2 RLE decode -> 8 values byte-exact (lossless round-trip) PASS\n" as *u8) } else { fail=fail+1; gp(" T2 FAIL bytes\n" as *u8) } } else { fail=fail+1; gp(" T2 FAIL count\n" as *u8) }
27
28 if np*2 < 8 { pass=pass+1; gp(" T3 compressed: " as *u8); gn(np*2); gp(" ints < 8 raw PASS\n" as *u8) } else { fail=fail+1; gp(" T3 FAIL no compression\n" as *u8) }
29
30 // DICTIONARY column: 5 rows, 2 distinct
31 let dv: *i64=sys_mmap(8*8) as *i64
32 dv[0]=100; dv[1]=200; dv[2]=100; dv[3]=100; dv[4]=200
33 let dict: *i64=sys_mmap(8*8) as *i64; let ids: *i64=sys_mmap(8*8) as *i64
34 let card: i64 = col_dict_encode(dv, 5, dict, ids)
35 if card == 2 { pass=pass+1; gp(" T4 dict encode: cardinality 2 < 5 rows (low-card compressed) PASS\n" as *u8) } else { fail=fail+1; gp(" T4 FAIL card=" as *u8); gn(card); gp("\n" as *u8) }
36
37 let dd: *i64=sys_mmap(8*8) as *i64
38 col_dict_decode(dict, ids, 5, dd)
39 if geq(dd, dv, 5)==1 { pass=pass+1; gp(" T5 dict decode -> byte-exact (lossless round-trip) PASS\n" as *u8) } else { fail=fail+1; gp(" T5 FAIL\n" as *u8) }
40
41 gp("RESULT pass=" as *u8); gn(pass); gp(" fail=" as *u8); gn(fail)
42 // MIGRATED onto nx_gate_verdict by nx_gate_dry_apply (D001, minimal form): every check
43 // row above is untouched, so the PASS/FAIL vector cannot change; only the hand-rolled
44 // verdict emission is replaced by the ONE shared base class. Proven by nx_gate_migrate verify.
45 let ctr__dry: *i64 = gv_ctr()
46 ctr__dry[0] = pass
47 ctr__dry[1] = pass + fail
48 let rc__dry: i64 = gv_verdict("SEG-COLUMNAR-GATE" as *u8, ctr__dry, "columnar layout + lossless RLE/dict compression -- analytic-scan class)" as *u8)
49 sys_exit(rc__dry)
50 return rc__dry
51}