code wiki / (root) / sketch_freq_directions_test.nx

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}