nx_endgame_gate.nx source
↩ module page · 104 lines · 5704 B
1// nx_endgame_gate.nx -- KAT + negative controls for endgame last-piece racing.
2// Native sovereign lane; exit 0 = all pass, N = assertion N failed. Prints measured values.
3//
4// T1 in-flight refcount: eg_mark/eg_clear are exact and floor at 0
5// T2 NORMAL pick avoids an in-flight piece (no duplicate work) -> next-rarest
6// T3 NEG-CONTROL: NOT endgame (many pieces outstanding) -> never duplicate (-1), don't waste bw
7// T4 ENDGAME (few obtainable left, all in-flight) -> RACE the rarest in-flight needed piece
8// T5 NEG-CONTROL: in endgame, still only race a piece THIS peer HAS (peer-filter holds)
9// T6 NEG-CONTROL: a piece NO peer has (avail 0) is NEVER raced (honest 99.x% boundary) -> -1
10
11import "nx_endgame.nx"
12import "nx_assert.nx"
13
14func gset(bits: *u8, p: i64) -> i64 {
15 let byte: i64 = p / 8
16 let bit: i64 = 7 - (p - byte * 8)
17 bits[byte] = ((bits[byte] as i64) | (1 << bit)) as u8
18 return 0
19}
20
21// write the first n bytes of `path` from i64 values (precise availability/inflight setup).
22func setbytes(path: *u8, vals: *i64, n: i64) -> i64 {
23 let fd: i64 = am_open(path); if fd < 0 { return 0 - 1 }
24 let b: *u8 = sys_mmap(n + 16); var i: i64 = 0; while i < n { b[i] = vals[i] as u8; i = i + 1 }
25 sys_lseek(fd, 0, 0); sys_write(fd, b, n); sys_close(fd); return 0
26}
27
28func main() -> i64 {
29 let A: *u8 = "/tmp/_nx_eg_avail.bin" as *u8
30 let F: *u8 = "/tmp/_nx_eg_inflight.bin" as *u8
31 let npc: i64 = 8
32 let av: *i64 = sys_mmap(8*64) as *i64
33 let eff: *i64 = sys_mmap(8*64) as *i64
34 let inf: *i64 = sys_mmap(8*64) as *i64
35 let vals: *i64 = sys_mmap(8*64) as *i64
36
37 // ---- T1: in-flight refcount ----
38 eg_init(F, npc)
39 eg_mark(F, 3); eg_mark(F, 3) // inflight[3] = 2
40 am_load(F, inf, npc)
41 nx_puts_err("T1 inflight[3] after 2 marks="); nx_puti_err(inf[3])
42 if inf[3] != 2 { return 1 }
43 eg_clear(F, 3); am_load(F, inf, npc)
44 nx_puts_err("T1 inflight[3] after 1 clear="); nx_puti_err(inf[3])
45 if inf[3] != 1 { return 2 }
46 eg_clear(F, 3); eg_clear(F, 3); am_load(F, inf, npc) // floor at 0 (extra clear no-op)
47 nx_puts_err("T1 inflight[3] floored="); nx_puti_err(inf[3])
48 if inf[3] != 0 { return 3 }
49
50 // availability counts for pieces 0..7 = [1,2,3,4,5,6,7,8] (piece 0 = rarest)
51 var i: i64 = 0; while i < npc { vals[i] = i + 1; i = i + 1 }
52 setbytes(A, vals, npc)
53
54 let done: *u8 = sys_mmap(64) // all 0 = nothing downloaded
55 let peerAll: *u8 = sys_mmap(16); var pp: i64 = 0; while pp < npc { gset(peerAll, pp); pp = pp + 1 } // peer has all
56
57 // ---- T2: NORMAL avoids the in-flight rarest -> picks next-rarest ----
58 eg_init(F, npc); eg_mark(F, 0) // piece 0 (rarest) already in-flight elsewhere
59 let g2: i64 = eg_pick(A, F, done, peerAll, 16, 1, npc, 2, av, eff, inf)
60 nx_puts_err("T2 pick(piece0 in-flight)="); nx_puti_err(g2)
61 if g2 != 1 { return 4 } // skips in-flight 0, rarest fresh = 1
62
63 // ---- T3 NEG-CONTROL: not endgame (8 obtainable outstanding) -> no duplication ----
64 eg_init(F, npc); var m: i64 = 0; while m < npc { eg_mark(F, m); m = m + 1 } // ALL in-flight
65 let g3: i64 = eg_pick(A, F, done, peerAll, 16, 1, npc, 2, av, eff, inf) // threshold 2 << 8 outstanding
66 nx_puts_err("T3 pick(all in-flight, NOT endgame)="); nx_puti_err(g3)
67 if g3 != (0 - 1) { return 5 } // refuse to duplicate early -> -1
68
69 // ---- T4: ENDGAME -> race the rarest in-flight needed piece ----
70 // pieces 0..5 done; 6,7 needed (avail 7,8); both in-flight elsewhere; obtainable-remaining = 2 <= 2
71 let done2: *u8 = sys_mmap(64); var d: i64 = 0; while d < 6 { done2[d] = 1 as u8; d = d + 1 }
72 eg_init(F, npc); eg_mark(F, 6); eg_mark(F, 7)
73 let g4: i64 = eg_pick(A, F, done2, peerAll, 16, 1, npc, 2, av, eff, inf)
74 nx_puts_err("T4 pick(endgame, race)="); nx_puti_err(g4)
75 if g4 != 6 { return 6 } // rarest of {6:7, 7:8} = 6
76
77 // ---- T5 NEG-CONTROL: endgame still respects peer-has (peer only has 7, not 6) ----
78 let peer7: *u8 = sys_mmap(16); gset(peer7, 7)
79 let g5: i64 = eg_pick(A, F, done2, peer7, 16, 1, npc, 2, av, eff, inf)
80 nx_puts_err("T5 pick(endgame, peer has only 7)="); nx_puti_err(g5)
81 if g5 != 7 { return 7 } // races 7 (the one it has), never 6 it lacks
82
83 // ---- T6 NEG-CONTROL: a piece NO peer has (avail 0) is never raced ----
84 // pieces 0..6 done; piece 7 needed but avail[7]=0 (no seeder has it); obtainable-remaining = 0
85 var w: i64 = 0; while w < npc { vals[w] = w + 1; w = w + 1 } vals[7] = 0 // avail = [1..7,0]
86 setbytes(A, vals, npc)
87 let done3: *u8 = sys_mmap(64); var e: i64 = 0; while e < 7 { done3[e] = 1 as u8; e = e + 1 }
88 eg_init(F, npc); eg_mark(F, 7)
89 let g6: i64 = eg_pick(A, F, done3, peerAll, 16, 1, npc, 2, av, eff, inf)
90 nx_puts_err("T6 pick(piece7 unobtainable, avail=0)="); nx_puti_err(g6)
91 if g6 != (0 - 1) { return 8 } // no phantom race for data the swarm lacks
92
93 // ---- T7: have-all seeder (havebits=0, no bitfield, avail all 0) still picks ----
94 // pieces 0,1,2 done; 3..7 needed; no in-flight. Seeder has everything -> lowest-index needed = 3.
95 var zr: i64 = 0; while zr < npc { vals[zr] = 0; zr = zr + 1 } setbytes(A, vals, npc) // avail all 0
96 eg_init(F, npc)
97 let done4: *u8 = sys_mmap(64); done4[0]=1 as u8; done4[1]=1 as u8; done4[2]=1 as u8
98 let g7: i64 = eg_pick(A, F, done4, peerAll, 16, 0, npc, 2, av, eff, inf) // havebits=0
99 nx_puts_err("T7 pick(have-all seeder, avail=0)="); nx_puti_err(g7)
100 if g7 != 3 { return 9 }
101
102 nx_puts_err("nx_endgame_gate verdict=GREEN pass="); nx_puti_err(9)
103 return 0
104}