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}