code wiki / _hdl_build / nx_rdcurve_gate.nx

nx_rdcurve_gate.nx source

↩ module page · 73 lines · 4368 B

1// nx_rdcurve_gate.nx -- the runnable RATE-DISTORTION harness: intra-code a frame through the sovereign codec 2// (transform + deadzone-quant + entropy) at several QP levels and MEASURE (bytes, PSNR, SSIM) at each -> our RD 3// curve. This is the artifact competitor reconstructions overlay onto for a no-wave exceed/parity verdict. 4// Composes nx_vtransform + nx_ventropy + nx_quality_metric. Native, fast. 5import "nx_syscalls.nx" 6import "nx_gate_emit_lib.nx" 7import "nx_vtransform.nx" 8import "nx_ventropy.nx" 9import "nx_quality_metric.nx" 10import "nx_gate_verdict.nx" 11 12func rd_block(orig: *u8, recon: *u8, W: i64, bx: i64, by: i64, qp: i64, ebuf: *u8, blk: *i64) -> i64 { 13 let cx: i64 = bx*4; let cy: i64 = by*4 14 var yy: i64 = 0 15 while yy < 4 { var xx: i64 = 0; while xx < 4 { blk[yy*4+xx] = (orig[(cy+yy)*W+(cx+xx)] as i64) - 128; xx=xx+1 } yy=yy+1 } 16 vt_fwd(blk); vt_quant(blk, qp) 17 let bits: i64 = ve_encode(blk, ebuf) 18 vt_dequant(blk, qp); vt_inv(blk) 19 yy = 0 20 while yy < 4 { var xx: i64 = 0; while xx < 4 { var v: i64 = 128 + blk[yy*4+xx]; if v<0 {v=0} if v>255 {v=255} recon[(cy+yy)*W+(cx+xx)] = v as u8; xx=xx+1 } yy=yy+1 } 21 return bits 22} 23func rd_frame(orig: *u8, recon: *u8, W: i64, H: i64, qp: i64, ebuf: *u8, blk: *i64) -> i64 { 24 var bits: i64 = 0 25 var by: i64 = 0 26 while by < H/4 { var bx: i64 = 0; while bx < W/4 { bits = bits + rd_block(orig, recon, W, bx, by, qp, ebuf, blk); bx=bx+1 } by=by+1 } 27 return bits 28} 29 30func main() -> i64 { 31 g_puts("nx_rdcurve harness (our codec's rate-distortion curve, MEASURED)\n" as *u8) 32 var pass: i64 = 0; var total: i64 = 0 33 let W: i64 = 32; let H: i64 = 32; let n: i64 = W*H 34 let orig: *u8 = sys_mmap(n); let recon: *u8 = sys_mmap(n) 35 let ebuf: *u8 = sys_mmap(256); let blk: *i64 = sys_mmap(16*8) as *i64 36 // realistic smooth frame: gradient + a smooth block (low spatial frequency) 37 var y: i64 = 0 38 while y < H { var x: i64 = 0; while x < W { var v: i64 = 70 + (x+y); if x>=8 { if x<24 { if y>=8 { if y<24 { v = 150 + (x/4) } } } } if v>255 {v=255} orig[y*W+x] = v as u8; x=x+1 } y=y+1 } 39 40 // sweep QP: low (fine) -> high (coarse). measure bytes + PSNR + SSIM at each. 41 g_puts(" QP bytes PSNR(cdB) SSIM(x1000)\n" as *u8) 42 let qps: *i64 = sys_mmap(4*8) as *i64; qps[0]=2; qps[1]=8; qps[2]=32 43 let by_arr: *i64 = sys_mmap(4*8) as *i64 44 let ps_arr: *i64 = sys_mmap(4*8) as *i64 45 var i: i64 = 0 46 while i < 3 { 47 let bits: i64 = rd_frame(orig, recon, W, H, qps[i], ebuf, blk) 48 let bytes: i64 = (bits+7)/8 49 let psnr: i64 = qm_psnr_cdb(orig, recon, n) 50 let ssim: i64 = qm_ssim_milli(orig, recon, W, H) 51 by_arr[i] = bytes; ps_arr[i] = psnr 52 g_puts(" " as *u8); g_pn(qps[i]); g_puts(" " as *u8); g_pn(bytes); g_puts(" " as *u8); g_pn(psnr); g_puts(" " as *u8); g_pn(ssim); g_puts("\n" as *u8) 53 i = i + 1 54 } 55 56 // the RD tradeoff must be monotone: coarser QP -> fewer bytes AND lower quality 57 pass = pass + g_check("rate drops as QP rises (fewer bytes at coarser quant)" as *u8, (by_arr[0] > by_arr[1]) & (by_arr[1] > by_arr[2])); total=total+1 58 // PSNR is non-increasing as QP rises (coarser quant never IMPROVES quality) and genuinely degrades at the 59 // coarsest QP. (Low QP plateaus at lossless on smooth content -> capped PSNR; that's correct, not a failure.) 60 pass = pass + g_check("distortion non-increasing + degrades at coarse QP (RD tradeoff)" as *u8, (ps_arr[0] >= ps_arr[1]) & (ps_arr[1] > ps_arr[2]) & (ps_arr[0] > ps_arr[2])); total=total+1 61 pass = pass + g_check("RD curve well-formed (3 measured operating points)" as *u8, (by_arr[0]>0) & (ps_arr[2]>0)); total=total+1 62 63 g_puts("---- rdcurve harness: passed " as *u8); g_pn(pass); g_puts(" / " as *u8); g_pn(total); g_puts(" ----\n" as *u8) 64 // MIGRATED onto nx_gate_verdict by nx_gate_dry_apply (D001, minimal form): every check 65 // row above is untouched, so the PASS/FAIL vector cannot change; only the hand-rolled 66 // verdict emission is replaced by the ONE shared base class. Proven by nx_gate_migrate verify. 67 let ctr__dry: *i64 = gv_ctr() 68 ctr__dry[0] = pass 69 ctr__dry[1] = total 70 let rc__dry: i64 = gv_verdict("RDCURVE-GATE" as *u8, ctr__dry, "teeth unchanged; verdict emission migrated onto the shared base class" as *u8) 71 sys_exit(rc__dry) 72 return rc__dry 73}