nx_sketch_count_sketch.nx
buildroot/runtime/nx_sketch_count_sketch.nx
about
sketch_count_sketch.nx -- CountSketch (Charikar-Chen-Farach-Colton 2002).
Frequency-counting variant that gives UNBIASED estimates via ±1
sign hashing. Each (key, count) update adds s_j(key) * count to
row j column h_j(key), where s_j ∈ {-1, +1} is a sign hash.
Query: median of (s_j(key) * counter[j][h_j(key)]) across rows.
COMPLEMENTS CMS (runtime/sketch_cms.nx):
- CMS: always OVERESTIMATES (false positives via positive collisions).
Use when "upper bound" matters.
- CountSketch: UNBIASED. Use when expectation matters (statistical
summaries, F_2 estimation, sparse-approximation literature).
CAPABILITY STOMP: shipping both means callers pick by error semantics.
DataSketches ships CMS as "FrequentLongs"; CountSketch is queued in
their docs but not implemented.
ERROR BOUND:
|estimate(x) - f(x)| <= ε · ||f||_2 / sqrt(d)
where ||f||_2 = sqrt(Σ f_i²) is the L2 norm of the frequency vector.
For w = O(1/ε²) and d = O(log(1/δ)) rows: confidence 1-δ.
Default params: d=5 rows, w=2048 columns -> conf >99%, ε ~ 0.022.
dependencies 2 imports · 0 importers
imports: nx_syscalls.nxnx_sketch_types.nx
imported by: nobody (leaf or entry point)
structs
| 39 | struct CountSketch |
consts
| 34 | const NX_CS_MIN_D: i64 = 3 |
| 35 | const NX_CS_MAX_D: i64 = 32 |
| 36 | const NX_CS_MIN_W: i64 = 64 |
| 37 | const NX_CS_MAX_W: i64 = 65536 |
functions
| 49 | func nx_cs_alloc(d: i64, w: i64, seed: i64) -> *CountSketch |
| 77 | func nx_cs_h1(c: *CountSketch, key: i64) -> i64 called by 1: nx_cs_column |
| 82 | func nx_cs_h2(c: *CountSketch, key: i64) -> i64 called by 1: nx_cs_column |
| 87 | func nx_cs_column(c: *CountSketch, key: i64, j: i64) -> i64 |
| 93 | func nx_cs_sign(c: *CountSketch, key: i64, j: i64) -> i64 |
| 101 | func nx_cs_cell_idx(c: *CountSketch, j: i64, col: i64) -> i64 |
| 107 | func nx_cs_add(c: *CountSketch, key: i64, count: i64) -> i64 |
| 127 | func nx_cs_estimate(c: *CountSketch, key: i64) -> i64 |
| 168 | func nx_cs_isqrt(x: i64) -> i64 called by 1: nx_cs_query |
| 186 | func nx_cs_conf_ppb(d: i64) -> i64 called by 1: nx_cs_query |
| 194 | func nx_cs_query(c: *CountSketch, key: i64) -> *ApproxI64 |
| 207 | func nx_cs_merge(a: *CountSketch, b: *CountSketch) -> *CountSketch calls 1: nx_cs_alloc |
| 222 | func nx_cs_memory_bytes(c: *CountSketch) -> i64 |