code wiki / (root) / nx_group_composite_test.nx

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}