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}