code wiki / _hdl_build / nx_geo_join_gate.nx
nx_geo_join_gate.nx source
↩ module page · 75 lines · 3461 B
1// nx_geo_join_gate.nx -- GATE for GEO-013 spatial join. Pool of 2 disjoint squares (A near origin,
2// B far away) + 4 query points. Proves each point joins to the correct polygon (exact, deterministic):
3// Q0 center of A -> 0
4// Q1 center of B -> 1
5// Q2 between, outside -> -1
6// Q3 inside A by edge -> 0
7//
8// Evidence -> knowledge/status/geo_join.log (GEOJOINGATE authored=organ ... verdict=GREEN).
9// license_tier: ORIGINAL
10import "nx_geo_join.nx"
11import "nx_syscalls.nx"
12import "nx_gate_verdict.nx"
13
14const GJN_LOG: *u8 = "knowledge/status/geo_join.log"
15
16func gjn_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 }
17func gjn_wn(fd: i64, v: i64) -> i64 { let bb: *u8 = sys_mmap(28); var m: i64=v; if m<0 {m=0-m; sys_write(fd,"-" as *u8,1)}; let t: *u8 = sys_mmap(28); var k: i64=0; if m==0 {t[0]=48;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 }
18
19func gjn_set(p: *i64, i: i64, lat: i64, lon: i64) -> i64 { p[i * 2] = lat; p[i * 2 + 1] = lon; return 0 }
20
21func gjn_emit(fd: i64, j0: i64, j1: i64, j2: i64, j3: i64, ok: i64) -> i64 {
22 gjn_w(fd, "GEOJOINGATE authored=organ method=integer-raycast-join q0=" as *u8); gjn_wn(fd, j0)
23 gjn_w(fd, " q1=" as *u8); gjn_wn(fd, j1)
24 gjn_w(fd, " q2=" as *u8); gjn_wn(fd, j2)
25 gjn_w(fd, " q3=" as *u8); gjn_wn(fd, j3)
26 if ok == 1 { gjn_w(fd, " verdict=GREEN\n" as *u8) } else { gjn_w(fd, " verdict=RED\n" as *u8) }
27 return 0
28}
29
30func main() -> i64 {
31 // pool: polygon A (idx 0..3) = square lon/lat 0..2e6; polygon B (idx 4..7) = square lon/lat 10e6..12e6.
32 let pool: *i64 = sys_mmap(8 * 16) as *i64
33 gjn_set(pool, 0, 0, 0)
34 gjn_set(pool, 1, 0, 2000000)
35 gjn_set(pool, 2, 2000000, 2000000)
36 gjn_set(pool, 3, 2000000, 0)
37 gjn_set(pool, 4, 10000000, 10000000)
38 gjn_set(pool, 5, 10000000, 12000000)
39 gjn_set(pool, 6, 12000000, 12000000)
40 gjn_set(pool, 7, 12000000, 10000000)
41
42 let off: *i64 = sys_mmap(8 * 2) as *i64
43 off[0] = 0; off[1] = 4
44 let cnt: *i64 = sys_mmap(8 * 2) as *i64
45 cnt[0] = 4; cnt[1] = 4
46
47 let pts: *i64 = sys_mmap(8 * 8) as *i64
48 gjn_set(pts, 0, 1000000, 1000000) // center of A -> 0
49 gjn_set(pts, 1, 11000000, 11000000) // center of B -> 1
50 gjn_set(pts, 2, 5000000, 5000000) // outside both -> -1
51 gjn_set(pts, 3, 1000000, 1900000) // inside A by edge -> 0
52
53 let out: *i64 = sys_mmap(8 * 4) as *i64
54 geo_spatial_join(pts, 4, pool, off, cnt, 2, out)
55
56 var ok: i64 = 1
57 if out[0] != 0 { ok = 0 }
58 if out[1] != 1 { ok = 0 }
59 if out[2] != (0 - 1) { ok = 0 }
60 if out[3] != 0 { ok = 0 }
61
62 gjn_emit(1, out[0], out[1], out[2], out[3], ok)
63 let lf: i64 = sys_openat_append(GJN_LOG, 420)
64 if lf >= 0 { gjn_emit(lf, out[0], out[1], out[2], out[3], ok); sys_close(lf) }
65
66 // MIGRATED onto nx_gate_verdict by nx_gate_dry_apply (D001, minimal form): every check
67 // row above is untouched, so the PASS/FAIL vector cannot change; only the hand-rolled
68 // verdict emission is replaced by the ONE shared base class. Proven by nx_gate_migrate verify.
69 let ctr__dry: *i64 = gv_ctr()
70 ctr__dry[0] = ok
71 ctr__dry[1] = 1
72 let rc__dry: i64 = gv_verdict("GEO-JOIN-GATE" as *u8, ctr__dry, "teeth unchanged; verdict emission migrated onto the shared base class" as *u8)
73 sys_exit(rc__dry)
74 return rc__dry
75}