code wiki / _hdl_build / nx_codec_rd2_gate.nx

nx_codec_rd2_gate.nx source

↩ module page · 125 lines · 9142 B

1// nx_codec_rd2_gate.nx -- SOVEREIGN MODELED rate-distortion head-to-head: rANS vs JPEG-Huffman on the 2// IDENTICAL SYMBOL STREAM (DC-diff categories + AC run/size + EOB) with IDENTICAL magnitude bits, at 3// IDENTICAL quality. This is the architectural fix the first head-to-head (nx_codec_rd_gate) demanded: 4// give rANS the same DC-diff + RLE MODELING JPEG uses, so the comparison is the pure entropy-coder 5// question (rANS vs Huffman on the same symbols) -- the magnitude bits are byte-identical in both and 6// cancel. No python / 3rd party. 7// T1 JPEG entropy lossless T2 modeled encode/decode lossless (jsym round-trips the coeffs) 8// T3 rANS(symbols) lossless T4 the modeling fix BEATS naive rANS (was 5571B) 9// T5 grade matches measured sizes (honest) T6 liar-kill: more bytes can't be a win 10// GREEN iff 6/6. knowledge/status/codec_rd2_gate.log. license_tier: ORIGINAL 11import "nx_syscalls.nx" 12import "nx_gate_emit_lib.nx" 13import "nx_h264_bitwriter.nx" 14import "nx_dct8.nx" 15import "nx_quant_table.nx" 16import "nx_zigzag.nx" 17import "nx_jpeg_huff_enc.nx" 18import "nx_jpeg_block_enc.nx" 19import "nx_jpeg_sym.nx" 20import "nx_rans.nx" 21 22const GRADE_BEHIND: i64 = 1 23const GRADE_PARITY: i64 = 2 24const GRADE_EXCEEDS: i64 = 4 25 26func 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 } 27func 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 } 28func g_wn(fd: i64, v: i64) -> i64 { let bb: *u8=sys_mmap(28); var m: i64=v; 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 } 29func qrnd(v: i64, q: i64) -> i64 { if v>=0 { return (v + q/2)/q } return 0 - (((0-v) + q/2)/q) } 30func rd_grade(our: i64, ref: i64) -> i64 { if our < ref { return GRADE_EXCEEDS } if our > ref { return GRADE_BEHIND } return GRADE_PARITY } 31func g_grade(gr: i64) -> i64 { if gr==4 { g_puts("EXCEEDS" as *u8) } if gr==2 { g_puts("PARITY" as *u8) } if gr==1 { g_puts("BEHIND" as *u8) } return 0 } 32 33func main() -> i64 { 34 g_puts("=== MODELED RD HEAD-TO-HEAD: rANS vs JPEG-Huffman on identical SYMBOLS (DC-diff+RLE) ===\n" as *u8) 35 let W: i64=256; let H: i64=256; let sb: i64=12 36 let npx: i64=W*H; let nblk: i64=(W/8)*(H/8); let ncoef: i64=nblk*64 37 38 let img: *i64=sys_mmap(npx*8) as *i64 39 var y: i64=0 40 while y<H { var x: i64=0; while x<W { var v: i64=(x+y)/2; if x>=84 { if x<172 { if y>=84 { if y<172 { v=210 } } } } img[y*W+x]=v; x=x+1 } y=y+1 } 41 42 let dcB: *i64=sys_mmap(20*8) as *i64; let dcV: *i64=sys_mmap(20*8) as *i64 43 let acB: *i64=sys_mmap(20*8) as *i64; let acV: *i64=sys_mmap(200*8) as *i64 44 let ndc: i64=jhe_dc_bits(dcB); jhe_dc_val(dcV); let nac: i64=jhe_ac_bits(acB); jhe_ac_val(acV) 45 let dcCO: *i64=sys_mmap(256*8) as *i64; let dcSI: *i64=sys_mmap(256*8) as *i64 46 let acCO: *i64=sys_mmap(256*8) as *i64; let acSI: *i64=sys_mmap(256*8) as *i64 47 jhe_gen(dcB, dcV, ndc, dcCO, dcSI); jhe_gen(acB, acV, nac, acCO, acSI) 48 let qt: *i64=sys_mmap(64*8) as *i64; nx_qt_luma(qt, 50) 49 let to_zz: *i64=sys_mmap(64*8) as *i64; let from_zz: *i64=sys_mmap(64*8) as *i64; nx_zigzag_init(to_zz, from_zz) 50 let DM: *i64=sys_mmap(64*8) as *i64; nx_dct8_init(DM) 51 let scratch: *i64=sys_mmap(64*8) as *i64; let ti: *i64=sys_mmap(8*8) as *i64; let to: *i64=sys_mmap(8*8) as *i64 52 53 // forward every block -> shared zigzag quantized coeffs qall 54 let qall: *i64=sys_mmap(ncoef*8) as *i64 55 let sh: *i64=sys_mmap(64*8) as *i64; let co: *i64=sys_mmap(64*8) as *i64; let q: *i64=sys_mmap(64*8) as *i64; let zz: *i64=sys_mmap(64*8) as *i64 56 var by: i64=0 57 while by < H/8 { var bx: i64=0; while bx < W/8 { 58 let bidx: i64=by*(W/8)+bx 59 var r: i64=0; while r<8 { var c: i64=0; while c<8 { sh[r*8+c]=img[(by*8+r)*W+(bx*8+c)]-128; c=c+1 } r=r+1 } 60 nx_dct8_forward_2d(DM, sh, co, scratch, ti, to) 61 var i: i64=0; while i<64 { q[i]=qrnd(co[i], qt[i]); i=i+1 } 62 nx_zigzag_scan(q, to_zz, zz) 63 i=0; while i<64 { qall[bidx*64+i]=zz[i]; i=i+1 } 64 bx=bx+1 } by=by+1 } 65 66 // --- JPEG-HUFFMAN (modeling + Huffman, interleaved) --- 67 let ebuf: *u8=sys_mmap(npx + 4096); let bw: *BitWriter=sys_mmap(64) as *BitWriter; bw_init(bw, ebuf, npx + 4096) 68 var prevdc: i64=0; var b: i64=0 69 while b<nblk { prevdc=jbe_encode_block(bw, dcCO, dcSI, acCO, acSI, ((qall as i64)+(b*64*8)) as *i64, prevdc); b=b+1 } 70 while bw.bit_pos != 0 { bw_write_bit(bw, 1) } 71 let jpeg_bytes: i64=bw.byte_pos 72 let pos: *i64=sys_mmap(8) as *i64; pos[0]=0; let zzd: *i64=sys_mmap(64*8) as *i64 73 var jpeg_ok: i64=1; var pdc: i64=0; b=0 74 while b<nblk { pdc=jbe_decode_block(ebuf, pos, dcCO, dcSI, acCO, acSI, pdc, zzd); var i: i64=0; while i<64 { if zzd[i]!=qall[b*64+i] { jpeg_ok=0 } i=i+1 } b=b+1 } 75 76 // --- MODELED rANS: same modeling -> symbol bytes + magnitude bits; rANS the symbols --- 77 let sym: *u8=sys_mmap(nblk*70 + 1024); let sp: *i64=sys_mmap(8) as *i64; sp[0]=0 78 let magw: *BitWriter=sys_mmap(64) as *BitWriter; let magbuf: *u8=sys_mmap(npx + 4096); bw_init(magw, magbuf, npx + 4096) 79 prevdc=0; b=0 80 while b<nblk { prevdc=jsym_encode_block(sym, sp, magw, ((qall as i64)+(b*64*8)) as *i64, prevdc); b=b+1 } 81 let nsym: i64=sp[0] 82 let magbytes: i64=(bw_total_bits(magw)+7)/8 83 // rANS the symbol stream 84 let counts: *i64=sys_mmap(257*8) as *i64; let fr: *i64=sys_mmap(257*8) as *i64; let cu: *i64=sys_mmap(257*8) as *i64; let s2s: *i64=sys_mmap((1<<sb)*8) as *i64 85 rans_count(sym, nsym, counts); rans_normalize(counts, fr, sb); rans_cum(fr, cu); rans_build_slot2sym(fr, cu, s2s) 86 let cap: i64=nsym + (nsym/2) + 1024; let senc: *u8=sys_mmap(cap) 87 let sym_payload: i64=rans_encode(sym, nsym, fr, cu, sb, senc, cap) 88 let modeled_total: i64=sym_payload + magbytes 89 // rANS lossless on symbols 90 let sdec: *u8=sys_mmap(nblk*70 + 1024); rans_decode(senc, sym_payload, nsym, fr, cu, sb, s2s, sdec) 91 var rans_ok: i64=1; var i3: i64=0; while i3<nsym { if sdec[i3]!=sym[i3] { rans_ok=0 } i3=i3+1 } 92 // modeled encode/decode lossless: jsym decode the symbols+magbits -> recover qall 93 let sp2: *i64=sys_mmap(8) as *i64; sp2[0]=0; let mpos: *i64=sys_mmap(8) as *i64; mpos[0]=0 94 var model_ok: i64=1; var mdc: i64=0; let zzm: *i64=sys_mmap(64*8) as *i64; b=0 95 while b<nblk { mdc=jsym_decode_block(sym, sp2, magbuf, mpos, mdc, zzm); var i: i64=0; while i<64 { if zzm[i]!=qall[b*64+i] { model_ok=0 } i=i+1 } b=b+1 } 96 97 let grade: i64=rd_grade(modeled_total, jpeg_bytes) 98 99 g_puts("-- image " as *u8); g_num(W); g_puts("x" as *u8); g_num(H); g_puts(" blocks=" as *u8); g_num(nblk); g_puts(" symbols=" as *u8); g_num(nsym); g_puts("\n" as *u8) 100 g_puts("-- IDENTICAL symbols + magnitude bits, equal quality. Entropy output bytes:\n" as *u8) 101 g_puts(" JPEG-Huffman : " as *u8); g_num(jpeg_bytes); g_puts("B\n" as *u8) 102 g_puts(" our rANS(model): " as *u8); g_num(modeled_total); g_puts("B (symbols " as *u8); g_num(sym_payload); g_puts(" + magbits " as *u8); g_num(magbytes); g_puts(")\n" as *u8) 103 g_puts(" vs naive rANS : 5571B (the un-modeled floor)\n" as *u8) 104 g_puts(" GRADE (rANS-modeled vs JPEG-Huffman, equal quality): " as *u8); g_grade(grade); g_puts("\n" as *u8) 105 106 var pass: i64=0; let rows: i64=6 107 pass=pass+g_check(" T1 JPEG entropy lossless" as *u8, jpeg_ok) 108 pass=pass+g_check(" T2 modeled encode/decode lossless (coeffs recovered)" as *u8, model_ok) 109 pass=pass+g_check(" T3 rANS(symbols) lossless" as *u8, rans_ok) 110 var t4: i64=0; if modeled_total < 5571 { t4=1 } 111 pass=pass+g_check(" T4 modeling fix BEATS naive rANS (<5571B)" as *u8, t4) 112 var t5: i64=0 113 if modeled_total < jpeg_bytes { if grade==GRADE_EXCEEDS { t5=1 } } 114 if modeled_total > jpeg_bytes { if grade==GRADE_BEHIND { t5=1 } } 115 if modeled_total == jpeg_bytes { if grade==GRADE_PARITY { t5=1 } } 116 pass=pass+g_check(" T5 grade matches measured sizes (honest)" as *u8, t5) 117 var t6: i64=0; if rd_grade(900, 800)==GRADE_BEHIND { t6=1 } 118 pass=pass+g_check(" T6 liar-kill: more bytes can NOT be graded a win" as *u8, t6) 119 120 g_puts("----\nRD2 rows=" as *u8); g_num(rows); g_puts(" pass=" as *u8); g_num(pass); g_puts("\n" as *u8) 121 let lg: i64=sys_openat_append("knowledge/status/codec_rd2_gate.log" as *u8, 0x1a4) 122 if lg>=0 { g_w(lg, "RD2 rows=" as *u8); g_wn(lg, rows); g_w(lg, " pass=" as *u8); g_wn(lg, pass); g_w(lg, " jpeg=" as *u8); g_wn(lg, jpeg_bytes); g_w(lg, " modeled=" as *u8); g_wn(lg, modeled_total); g_w(lg, " grade=" as *u8); g_wn(lg, grade); if pass==rows { g_w(lg, " verdict=GREEN\n" as *u8) } else { g_w(lg, " verdict=RED\n" as *u8) } sys_close(lg) } 123 if pass==rows { g_puts("RD2 GREEN (modeled rANS-vs-JPEG head-to-head, honest grade)\n" as *u8); sys_exit(0); return 0 } 124 g_puts("RD2 RED\n" as *u8); sys_exit(1); return 1 125}