nx_image_e2e_gate.nx source
↩ module page · 199 lines · 11825 B
1// nx_image_e2e_gate.nx -- END-TO-END referee for search-by-image on REAL images.
2// Closes the loop R1a (query logic) + R1b (real-PNG ingest) could only prove separately: it builds a
3// REAL PNG corpus, runs the REAL ingestor (/tmp/nx_image_index.sov.elf) to fingerprint it into an index,
4// then runs the REAL query client (/tmp/nx_image_search.sov.elf) with a REAL PNG query and checks the
5// ranked match. "Real image in -> correct image out", fully sovereign, no production touched.
6// corpus = {/E/up (grad-up), /E/down (grad-down), /E/mid (stripes)} (real .png files)
7// query 1 = up RE-EXPOSED (+40 brightness, a real .png) -> must match /E/up at rank 1, Hamming 0,
8// and matches=1 (down @64 and mid @24 correctly excluded by the threshold) [the headline]
9// query 2 = grad-down .png -> must match /E/down at rank 1
10// query 3 = stripes .png -> must match /E/mid at rank 1, Hamming 0
11// GREEN iff 6/6. Durable verdict -> knowledge/status/image_e2e_gate.log. license_tier: ORIGINAL
12import "nx_syscalls.nx"
13import "nx_crc32.nx"
14import "nx_adler32.nx"
15
16func g_puts(s: *u8) -> i64 { var n: i64=0; while s[n]!=(0 as u8){n=n+1} sys_write(1,s,n); return 0 }
17func g_num(v: i64) -> i64 { let bb: *u8=sys_mmap(28); var m: i64=v; if m<0{m=0-m;sys_write(1,"-" as *u8,1)}; let t: *u8=sys_mmap(28); 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}; var i: i64=0; while i<k{bb[i]=t[k-1-i];i=i+1}; sys_write(1,bb,k); return 0 }
18func g_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 }
19func g_wn(fd: i64, v: i64) -> i64 { let bb: *u8=sys_mmap(28); var m: i64=v; if m<0{m=0-m}; let t: *u8=sys_mmap(28); 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}; var i: i64=0; while i<k{bb[i]=t[k-1-i];i=i+1}; sys_write(fd,bb,k); return 0 }
20func g_strlen(s: *u8) -> i64 { var n: i64=0; while s[n]!=(0 as u8){n=n+1} return n }
21
22func g_write_bytes(path: *u8, buf: *u8, n: i64) -> i64 { let fd: i64=sys_openat_wr(path, 0x1a4); if fd<0 { return 0-1 } sys_write(fd, buf, n); sys_close(fd); return 0 }
23func g_write_file(path: *u8, data: *u8) -> i64 { return g_write_bytes(path, data, g_strlen(data)) }
24func g_read_small(path: *u8, buf: *u8, cap: i64) -> i64 {
25 let fd: i64=sys_openat_rd(path)
26 if fd<0 { return 0 }
27 var total: i64=0
28 var nrd: i64=sys_read(fd, buf, cap)
29 while nrd>0 { total=total+nrd; if total>=cap { nrd=0 } else { nrd=sys_read(fd, ((buf as i64)+total) as *u8, cap-total) } }
30 sys_close(fd)
31 return total
32}
33func g_find(hay: *u8, n: i64, needle: *u8) -> i64 {
34 let nl: i64=g_strlen(needle)
35 if nl==0 { return 0-1 }
36 var i: i64=0
37 while i+nl<=n {
38 var j: i64=0; var hit: i64=1
39 while j<nl { if hay[i+j]!=needle[j] { hit=0; j=nl } else { j=j+1 } }
40 if hit==1 { return i }
41 i=i+1
42 }
43 return 0-1
44}
45func g_contains(hay: *u8, n: i64, needle: *u8) -> i64 { if g_find(hay,n,needle)>=0 { return 1 } return 0 }
46func g_rank_of(buf: *u8, n: i64, expected: *u8) -> i64 {
47 let at: i64=g_find(buf, n, expected)
48 if at<0 { return 0 }
49 var ls: i64=at
50 while ls>0 { if buf[ls-1]==(10 as u8) { ls=0-ls } else { ls=ls-1 } }
51 if ls<0 { ls=0-ls }
52 let hash_at: i64=g_find(((buf as i64)+ls) as *u8, at-ls+1, "#" as *u8)
53 if hash_at<0 { return 0 }
54 var p: i64=ls+hash_at+1
55 var rank: i64=0
56 while p<n { let c: i64=buf[p] as i64; if c>=48 { if c<=57 { rank=rank*10+(c-48); p=p+1 } else { p=n } } else { p=n } }
57 return rank
58}
59
60// ===== runtime PNG builder (stored zlib block, RGB 8-bit, RGB=(v,v,v)) =====
61func gp_wbe(buf: *u8, off: i64, val: i64) -> i64 { buf[off]=((val>>24)&255) as u8; buf[off+1]=((val>>16)&255) as u8; buf[off+2]=((val>>8)&255) as u8; buf[off+3]=(val&255) as u8; return 0 }
62func gp_val(kind: i64, x: i64, w: i64, bright: i64) -> i64 { var v: i64=0; if kind==0 { v=x*4 } if kind==1 { v=(w-1-x)*4 } if kind==3 { v=(x&2)*30 } v=v+bright; if v<0 { v=0 } if v>255 { v=255 } return v }
63func gp_build(out: *u8, w: i64, h: i64, kind: i64, bright: i64) -> i64 {
64 out[0]=137 as u8; out[1]=80 as u8; out[2]=78 as u8; out[3]=71 as u8
65 out[4]=13 as u8; out[5]=10 as u8; out[6]=26 as u8; out[7]=10 as u8
66 var pos: i64=8
67 gp_wbe(out,pos,13); pos=pos+4
68 let ihdr_t: i64=pos
69 out[pos]=73 as u8; out[pos+1]=72 as u8; out[pos+2]=68 as u8; out[pos+3]=82 as u8; pos=pos+4
70 gp_wbe(out,pos,w); pos=pos+4
71 gp_wbe(out,pos,h); pos=pos+4
72 out[pos]=8 as u8; out[pos+1]=2 as u8; out[pos+2]=0 as u8; out[pos+3]=0 as u8; out[pos+4]=0 as u8; pos=pos+5
73 gp_wbe(out,pos, nx_crc32(((out as i64)+ihdr_t) as *u8, 17)); pos=pos+4
74 let payload_len: i64=h*(1+w*3)
75 let zlib_len: i64=2+5+payload_len+4
76 gp_wbe(out,pos,zlib_len); pos=pos+4
77 let idat_t: i64=pos
78 out[pos]=73 as u8; out[pos+1]=68 as u8; out[pos+2]=65 as u8; out[pos+3]=84 as u8; pos=pos+4
79 out[pos]=0x78 as u8; out[pos+1]=0x01 as u8; pos=pos+2
80 out[pos]=0x01 as u8; pos=pos+1
81 out[pos]=(payload_len&255) as u8; out[pos+1]=((payload_len>>8)&255) as u8; pos=pos+2
82 let nlen: i64=(payload_len^0xFFFF)&0xFFFF
83 out[pos]=(nlen&255) as u8; out[pos+1]=((nlen>>8)&255) as u8; pos=pos+2
84 let payload_off: i64=pos
85 var y: i64=0
86 while y<h {
87 out[pos]=0 as u8; pos=pos+1
88 var x: i64=0
89 while x<w { let v: i64=gp_val(kind,x,w,bright); out[pos]=v as u8; out[pos+1]=v as u8; out[pos+2]=v as u8; pos=pos+3; x=x+1 }
90 y=y+1
91 }
92 gp_wbe(out,pos, adler32(((out as i64)+payload_off) as *u8, payload_len)); pos=pos+4
93 gp_wbe(out,pos, nx_crc32(((out as i64)+idat_t) as *u8, 4+zlib_len)); pos=pos+4
94 gp_wbe(out,pos,0); pos=pos+4
95 let iend_t: i64=pos
96 out[pos]=73 as u8; out[pos+1]=69 as u8; out[pos+2]=78 as u8; out[pos+3]=68 as u8; pos=pos+4
97 gp_wbe(out,pos, nx_crc32(((out as i64)+iend_t) as *u8, 4)); pos=pos+4
98 return pos
99}
100
101func g_run_index(corpus: *u8, outidx: *u8, outcap: *u8) -> i64 {
102 let pid: i64=sys_fork()
103 if pid==0 {
104 let out: i64=sys_openat_wr(outcap, 0x1a4); if out>=0 { sys_dup3(out, 1, 0) }
105 let argv: *i64=sys_mmap(8*6) as *i64
106 argv[0]="/tmp/nx_image_index.sov.elf" as *u8 as i64; argv[1]=corpus as i64; argv[2]=outidx as i64; argv[3]=0
107 let envp: *i64=sys_mmap(16) as *i64; envp[0]="PATH=/usr/bin:/bin" as *u8 as i64; envp[1]=0
108 sys_execve("/tmp/nx_image_index.sov.elf" as *u8, argv, envp); sys_exit(127)
109 }
110 let st: *i64=sys_mmap(16) as *i64; sys_wait4(pid, st, 0)
111 if (st[0]&0x7f)!=0 { return 128+(st[0]&0x7f) }
112 return (st[0]>>8)&0xff
113}
114// exec the query client with a PNG query (argc=4 -> w/h auto-detected, threshold defaults to 10)
115func g_run_search(sites: *u8, site: *u8, qpath: *u8, outcap: *u8) -> i64 {
116 let pid: i64=sys_fork()
117 if pid==0 {
118 let out: i64=sys_openat_wr(outcap, 0x1a4); if out>=0 { sys_dup3(out, 1, 0) }
119 let argv: *i64=sys_mmap(8*6) as *i64
120 argv[0]="/tmp/nx_image_search.sov.elf" as *u8 as i64; argv[1]=sites as i64; argv[2]=site as i64; argv[3]=qpath as i64; argv[4]=0
121 let envp: *i64=sys_mmap(16) as *i64; envp[0]="PATH=/usr/bin:/bin" as *u8 as i64; envp[1]=0
122 sys_execve("/tmp/nx_image_search.sov.elf" as *u8, argv, envp); sys_exit(127)
123 }
124 let st: *i64=sys_mmap(16) as *i64; sys_wait4(pid, st, 0)
125 if (st[0]&0x7f)!=0 { return 128+(st[0]&0x7f) }
126 return (st[0]>>8)&0xff
127}
128
129func main() -> i64 {
130 g_puts("=== IMAGE E2E GATE (real PNG corpus -> ingest -> index; real PNG query -> search -> match) ===\n" as *u8)
131 let W: i64=16
132 let H: i64=16
133 let pb: *u8=sys_mmap(4096)
134 var sz: i64=0
135
136 sz=gp_build(pb, W, H, 0, 0); g_write_bytes("/tmp/e_up.png" as *u8, pb, sz)
137 sz=gp_build(pb, W, H, 1, 0); g_write_bytes("/tmp/e_down.png" as *u8, pb, sz)
138 sz=gp_build(pb, W, H, 3, 0); g_write_bytes("/tmp/e_mid.png" as *u8, pb, sz)
139 sz=gp_build(pb, W, H, 0, 40); g_write_bytes("/tmp/e_q_bright.png" as *u8, pb, sz) // up, RE-EXPOSED
140
141 g_write_file("/tmp/e_corpus.tsv" as *u8,
142 "/E/up\t/tmp/e_up.png\n/E/down\t/tmp/e_down.png\n/E/mid\t/tmp/e_mid.png\n" as *u8)
143 g_write_file("/tmp/e_sites.tsv" as *u8, "demo\t/tmp/e.idx\thttps://demo\n" as *u8)
144
145 let icap: *u8=sys_mmap(8192)
146 let ric: i64=g_run_index("/tmp/e_corpus.tsv" as *u8, "/tmp/e.idx" as *u8, "/tmp/e_idx_out.txt" as *u8)
147 let nic: i64=g_read_small("/tmp/e_idx_out.txt" as *u8, icap, 8192)
148 g_puts("---- ingest ----\n" as *u8); sys_write(1, icap, nic)
149
150 let obuf: *u8=sys_mmap(65536)
151 var pass: i64=0
152 let rows: i64=6
153
154 // row1: index built from real PNGs (3 images)
155 let r1: i64=g_contains(icap, nic, "indexed=3" as *u8)
156 g_puts(" row1 ingest real PNGs -> indexed=3? " as *u8); g_num(r1)
157 if ric==0 { if r1==1 { pass=pass+1; g_puts(" PASS\n" as *u8) } else { g_puts(" FAIL\n" as *u8) } } else { g_puts(" FAIL\n" as *u8) }
158
159 // query 1: re-exposed up.png
160 let rq1: i64=g_run_search("/tmp/e_sites.tsv" as *u8, "demo" as *u8, "/tmp/e_q_bright.png" as *u8, "/tmp/e_s1.txt" as *u8)
161 let n1: i64=g_read_small("/tmp/e_s1.txt" as *u8, obuf, 65536)
162 g_puts("---- query: re-exposed up.png ----\n" as *u8); sys_write(1, obuf, n1)
163 let rk1: i64=g_rank_of(obuf, n1, "/E/up" as *u8)
164 let h0: i64=g_contains(obuf, n1, "ham=0" as *u8)
165 let m1: i64=g_contains(obuf, n1, "matches=1" as *u8)
166 // row2: correct match rank 1
167 g_puts(" row2 PNG query -> /E/up rank " as *u8); g_num(rk1)
168 if rq1==0 { if rk1==1 { pass=pass+1; g_puts(" PASS (real image in -> correct image out)\n" as *u8) } else { g_puts(" FAIL\n" as *u8) } } else { g_puts(" FAIL\n" as *u8) }
169 // row3: brightness invariance end-to-end (ham 0 through BOTH decode paths)
170 g_puts(" row3 brightness-invariant end-to-end -> ham0? " as *u8); g_num(h0)
171 if h0==1 { pass=pass+1; g_puts(" PASS\n" as *u8) } else { g_puts(" FAIL\n" as *u8) }
172 // row4: precision (down@64 + mid@24 excluded -> matches=1)
173 g_puts(" row4 precision -> matches=1? " as *u8); g_num(m1)
174 if m1==1 { pass=pass+1; g_puts(" PASS (far images excluded)\n" as *u8) } else { g_puts(" FAIL\n" as *u8) }
175
176 // query 2: down.png -> /E/down
177 let rq2: i64=g_run_search("/tmp/e_sites.tsv" as *u8, "demo" as *u8, "/tmp/e_down.png" as *u8, "/tmp/e_s2.txt" as *u8)
178 let n2: i64=g_read_small("/tmp/e_s2.txt" as *u8, obuf, 65536)
179 let rk2: i64=g_rank_of(obuf, n2, "/E/down" as *u8)
180 g_puts(" row5 PNG query down -> /E/down rank " as *u8); g_num(rk2)
181 if rq2==0 { if rk2==1 { pass=pass+1; g_puts(" PASS (different image -> different correct match)\n" as *u8) } else { g_puts(" FAIL\n" as *u8) } } else { g_puts(" FAIL\n" as *u8) }
182
183 // query 3: mid.png -> /E/mid at ham 0
184 let rq3: i64=g_run_search("/tmp/e_sites.tsv" as *u8, "demo" as *u8, "/tmp/e_mid.png" as *u8, "/tmp/e_s3.txt" as *u8)
185 let n3: i64=g_read_small("/tmp/e_s3.txt" as *u8, obuf, 65536)
186 let rk3: i64=g_rank_of(obuf, n3, "/E/mid" as *u8)
187 g_puts(" row6 PNG query mid -> /E/mid rank " as *u8); g_num(rk3)
188 if rq3==0 { if rk3==1 { pass=pass+1; g_puts(" PASS\n" as *u8) } else { g_puts(" FAIL\n" as *u8) } } else { g_puts(" FAIL\n" as *u8) }
189
190 g_puts("----\nIMAGE-E2E-GATE rows=" as *u8); g_num(rows); g_puts(" pass=" as *u8); g_num(pass); g_puts("\n" as *u8)
191 let lg: i64=sys_openat_append("knowledge/status/image_e2e_gate.log" as *u8, 0x1a4)
192 if lg>=0 {
193 g_w(lg, "IMAGE-E2E-GATE rows=" as *u8); g_wn(lg, rows); g_w(lg, " pass=" as *u8); g_wn(lg, pass)
194 if pass==rows { g_w(lg, " verdict=GREEN\n" as *u8) } else { g_w(lg, " verdict=RED\n" as *u8) }
195 sys_close(lg)
196 }
197 if pass==rows { g_puts("IMAGE-E2E-GATE GREEN\n" as *u8); sys_exit(0); return 0 }
198 g_puts("IMAGE-E2E-GATE RED\n" as *u8); sys_exit(1); return 1
199}