sketch_freq_directions_test.nx source
↩ module page · 125 lines · 4654 B
1// sketch_freq_directions_test.nx -- FD verification.
2//
3// Honest scope: validates the framework (alloc, insertion, shrink
4// triggering, total_rows counting, envelope) and a small known-case
5// SVD shrink on a near-diagonal 2x2 matrix. Larger-l SVD quality
6// is queued for v2 per the source-doc disclaimer.
7
8import "syscalls.nx"
9import "sketch_freq_directions.nx"
10import "sketch_types.nx"
11
12func iabs(x: i64) -> i64 {
13 if x < 0 { return -x }
14 return x
15}
16
17func main() -> i64 {
18 // ---- alloc rejection ----
19 if nx_fd_alloc(1, 4) != (0 as *FreqDir) { return __syscall(93, 1, 0, 0, 0, 0, 0) }
20 if nx_fd_alloc(5, 4) != (0 as *FreqDir) { return __syscall(93, 2, 0, 0, 0, 0, 0) }
21 if nx_fd_alloc(2, 0) != (0 as *FreqDir) { return __syscall(93, 3, 0, 0, 0, 0, 0) }
22 if nx_fd_alloc(2, 9) != (0 as *FreqDir) { return __syscall(93, 4, 0, 0, 0, 0, 0) }
23
24 // ---- alloc good ----
25 let fd: *FreqDir = nx_fd_alloc(2, 2)
26 if fd == (0 as *FreqDir) { return __syscall(93, 5, 0, 0, 0, 0, 0) }
27 if fd.l != 2 { return __syscall(93, 6, 0, 0, 0, 0, 0) }
28 if fd.d != 2 { return __syscall(93, 7, 0, 0, 0, 0, 0) }
29 if fd.total_rows != 0 { return __syscall(93, 8, 0, 0, 0, 0, 0) }
30
31 // ---- empty: top_sigma_sq = 0 ----
32 if nx_fd_top_sigma_sq(fd) != 0 { return __syscall(93, 10, 0, 0, 0, 0, 0) }
33
34 // ---- insert [1.0, 0] -> row 0 filled, row 1 still empty ----
35 let row1_raw: *u8 = sys_mmap(2 * 8)
36 let row1: *i64 = row1_raw as *i64
37 row1[0] = 16384
38 row1[1] = 0
39 let rc1: i64 = nx_fd_add_row(fd, row1, 2)
40 if rc1 != NX_FD_OK { return __syscall(93, 11, 0, 0, 0, 0, 0) }
41 if fd.total_rows != 1 { return __syscall(93, 12, 0, 0, 0, 0, 0) }
42 // row 1 should still be empty.
43 if nx_fd_empty_row_index(fd) != 1 { return __syscall(93, 13, 0, 0, 0, 0, 0) }
44
45 // ---- insert [0, 0.5] -> row 1 filled ----
46 let row2_raw: *u8 = sys_mmap(2 * 8)
47 let row2: *i64 = row2_raw as *i64
48 row2[0] = 0
49 row2[1] = 8192
50 nx_fd_add_row(fd, row2, 2)
51 if fd.total_rows != 2 { return __syscall(93, 14, 0, 0, 0, 0, 0) }
52 if nx_fd_empty_row_index(fd) != -1 { return __syscall(93, 15, 0, 0, 0, 0, 0) }
53
54 // ---- dim mismatch rejected ----
55 if nx_fd_add_row(fd, row1, 3) != NX_FD_ERR_DIM_MISMATCH {
56 return __syscall(93, 16, 0, 0, 0, 0, 0)
57 }
58
59 // ---- third insert triggers shrink ----
60 let row3_raw: *u8 = sys_mmap(2 * 8)
61 let row3: *i64 = row3_raw as *i64
62 row3[0] = 4096 // [0.25, 0.25]
63 row3[1] = 4096
64 let rc3: i64 = nx_fd_add_row(fd, row3, 2)
65 if rc3 != NX_FD_OK { return __syscall(93, 20, 0, 0, 0, 0, 0) }
66 if fd.total_rows != 3 { return __syscall(93, 21, 0, 0, 0, 0, 0) }
67 // After shrink + insert, no row should be exactly empty
68 // (the new row3 took the empty slot).
69 if nx_fd_empty_row_index(fd) != -1 {
70 return __syscall(93, 22, 0, 0, 0, 0, 0)
71 }
72
73 // ---- after shrink + insert, top_sigma_sq should be non-zero ----
74 let top: i64 = nx_fd_top_sigma_sq(fd)
75 if top <= 0 { return __syscall(93, 23, 0, 0, 0, 0, 0) }
76
77 // ---- stress: stream 50 rows on 3x4 sketch ----
78 let big: *FreqDir = nx_fd_alloc(3, 4)
79 if big == (0 as *FreqDir) { return __syscall(93, 30, 0, 0, 0, 0, 0) }
80 let bigrow_raw: *u8 = sys_mmap(4 * 8)
81 let bigrow: *i64 = bigrow_raw as *i64
82 var i: i64 = 0
83 while i < 50 {
84 bigrow[0] = (i * 137) & 16383
85 bigrow[1] = (i * 211) & 16383
86 bigrow[2] = (i * 379) & 16383
87 bigrow[3] = (i * 631) & 16383
88 nx_fd_add_row(big, bigrow, 4)
89 i = i + 1
90 }
91 if big.total_rows != 50 { return __syscall(93, 31, 0, 0, 0, 0, 0) }
92 // Top sigma should be non-trivial after 50 rows.
93 if nx_fd_top_sigma_sq(big) <= 0 {
94 return __syscall(93, 32, 0, 0, 0, 0, 0)
95 }
96 // Sketch shouldn't be fully zero -- at least one row has content.
97 var any_full: i64 = 0
98 var r: i64 = 0
99 while r < 3 {
100 if nx_fd_row_norm_sq(big, r) > 0 { any_full = 1 }
101 r = r + 1
102 }
103 if any_full != 1 { return __syscall(93, 33, 0, 0, 0, 0, 0) }
104
105 // ---- typed envelope ----
106 let q: *ApproxI64 = nx_fd_query_top(fd)
107 if q.envelope_kind != NX_ENV_REL_STDDEV {
108 return __syscall(93, 40, 0, 0, 0, 0, 0)
109 }
110 if q.conf_ppb != 682700000 {
111 return __syscall(93, 41, 0, 0, 0, 0, 0)
112 }
113 if q.maturity != NX_MATURITY_REFERENCE_IMPL {
114 return __syscall(93, 42, 0, 0, 0, 0, 0)
115 }
116 if q.adv_safety != NX_ADV_HONEST {
117 return __syscall(93, 43, 0, 0, 0, 0, 0)
118 }
119 // l=2 worst case: 100% rel err
120 if q.param_a != 1000000000 {
121 return __syscall(93, 44, 0, 0, 0, 0, 0)
122 }
123
124 return 0
125}