code wiki / (root) / nx_token_permutation_test.nx

nx_token_permutation_test.nx source

↩ module page · 98 lines · 4442 B

1// nx_token_permutation_test.nx -- smoke + the user's 4-permutation case. 2// 3// Uses token-id stand-ins for the user's literal example: 4// 1 = "beautiful" 5// 2 = "tall" 6// 3 = "girl" 7// 4 = "very" (the "add another word" case) 8 9import "nx_syscalls.nx" 10import "nx_tier.nx" 11import "nx_token_permutation.nx" 12 13func _set3(buf: *i64, a: nx_int, b: nx_int, c: nx_int) -> nx_int { 14 buf[0] = a 15 buf[1] = b 16 buf[2] = c 17 return 0 18} 19 20func main() -> nx_int { 21 let rep: *PermutationReport = (sys_mmap(8 * NX_SIZEOF_NX_INT)) as *PermutationReport 22 23 // === USER'S CASE 1: "beautiful tall girl" vs "tall beautiful girl" === 24 // Tokens: [1, 2, 3] vs [2, 1, 3] 25 // Single adjacent transposition. position_0 changed. 26 let s_btg: *i64 = (sys_mmap(4 * NX_SIZEOF_NX_INT)) as *i64 27 _set3(s_btg, 1, 2, 3) 28 let s_tbg: *i64 = (sys_mmap(4 * NX_SIZEOF_NX_INT)) as *i64 29 _set3(s_tbg, 2, 1, 3) 30 nx_token_permutation_compute(s_btg, 3, s_tbg, 3, rep) 31 if rep.same_multi_set != 1 { return 1 } 32 if rep.n_inversions != 1 { return 2 } 33 if rep.verdict != NX_PERMUT_ADJACENT_SWAP { return 3 } 34 if rep.position_0_changed != 1 { return 4 } 35 if rep.position_last_changed != 0 { return 5 } // "girl" stayed in position 2 36 37 // === USER'S CASE 2: "beautiful tall girl" vs "girl tall beautiful" === 38 // Tokens: [1, 2, 3] vs [3, 2, 1] 39 // 3 inversions (max for n=3); tau = -1 q10 ~ -1024; SEVERE_REORDER. 40 let s_gtb: *i64 = (sys_mmap(4 * NX_SIZEOF_NX_INT)) as *i64 41 _set3(s_gtb, 3, 2, 1) 42 nx_token_permutation_compute(s_btg, 3, s_gtb, 3, rep) 43 if rep.same_multi_set != 1 { return 10 } 44 if rep.n_inversions != 3 { return 11 } // max for n=3 45 if rep.verdict != NX_PERMUT_SEVERE_REORDER { return 12 } 46 if rep.position_0_changed != 1 { return 13 } 47 if rep.position_last_changed != 1 { return 14 } 48 // All 2 neighbor pairs in the reversed sequence are new 49 // (girl-tall and tall-beautiful weren't adjacent in beautiful-tall-girl 50 // beautiful-tall WAS adjacent but only in that direction; substrate 51 // checks directional adjacency so reversed pairs count as new). 52 if rep.n_new_neighbors != 2 { return 15 } 53 54 // === USER'S CASE 3: "beautiful tall girl" vs "girl beautiful tall" === 55 // Tokens: [1, 2, 3] vs [3, 1, 2] 56 // 2 inversions; tau = (1 - 2*2/3) ~ -0.33 q10 ~ -341; SEVERE. 57 let s_gbt: *i64 = (sys_mmap(4 * NX_SIZEOF_NX_INT)) as *i64 58 _set3(s_gbt, 3, 1, 2) 59 nx_token_permutation_compute(s_btg, 3, s_gbt, 3, rep) 60 if rep.same_multi_set != 1 { return 20 } 61 if rep.n_inversions != 2 { return 21 } 62 if rep.position_0_changed != 1 { return 22 } 63 if rep.position_last_changed != 1 { return 23 } 64 if rep.verdict != NX_PERMUT_SEVERE_REORDER { return 24 } 65 66 // === USER'S CASE 4: "beautiful tall girl" vs "beautiful tall girl" === 67 // Identical. 68 let s_btg2: *i64 = (sys_mmap(4 * NX_SIZEOF_NX_INT)) as *i64 69 _set3(s_btg2, 1, 2, 3) 70 nx_token_permutation_compute(s_btg, 3, s_btg2, 3, rep) 71 if rep.same_multi_set != 1 { return 30 } 72 if rep.n_inversions != 0 { return 31 } 73 if rep.verdict != NX_PERMUT_IDENTICAL { return 32 } 74 if rep.kendall_tau_q10 != NX_PERMUT_Q { return 33 } 75 76 // === USER'S "ADD A WORD" CASE: "beautiful tall girl" vs 77 // "very beautiful tall girl" === 78 // Different multi-sets (left has 3 tokens, right has 4). 79 // Substrate routes to NOT_PERMUTATION -- correct signal that 80 // permutation analysis doesn't apply; caller should fall back 81 // to per-token L1 semantics + position-mass model. 82 let s_vbtg: *i64 = (sys_mmap(8 * NX_SIZEOF_NX_INT)) as *i64 83 s_vbtg[0] = 4 // very 84 s_vbtg[1] = 1 // beautiful 85 s_vbtg[2] = 2 // tall 86 s_vbtg[3] = 3 // girl 87 nx_token_permutation_compute(s_btg, 3, s_vbtg, 4, rep) 88 if rep.same_multi_set != 0 { return 40 } 89 if rep.verdict != NX_PERMUT_NOT_PERMUTATION { return 41 } 90 91 // === Sealed-enum validity === 92 if nx_token_permutation_verdict_is_valid(NX_PERMUT_IDENTICAL) != 1 { return 50 } 93 if nx_token_permutation_verdict_is_valid(NX_PERMUT_NOT_PERMUTATION) != 1 { return 51 } 94 if nx_token_permutation_verdict_is_valid(99) != 0 { return 52 } 95 if nx_token_permutation_verdict_is_valid(0 - 1) != 0 { return 53 } 96 97 return 0 98}