nx_group_composite_test.nx source
↩ module page · 77 lines · 3136 B
1import "nx_syscalls.nx"
2import "nx_group_composite.nx"
3
4func main() -> i64 {
5 let result: *i64 = (sys_mmap(NX_GRP_RES_FIELDS * 8 + 16)) as *i64
6 let char_scores: *i64 = (sys_mmap(8 * 8 + 16)) as *i64
7 let pair_scores: *i64 = (sys_mmap(16 * 8 + 16)) as *i64
8
9 // T1: Solo scene (1 character, no pairs). Character score 900 -> S_CLASS.
10 char_scores[0] = 900
11 nx_group_composite(char_scores, 1, pair_scores, 0, result)
12 let v1: i64 = result[NX_GRP_RES_VERDICT]
13 let c1: i64 = result[NX_GRP_RES_COMPOSITE_Q10]
14 if v1 != NX_GRP_S_CLASS { return 1 }
15 // 900*0.75 + 1024*0.25 = 675 + 256 = 931
16 if c1 < 920 { return 2 }
17 if c1 > 940 { return 3 }
18
19 // T2: Image #55 — two synced characters at 850 each + pair score 950.
20 char_scores[0] = 850
21 char_scores[1] = 850
22 pair_scores[0] = 950
23 nx_group_composite(char_scores, 2, pair_scores, 1, result)
24 let v2: i64 = result[NX_GRP_RES_VERDICT]
25 let c2: i64 = result[NX_GRP_RES_COMPOSITE_Q10]
26 // char_avg=850, pair_avg=950. composite = 850*0.75 + 950*0.25 = 637 + 237 = 875
27 if v2 != NX_GRP_S_CLASS { return 10 }
28 if c2 < 860 { return 11 }
29 if c2 > 890 { return 12 }
30
31 // T3: Three characters, one DISCORDANT pair drops verdict.
32 char_scores[0] = 800
33 char_scores[1] = 750
34 char_scores[2] = 200 // failed character
35 pair_scores[0] = 600
36 pair_scores[1] = 500
37 pair_scores[2] = 400
38 nx_group_composite(char_scores, 3, pair_scores, 3, result)
39 let v3: i64 = result[NX_GRP_RES_VERDICT]
40 let worst3: i64 = result[NX_GRP_RES_WORST_CHAR_SCORE]
41 if worst3 != 200 { return 20 }
42 // char_avg = (800+750+200)/3 = 583. pair_avg = (600+500+400)/3 = 500.
43 // composite = 583*0.75 + 500*0.25 = 437 + 125 = 562 -> PARTIAL.
44 // BUT worst_char 200 < 256 so even S_CLASS would downgrade; we're
45 // already PARTIAL so no further drop.
46 if v3 != NX_GRP_PARTIAL { return 21 }
47
48 // T4: All-failed scene. Composite below 410 -> FAILED.
49 char_scores[0] = 200
50 char_scores[1] = 250
51 pair_scores[0] = 200
52 nx_group_composite(char_scores, 2, pair_scores, 1, result)
53 let v4: i64 = result[NX_GRP_RES_VERDICT]
54 if v4 != NX_GRP_FAILED { return 30 }
55
56 // T5: Pair downgrade — high characters but one terrible pair.
57 char_scores[0] = 900
58 char_scores[1] = 900
59 pair_scores[0] = 200 // discordant
60 nx_group_composite(char_scores, 2, pair_scores, 1, result)
61 let v5: i64 = result[NX_GRP_RES_VERDICT]
62 let worst_p5: i64 = result[NX_GRP_RES_WORST_PAIR_SCORE]
63 if worst_p5 != 200 { return 40 }
64 // composite = 900*0.75 + 200*0.25 = 675 + 50 = 725. COHERENT band.
65 // BUT worst_pair 200 < 256 forces downgrade S_CLASS->COHERENT (no-op since
66 // we're already COHERENT).
67 if v5 != NX_GRP_COHERENT { return 41 }
68
69 // T6: Pair count 0 (solo) with low character score. No pair downgrade applies.
70 char_scores[0] = 300
71 nx_group_composite(char_scores, 1, pair_scores, 0, result)
72 let v6: i64 = result[NX_GRP_RES_VERDICT]
73 // composite = 300*0.75 + 1024*0.25 = 225 + 256 = 481 -> PARTIAL.
74 if v6 != NX_GRP_PARTIAL { return 50 }
75
76 return 0
77}