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}