Slice-based API. Plain Go slices are the input model. Widened outputs. int8 and float32 storage widens into safer return types. Packed matrix kernels. GEMM-like batch workloads with pack-once-reuse-many semantics via DotsPackedMatrix. Symmetric self-similarity. SYRK-like kernels that skip duplicate (i, j) and (j, i) work. MaxSim late interaction. ColBERT-style scoring with pre-packed queries and documents via MaxSimPackedMatrix. Binary set metrics. Hamming and Jaccard on packed bit vectors and set-hash vectors. Probability metrics. Kullback-Leibler divergence and Jensen-Shannon distance. Geospatial included. HaversinesF64 and VincentysF64 are part of the same package. Capability bits exposed. You can inspect the runtime SIMD surface from Go.
§ Ecosystem Comparison
| Feature | NumKong | GoNum |
|---|---|---|
| Operation families | dots, distances, binary, probability, geospatial, MaxSim | dots, distances, some statistics |
| Precision | BFloat16 through sub-byte; automatic widening; Kahan summation; 0 ULP in Float32/Float64 | Float64 only; standard accuracy |
| Runtime SIMD dispatch | per call, the highest capability the CPU runs and the build holds, across x86, Arm, RISC-V | no runtime dispatch; some hand-written assembly routines |
| Packed matrix, GEMM-like | pack once, reuse across query batches via DotsPackedMatrix | mat.Dense.Mul — no persistent packing |
| Symmetric kernels, SYRK-like | skips duplicate pairs, up to 2x speedup for self-distance | no duplicate-pair skipping |
| Memory model | slice-based, caller-owned; cGo zero-copy pointer passing | allocates internally in many functions |
| Host-side parallelism | reusable WorkerPool for packed and symmetric batch ops | partial — gonum/optimize has some parallel support |