code wiki / _hdl_build / nx_fec_state_gate.nx

nx_fec_state_gate.nx source

↩ module page · 96 lines · 5944 B

1// nx_fec_state_gate.nx -- proves + MEASURES sovereign ZERO-RTT loss recovery for the multiplayer 2// state/event stream (composes nx_fec_xor). At 150ms+ mobile RTT you cannot afford a retransmit 3// round-trip; FEC parity recovers lost packets immediately at the receiver. Protects keyframes + 4// critical events (captures/edits); the position stream is already covered by interp/extrapolate. 5// 1) FULL recovery: a block of state packets with scattered + mixed (2x1) loss recovers byte-EXACT, 6// zero retransmit (fec_decode_2d returns 0 missing) -- measured overhead % 7// 2) adaptive: fec_scheme_for_loss(0)=NONE, (2%)=ROW, (8%)=2D (redundancy sized to measured loss) 8// 3) HONEST LIMIT (neg): a 2x2 erasure square is unrecoverable -> decode returns >0 (NOT a fake 9// recovery) and does NOT corrupt the surviving packets 10// 4) anti-tautology: a recovered packet byte-MATCHES its original (real reconstruction, not "present") 11// Built nx_cc_sovereign -> nxasm_x86 (no gcc, no .sh). license_tier: ORIGINAL 12import "nx_syscalls.nx" 13import "nx_gate_emit_lib.nx" 14import "nx_fec_xor.nx" 15import "nx_gate_verdict.nx" 16 17func pkt_eq(a: *u8, b: *u8, S: i64) -> i64 { var i: i64=0; while i<S { if a[i]!=b[i] { return 0 } i=i+1 } return 1 } 18// packet i content: byte b = (i*7 + b) & 0xff -- distinct + recognizable 19func fill_src(src: *u8, K: i64, S: i64) -> i64 { 20 var i: i64=0 21 while i < K { let p: *u8 = fec_pkt(src, i, S); var b: i64=0; while b<S { p[b]=((i*7+b)&0xff) as u8; b=b+1 } i=i+1 } 22 return 0 23} 24func set_all(a: *i64, n: i64, v: i64) -> i64 { var i: i64=0; while i<n { a[i]=v; i=i+1 } return 0 } 25func erase(src: *u8, present: *i64, i: i64, S: i64) -> i64 { present[i]=0; fec_zero(fec_pkt(src, i, S), S); return 0 } 26func all_match(src: *u8, orig: *u8, K: i64, S: i64) -> i64 { 27 var i: i64=0; while i<K { if pkt_eq(fec_pkt(src,i,S), fec_pkt(orig,i,S), S)!=1 { return 0 } i=i+1 } return 1 28} 29 30func main() -> i64 { 31 g_puts("nx_fec_state gate (sovereign zero-RTT loss recovery for state/event packets)\n" as *u8) 32 var pass: i64 = 0; var total: i64 = 0 33 34 let L: i64 = 4; let D: i64 = 3; let S: i64 = 16 35 let K: i64 = L * D // 12 source packets 36 let src: *u8 = sys_mmap(K * S) 37 let orig: *u8 = sys_mmap(K * S) 38 let rows: *u8 = sys_mmap(D * S) 39 let cols: *u8 = sys_mmap(L * S) 40 let present: *i64 = sys_mmap(K * 8) as *i64 41 let row_present: *i64 = sys_mmap(D * 8) as *i64 42 let col_present: *i64 = sys_mmap(L * 8) as *i64 43 44 // 1) FULL recovery from scattered + mixed loss 45 fill_src(src, K, S) 46 fill_src(orig, K, S) // keep a pristine copy 47 fec_encode_rows(src, L, D, S, rows) 48 fec_encode_cols(src, L, D, S, cols) 49 set_all(present, K, 1); set_all(row_present, D, 1); set_all(col_present, L, 1) 50 erase(src, present, 1, S) // row0 loses 2 (1,2) -> needs COLUMN parity (2-D) 51 erase(src, present, 2, S) 52 erase(src, present, 7, S) // row1 loses 1 (7) -> row parity 53 let rem: i64 = fec_decode_2d(src, L, D, S, present, rows, row_present, cols, col_present) 54 let ovh: i64 = fec_overhead_pct(FEC_2D, L, D) 55 g_puts(" [measure] 12 pkts, lost 3 (scattered+2-in-a-row), 2-D FEC overhead=" as *u8); g_pn(ovh); g_puts("%, still-missing after recover=" as *u8); g_pn(rem); g_puts("\n" as *u8) 56 var r1: i64 = 1 57 if rem != 0 { r1 = 0 } 58 if all_match(src, orig, K, S) != 1 { r1 = 0 } 59 pass = pass + g_check("zero-RTT FULL recovery, byte-exact (no retransmit)" as *u8, r1); total=total+1 60 61 // 4) anti-tautology already inside r1 (byte-match), make it explicit on one recovered packet 62 pass = pass + g_check("recovered packet 1 byte-matches original (real reconstruction)" as *u8, pkt_eq(fec_pkt(src,1,S), fec_pkt(orig,1,S), S)); total=total+1 63 64 // 2) adaptive scheme by measured loss 65 var r2: i64 = 1 66 if fec_scheme_for_loss(0) != FEC_NONE { r2 = 0 } 67 if fec_scheme_for_loss(2) != FEC_ROW { r2 = 0 } 68 if fec_scheme_for_loss(8) != FEC_2D { r2 = 0 } 69 pass = pass + g_check("adaptive: redundancy sized to measured loss (0->none,2->row,8->2D)" as *u8, r2); total=total+1 70 71 // 3) HONEST LIMIT (neg): a 2x2 erasure square is unrecoverable -> reports >0, no corruption 72 fill_src(src, K, S) 73 fec_encode_rows(src, L, D, S, rows) 74 fec_encode_cols(src, L, D, S, cols) 75 set_all(present, K, 1); set_all(row_present, D, 1); set_all(col_present, L, 1) 76 erase(src, present, 0, S); erase(src, present, 1, S) // rows 0/1 x cols 0/1 = a stuck square 77 erase(src, present, 4, S); erase(src, present, 5, S) 78 let rem2: i64 = fec_decode_2d(src, L, D, S, present, rows, row_present, cols, col_present) 79 var r3: i64 = 1 80 if rem2 != 4 { r3 = 0 } // honestly unrecoverable (no fake recovery) 81 if pkt_eq(fec_pkt(src,2,S), fec_pkt(orig,2,S), S) != 1 { r3 = 0 } // a survivor is untouched 82 if pkt_eq(fec_pkt(src,6,S), fec_pkt(orig,6,S), S) != 1 { r3 = 0 } 83 g_puts(" [measure] 2x2 erasure square -> still-missing=" as *u8); g_pn(rem2); g_puts(" (honest unrecoverable, survivors intact)\n" as *u8) 84 pass = pass + g_check("honest limit: 2x2 square reported unrecoverable, no corruption (neg)" as *u8, r3); total=total+1 85 86 g_puts("---- fec-state gate: passed " as *u8); g_pn(pass); g_puts(" / " as *u8); g_pn(total); g_puts(" ----\n" as *u8) 87 // MIGRATED onto nx_gate_verdict by nx_gate_dry_apply (D001, minimal form): every check 88 // row above is untouched, so the PASS/FAIL vector cannot change; only the hand-rolled 89 // verdict emission is replaced by the ONE shared base class. Proven by nx_gate_migrate verify. 90 let ctr__dry: *i64 = gv_ctr() 91 ctr__dry[0] = pass 92 ctr__dry[1] = total 93 let rc__dry: i64 = gv_verdict("FEC-STATE-GATE" as *u8, ctr__dry, "teeth unchanged; verdict emission migrated onto the shared base class" as *u8) 94 sys_exit(rc__dry) 95 return rc__dry 96}