nx_rrf_test.nx source
↩ module page · 37 lines · 1304 B
1// nx_rrf_test.nx -- KAT for Reciprocal Rank Fusion.
2// Native sovereign lane; exit 0 = pass, N = assertion N failed.
3//
4// 3 items, 2 rankers: A=[0,1], B=[1,2]. item1 ranks in BOTH (rank2 in A +
5// rank1 in B) -> highest fused; item0 only in A (rank1); item2 only in B
6// (rank2). So fused: item1 > item0 > item2, and argmax == item1.
7
8import "fx.nx"
9import "nx_rrf.nx"
10
11func main() -> i64 {
12 let scores: *i64 = sys_mmap(3 * 8) as *i64
13 var i: i64 = 0
14 while i < 3 { scores[i] = 0; i = i + 1 }
15
16 let oA: *i64 = sys_mmap(2 * 8) as *i64
17 oA[0] = 0; oA[1] = 1
18 let oB: *i64 = sys_mmap(2 * 8) as *i64
19 oB[0] = 1; oB[1] = 2
20
21 nx_rrf_add(oA, 2, scores)
22 nx_rrf_add(oB, 2, scores)
23
24 // item1 appears in both rankers -> strictly highest
25 if scores[1] <= scores[0] { return 1 }
26 if scores[1] <= scores[2] { return 2 }
27 // item0 (rank1 in A: 1/61) beats item2 (rank2 in B: 1/62)
28 if scores[0] <= scores[2] { return 3 }
29 // exact integer values: 1/(60+1) and 1/(60+2) in Q16.16
30 if scores[0] != fx_from_frac(1, 61) { return 4 }
31 if scores[2] != fx_from_frac(1, 62) { return 5 }
32 if scores[1] != fx_from_frac(1, 62) + fx_from_frac(1, 61) { return 6 }
33 // argmax picks the both-rankers winner
34 if nx_rrf_argmax(scores, 3) != 1 { return 7 }
35
36 return 0
37}