code wiki / _hdl_build / nx_fec_state_gate.nx

nx_fec_state_gate.nx source

↩ module page · 88 lines · 5501 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" 15 16func 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 } 17// packet i content: byte b = (i*7 + b) & 0xff -- distinct + recognizable 18func fill_src(src: *u8, K: i64, S: i64) -> i64 { 19 var i: i64=0 20 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 } 21 return 0 22} 23func set_all(a: *i64, n: i64, v: i64) -> i64 { var i: i64=0; while i<n { a[i]=v; i=i+1 } return 0 } 24func erase(src: *u8, present: *i64, i: i64, S: i64) -> i64 { present[i]=0; fec_zero(fec_pkt(src, i, S), S); return 0 } 25func all_match(src: *u8, orig: *u8, K: i64, S: i64) -> i64 { 26 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 27} 28 29func main() -> i64 { 30 g_puts("nx_fec_state gate (sovereign zero-RTT loss recovery for state/event packets)\n" as *u8) 31 var pass: i64 = 0; var total: i64 = 0 32 33 let L: i64 = 4; let D: i64 = 3; let S: i64 = 16 34 let K: i64 = L * D // 12 source packets 35 let src: *u8 = sys_mmap(K * S) 36 let orig: *u8 = sys_mmap(K * S) 37 let rows: *u8 = sys_mmap(D * S) 38 let cols: *u8 = sys_mmap(L * S) 39 let present: *i64 = sys_mmap(K * 8) as *i64 40 let row_present: *i64 = sys_mmap(D * 8) as *i64 41 let col_present: *i64 = sys_mmap(L * 8) as *i64 42 43 // 1) FULL recovery from scattered + mixed loss 44 fill_src(src, K, S) 45 fill_src(orig, K, S) // keep a pristine copy 46 fec_encode_rows(src, L, D, S, rows) 47 fec_encode_cols(src, L, D, S, cols) 48 set_all(present, K, 1); set_all(row_present, D, 1); set_all(col_present, L, 1) 49 erase(src, present, 1, S) // row0 loses 2 (1,2) -> needs COLUMN parity (2-D) 50 erase(src, present, 2, S) 51 erase(src, present, 7, S) // row1 loses 1 (7) -> row parity 52 let rem: i64 = fec_decode_2d(src, L, D, S, present, rows, row_present, cols, col_present) 53 let ovh: i64 = fec_overhead_pct(FEC_2D, L, D) 54 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) 55 var r1: i64 = 1 56 if rem != 0 { r1 = 0 } 57 if all_match(src, orig, K, S) != 1 { r1 = 0 } 58 pass = pass + g_check("zero-RTT FULL recovery, byte-exact (no retransmit)" as *u8, r1); total=total+1 59 60 // 4) anti-tautology already inside r1 (byte-match), make it explicit on one recovered packet 61 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 62 63 // 2) adaptive scheme by measured loss 64 var r2: i64 = 1 65 if fec_scheme_for_loss(0) != FEC_NONE { r2 = 0 } 66 if fec_scheme_for_loss(2) != FEC_ROW { r2 = 0 } 67 if fec_scheme_for_loss(8) != FEC_2D { r2 = 0 } 68 pass = pass + g_check("adaptive: redundancy sized to measured loss (0->none,2->row,8->2D)" as *u8, r2); total=total+1 69 70 // 3) HONEST LIMIT (neg): a 2x2 erasure square is unrecoverable -> reports >0, no corruption 71 fill_src(src, K, S) 72 fec_encode_rows(src, L, D, S, rows) 73 fec_encode_cols(src, L, D, S, cols) 74 set_all(present, K, 1); set_all(row_present, D, 1); set_all(col_present, L, 1) 75 erase(src, present, 0, S); erase(src, present, 1, S) // rows 0/1 x cols 0/1 = a stuck square 76 erase(src, present, 4, S); erase(src, present, 5, S) 77 let rem2: i64 = fec_decode_2d(src, L, D, S, present, rows, row_present, cols, col_present) 78 var r3: i64 = 1 79 if rem2 != 4 { r3 = 0 } // honestly unrecoverable (no fake recovery) 80 if pkt_eq(fec_pkt(src,2,S), fec_pkt(orig,2,S), S) != 1 { r3 = 0 } // a survivor is untouched 81 if pkt_eq(fec_pkt(src,6,S), fec_pkt(orig,6,S), S) != 1 { r3 = 0 } 82 g_puts(" [measure] 2x2 erasure square -> still-missing=" as *u8); g_pn(rem2); g_puts(" (honest unrecoverable, survivors intact)\n" as *u8) 83 pass = pass + g_check("honest limit: 2x2 square reported unrecoverable, no corruption (neg)" as *u8, r3); total=total+1 84 85 g_puts("---- fec-state gate: passed " as *u8); g_pn(pass); g_puts(" / " as *u8); g_pn(total); g_puts(" ----\n" as *u8) 86 if pass == total { g_puts("verdict=GREEN\n" as *u8); sys_exit(0); return 0 } 87 g_puts("verdict=RED\n" as *u8); sys_exit(1); return 1 88}