code wiki / (root) / nx_image_e2e_gate.nx

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}