usearch 2.21.3 → 2.25.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +24 -24
- package/binding.gyp +15 -37
- package/c/CMakeLists.txt +4 -5
- package/c/README.md +7 -7
- package/c/lib.cpp +32 -14
- package/c/test.c +83 -1
- package/c/usearch.h +24 -3
- package/cpp/CMakeLists.txt +4 -0
- package/cpp/README.md +5 -5
- package/cpp/bench.cpp +97 -116
- package/cpp/test.cpp +117 -20
- package/include/usearch/index.hpp +235 -52
- package/include/usearch/index_dense.hpp +105 -40
- package/include/usearch/index_plugins.hpp +1387 -204
- package/javascript/dist/cjs/usearch.d.ts +8 -3
- package/javascript/dist/cjs/usearch.js +12 -4
- package/javascript/dist/esm/usearch.d.ts +8 -3
- package/javascript/dist/esm/usearch.js +12 -4
- package/javascript/lib.cpp +17 -0
- package/javascript/usearch.ts +14 -6
- package/numkong/.clang-tidy +30 -0
- package/{simsimd → numkong}/.cmake-format.py +18 -0
- package/numkong/.editorconfig +12 -0
- package/numkong/.git-blame-ignore-revs +123 -0
- package/numkong/.mailmap +15 -0
- package/numkong/.spi.yml +11 -0
- package/numkong/.swift-format +14 -0
- package/numkong/CITATION.cff +81 -0
- package/numkong/CONTRIBUTING.md +500 -0
- package/numkong/Cargo.toml +54 -0
- package/numkong/MANIFEST.in +8 -0
- package/numkong/Package.swift +84 -0
- package/numkong/README.md +569 -0
- package/numkong/bench/README.md +217 -0
- package/numkong/bench/bench-browser.html +323 -0
- package/numkong/bench/bench.cpp +344 -0
- package/numkong/bench/bench.hpp +816 -0
- package/numkong/bench/bench.js +148 -0
- package/numkong/bench/bench.mjs +616 -0
- package/numkong/bench/bench_attention.cpp +113 -0
- package/numkong/bench/bench_cast.cpp +264 -0
- package/numkong/bench/bench_cross_amx.cpp +62 -0
- package/numkong/bench/bench_cross_arm.cpp +245 -0
- package/numkong/bench/bench_cross_blas.cpp +309 -0
- package/numkong/bench/bench_cross_loongarch.cpp +106 -0
- package/numkong/bench/bench_cross_power.cpp +84 -0
- package/numkong/bench/bench_cross_rvv.cpp +121 -0
- package/numkong/bench/bench_cross_serial.cpp +151 -0
- package/numkong/bench/bench_cross_sme.cpp +163 -0
- package/numkong/bench/bench_cross_wasm.cpp +142 -0
- package/numkong/bench/bench_cross_x86.cpp +455 -0
- package/numkong/bench/bench_curved.cpp +210 -0
- package/numkong/bench/bench_dot.cpp +315 -0
- package/numkong/bench/bench_each.cpp +503 -0
- package/numkong/bench/bench_geospatial.cpp +112 -0
- package/numkong/bench/bench_maxsim.cpp +154 -0
- package/numkong/bench/bench_mesh.cpp +148 -0
- package/numkong/bench/bench_probability.cpp +60 -0
- package/numkong/bench/bench_reduce.cpp +371 -0
- package/numkong/bench/bench_set.cpp +73 -0
- package/numkong/bench/bench_sparse.cpp +198 -0
- package/numkong/bench/bench_spatial.cpp +347 -0
- package/numkong/bench/bench_trigonometry.cpp +137 -0
- package/numkong/bench/swift/Bench.swift +506 -0
- package/numkong/binding.gyp +169 -0
- package/numkong/build.rs +484 -0
- package/numkong/c/dispatch.h +512 -0
- package/numkong/c/dispatch_bf16.c +447 -0
- package/numkong/c/dispatch_bf16c.c +52 -0
- package/numkong/c/dispatch_e2m3.c +296 -0
- package/numkong/c/dispatch_e3m2.c +284 -0
- package/numkong/c/dispatch_e4m3.c +318 -0
- package/numkong/c/dispatch_e5m2.c +316 -0
- package/numkong/c/dispatch_f16.c +452 -0
- package/numkong/c/dispatch_f16c.c +58 -0
- package/numkong/c/dispatch_f32.c +434 -0
- package/numkong/c/dispatch_f32c.c +99 -0
- package/numkong/c/dispatch_f64.c +348 -0
- package/numkong/c/dispatch_f64c.c +98 -0
- package/numkong/c/dispatch_i16.c +96 -0
- package/numkong/c/dispatch_i32.c +89 -0
- package/numkong/c/dispatch_i4.c +153 -0
- package/numkong/c/dispatch_i64.c +86 -0
- package/numkong/c/dispatch_i8.c +348 -0
- package/numkong/c/dispatch_other.c +348 -0
- package/numkong/c/dispatch_u1.c +193 -0
- package/numkong/c/dispatch_u16.c +124 -0
- package/numkong/c/dispatch_u32.c +118 -0
- package/numkong/c/dispatch_u4.c +153 -0
- package/numkong/c/dispatch_u64.c +102 -0
- package/numkong/c/dispatch_u8.c +364 -0
- package/numkong/c/numkong.c +940 -0
- package/numkong/cmake/nk_arm_isa_probes.cmake +61 -0
- package/numkong/cmake/nk_isa_probe.cmake +90 -0
- package/numkong/cmake/nk_loongarch_isa_probes.cmake +15 -0
- package/numkong/cmake/nk_math_lib.cmake +46 -0
- package/numkong/cmake/nk_power_isa_probes.cmake +15 -0
- package/numkong/cmake/nk_riscv_isa_probes.cmake +19 -0
- package/numkong/cmake/nk_x86_isa_probes.cmake +35 -0
- package/numkong/cmake/toolchain-aarch64-gnu.cmake +86 -0
- package/numkong/cmake/toolchain-android-arm64.cmake +25 -0
- package/numkong/cmake/toolchain-android-armv7.cmake +25 -0
- package/numkong/cmake/toolchain-loongarch64-gnu.cmake +68 -0
- package/numkong/cmake/toolchain-ppc64le-gnu.cmake +74 -0
- package/numkong/cmake/toolchain-riscv64-gnu.cmake +107 -0
- package/numkong/cmake/toolchain-riscv64-llvm.cmake +114 -0
- package/numkong/cmake/toolchain-wasi.cmake +77 -0
- package/numkong/cmake/toolchain-wasm.cmake +70 -0
- package/numkong/cmake/toolchain-wasm64.cmake +62 -0
- package/numkong/cmake/toolchain-x86_64-llvm.cmake +47 -0
- package/numkong/include/README.md +643 -0
- package/numkong/include/module.modulemap +129 -0
- package/numkong/include/numkong/attention/sapphireamx.h +1363 -0
- package/numkong/include/numkong/attention/sme.h +2075 -0
- package/numkong/include/numkong/attention.h +49 -0
- package/numkong/include/numkong/capabilities.h +930 -0
- package/numkong/include/numkong/cast/README.md +262 -0
- package/numkong/include/numkong/cast/diamond.h +64 -0
- package/numkong/include/numkong/cast/haswell.h +823 -0
- package/numkong/include/numkong/cast/icelake.h +475 -0
- package/numkong/include/numkong/cast/loongsonasx.h +252 -0
- package/numkong/include/numkong/cast/neon.h +1174 -0
- package/numkong/include/numkong/cast/powervsx.h +449 -0
- package/numkong/include/numkong/cast/rvv.h +970 -0
- package/numkong/include/numkong/cast/sapphire.h +262 -0
- package/numkong/include/numkong/cast/serial.h +2336 -0
- package/numkong/include/numkong/cast/skylake.h +915 -0
- package/numkong/include/numkong/cast/v128relaxed.h +537 -0
- package/numkong/include/numkong/cast.h +254 -0
- package/numkong/include/numkong/cast.hpp +44 -0
- package/numkong/include/numkong/curved/README.md +223 -0
- package/numkong/include/numkong/curved/genoa.h +182 -0
- package/numkong/include/numkong/curved/haswell.h +276 -0
- package/numkong/include/numkong/curved/neon.h +329 -0
- package/numkong/include/numkong/curved/neonbfdot.h +211 -0
- package/numkong/include/numkong/curved/rvv.h +305 -0
- package/numkong/include/numkong/curved/serial.h +207 -0
- package/numkong/include/numkong/curved/skylake.h +457 -0
- package/numkong/include/numkong/curved/smef64.h +530 -0
- package/numkong/include/numkong/curved.h +513 -0
- package/numkong/include/numkong/curved.hpp +144 -0
- package/numkong/include/numkong/dot/README.md +442 -0
- package/numkong/include/numkong/dot/alder.h +563 -0
- package/numkong/include/numkong/dot/diamond.h +158 -0
- package/numkong/include/numkong/dot/genoa.h +289 -0
- package/numkong/include/numkong/dot/haswell.h +1723 -0
- package/numkong/include/numkong/dot/icelake.h +997 -0
- package/numkong/include/numkong/dot/loongsonasx.h +671 -0
- package/numkong/include/numkong/dot/neon.h +869 -0
- package/numkong/include/numkong/dot/neonbfdot.h +243 -0
- package/numkong/include/numkong/dot/neonfhm.h +358 -0
- package/numkong/include/numkong/dot/neonfp8.h +323 -0
- package/numkong/include/numkong/dot/neonsdot.h +622 -0
- package/numkong/include/numkong/dot/powervsx.h +752 -0
- package/numkong/include/numkong/dot/rvv.h +722 -0
- package/numkong/include/numkong/dot/rvvbb.h +72 -0
- package/numkong/include/numkong/dot/rvvbf16.h +123 -0
- package/numkong/include/numkong/dot/rvvhalf.h +129 -0
- package/numkong/include/numkong/dot/sapphire.h +141 -0
- package/numkong/include/numkong/dot/serial.h +874 -0
- package/numkong/include/numkong/dot/sierra.h +405 -0
- package/numkong/include/numkong/dot/skylake.h +1116 -0
- package/numkong/include/numkong/dot/sve.h +420 -0
- package/numkong/include/numkong/dot/svebfdot.h +75 -0
- package/numkong/include/numkong/dot/svehalf.h +168 -0
- package/numkong/include/numkong/dot/svesdot.h +90 -0
- package/numkong/include/numkong/dot/v128relaxed.h +1293 -0
- package/numkong/include/numkong/dot.h +1136 -0
- package/numkong/include/numkong/dot.hpp +94 -0
- package/numkong/include/numkong/dots/README.md +496 -0
- package/numkong/include/numkong/dots/alder.h +117 -0
- package/numkong/include/numkong/dots/diamond.h +86 -0
- package/numkong/include/numkong/dots/genoa.h +100 -0
- package/numkong/include/numkong/dots/graniteamx.h +733 -0
- package/numkong/include/numkong/dots/haswell.h +310 -0
- package/numkong/include/numkong/dots/icelake.h +180 -0
- package/numkong/include/numkong/dots/loongsonasx.h +176 -0
- package/numkong/include/numkong/dots/neon.h +123 -0
- package/numkong/include/numkong/dots/neonbfdot.h +59 -0
- package/numkong/include/numkong/dots/neonfhm.h +96 -0
- package/numkong/include/numkong/dots/neonfp8.h +99 -0
- package/numkong/include/numkong/dots/neonsdot.h +144 -0
- package/numkong/include/numkong/dots/powervsx.h +194 -0
- package/numkong/include/numkong/dots/rvv.h +2593 -0
- package/numkong/include/numkong/dots/sapphireamx.h +4017 -0
- package/numkong/include/numkong/dots/serial.h +2867 -0
- package/numkong/include/numkong/dots/sierra.h +100 -0
- package/numkong/include/numkong/dots/skylake.h +207 -0
- package/numkong/include/numkong/dots/sme.h +5041 -0
- package/numkong/include/numkong/dots/smebi32.h +477 -0
- package/numkong/include/numkong/dots/smef64.h +1328 -0
- package/numkong/include/numkong/dots/smehalf.h +47 -0
- package/numkong/include/numkong/dots/v128relaxed.h +317 -0
- package/numkong/include/numkong/dots.h +3110 -0
- package/numkong/include/numkong/dots.hpp +641 -0
- package/numkong/include/numkong/each/README.md +465 -0
- package/numkong/include/numkong/each/haswell.h +1658 -0
- package/numkong/include/numkong/each/icelake.h +272 -0
- package/numkong/include/numkong/each/neon.h +1138 -0
- package/numkong/include/numkong/each/neonbfdot.h +211 -0
- package/numkong/include/numkong/each/neonhalf.h +318 -0
- package/numkong/include/numkong/each/rvv.h +1121 -0
- package/numkong/include/numkong/each/sapphire.h +343 -0
- package/numkong/include/numkong/each/serial.h +282 -0
- package/numkong/include/numkong/each/skylake.h +1562 -0
- package/numkong/include/numkong/each/v128relaxed.h +562 -0
- package/numkong/include/numkong/each.h +2232 -0
- package/numkong/include/numkong/each.hpp +434 -0
- package/numkong/include/numkong/geospatial/README.md +147 -0
- package/numkong/include/numkong/geospatial/haswell.h +633 -0
- package/numkong/include/numkong/geospatial/neon.h +615 -0
- package/numkong/include/numkong/geospatial/rvv.h +701 -0
- package/numkong/include/numkong/geospatial/serial.h +309 -0
- package/numkong/include/numkong/geospatial/skylake.h +613 -0
- package/numkong/include/numkong/geospatial/v128relaxed.h +652 -0
- package/numkong/include/numkong/geospatial.h +453 -0
- package/numkong/include/numkong/geospatial.hpp +235 -0
- package/numkong/include/numkong/matrix.hpp +336 -0
- package/numkong/include/numkong/maxsim/README.md +187 -0
- package/numkong/include/numkong/maxsim/alder.h +511 -0
- package/numkong/include/numkong/maxsim/genoa.h +115 -0
- package/numkong/include/numkong/maxsim/haswell.h +553 -0
- package/numkong/include/numkong/maxsim/icelake.h +480 -0
- package/numkong/include/numkong/maxsim/neonsdot.h +394 -0
- package/numkong/include/numkong/maxsim/sapphireamx.h +877 -0
- package/numkong/include/numkong/maxsim/serial.h +490 -0
- package/numkong/include/numkong/maxsim/sme.h +993 -0
- package/numkong/include/numkong/maxsim/v128relaxed.h +280 -0
- package/numkong/include/numkong/maxsim.h +571 -0
- package/numkong/include/numkong/maxsim.hpp +133 -0
- package/numkong/include/numkong/mesh/README.md +219 -0
- package/numkong/include/numkong/mesh/haswell.h +2013 -0
- package/numkong/include/numkong/mesh/neon.h +1821 -0
- package/numkong/include/numkong/mesh/neonbfdot.h +771 -0
- package/numkong/include/numkong/mesh/rvv.h +936 -0
- package/numkong/include/numkong/mesh/serial.h +721 -0
- package/numkong/include/numkong/mesh/skylake.h +2344 -0
- package/numkong/include/numkong/mesh/v128relaxed.h +1081 -0
- package/numkong/include/numkong/mesh.h +666 -0
- package/numkong/include/numkong/mesh.hpp +701 -0
- package/numkong/include/numkong/numkong.h +78 -0
- package/numkong/include/numkong/numkong.hpp +58 -0
- package/numkong/include/numkong/probability/README.md +177 -0
- package/numkong/include/numkong/probability/haswell.h +267 -0
- package/numkong/include/numkong/probability/neon.h +255 -0
- package/numkong/include/numkong/probability/rvv.h +414 -0
- package/numkong/include/numkong/probability/serial.h +181 -0
- package/numkong/include/numkong/probability/skylake.h +324 -0
- package/numkong/include/numkong/probability.h +380 -0
- package/numkong/include/numkong/probability.hpp +120 -0
- package/numkong/include/numkong/random.h +50 -0
- package/numkong/include/numkong/random.hpp +285 -0
- package/numkong/include/numkong/reduce/README.md +552 -0
- package/numkong/include/numkong/reduce/alder.h +636 -0
- package/numkong/include/numkong/reduce/genoa.h +201 -0
- package/numkong/include/numkong/reduce/haswell.h +3785 -0
- package/numkong/include/numkong/reduce/icelake.h +549 -0
- package/numkong/include/numkong/reduce/neon.h +3980 -0
- package/numkong/include/numkong/reduce/neonbfdot.h +142 -0
- package/numkong/include/numkong/reduce/neonfhm.h +293 -0
- package/numkong/include/numkong/reduce/neonsdot.h +357 -0
- package/numkong/include/numkong/reduce/rvv.h +3533 -0
- package/numkong/include/numkong/reduce/serial.h +753 -0
- package/numkong/include/numkong/reduce/sierra.h +338 -0
- package/numkong/include/numkong/reduce/skylake.h +3794 -0
- package/numkong/include/numkong/reduce/sve.h +52 -0
- package/numkong/include/numkong/reduce/v128relaxed.h +2302 -0
- package/numkong/include/numkong/reduce.h +1582 -0
- package/numkong/include/numkong/reduce.hpp +778 -0
- package/numkong/include/numkong/scalar/README.md +89 -0
- package/numkong/include/numkong/scalar/haswell.h +122 -0
- package/numkong/include/numkong/scalar/loongsonasx.h +74 -0
- package/numkong/include/numkong/scalar/neon.h +122 -0
- package/numkong/include/numkong/scalar/neonhalf.h +70 -0
- package/numkong/include/numkong/scalar/powervsx.h +96 -0
- package/numkong/include/numkong/scalar/rvv.h +211 -0
- package/numkong/include/numkong/scalar/sapphire.h +74 -0
- package/numkong/include/numkong/scalar/serial.h +332 -0
- package/numkong/include/numkong/scalar/v128relaxed.h +56 -0
- package/numkong/include/numkong/scalar.h +696 -0
- package/numkong/include/numkong/set/README.md +179 -0
- package/numkong/include/numkong/set/haswell.h +334 -0
- package/numkong/include/numkong/set/icelake.h +485 -0
- package/numkong/include/numkong/set/loongsonasx.h +181 -0
- package/numkong/include/numkong/set/neon.h +363 -0
- package/numkong/include/numkong/set/powervsx.h +326 -0
- package/numkong/include/numkong/set/rvv.h +226 -0
- package/numkong/include/numkong/set/rvvbb.h +117 -0
- package/numkong/include/numkong/set/serial.h +174 -0
- package/numkong/include/numkong/set/sve.h +187 -0
- package/numkong/include/numkong/set/v128relaxed.h +240 -0
- package/numkong/include/numkong/set.h +471 -0
- package/numkong/include/numkong/set.hpp +114 -0
- package/numkong/include/numkong/sets/README.md +149 -0
- package/numkong/include/numkong/sets/haswell.h +63 -0
- package/numkong/include/numkong/sets/icelake.h +66 -0
- package/numkong/include/numkong/sets/loongsonasx.h +52 -0
- package/numkong/include/numkong/sets/neon.h +61 -0
- package/numkong/include/numkong/sets/powervsx.h +65 -0
- package/numkong/include/numkong/sets/serial.h +43 -0
- package/numkong/include/numkong/sets/smebi32.h +1135 -0
- package/numkong/include/numkong/sets/v128relaxed.h +58 -0
- package/numkong/include/numkong/sets.h +382 -0
- package/numkong/include/numkong/sparse/README.md +156 -0
- package/numkong/include/numkong/sparse/icelake.h +463 -0
- package/numkong/include/numkong/sparse/neon.h +288 -0
- package/numkong/include/numkong/sparse/serial.h +117 -0
- package/numkong/include/numkong/sparse/sve2.h +504 -0
- package/numkong/include/numkong/sparse/turin.h +322 -0
- package/numkong/include/numkong/sparse.h +363 -0
- package/numkong/include/numkong/sparse.hpp +113 -0
- package/numkong/include/numkong/spatial/README.md +439 -0
- package/numkong/include/numkong/spatial/alder.h +604 -0
- package/numkong/include/numkong/spatial/diamond.h +240 -0
- package/numkong/include/numkong/spatial/genoa.h +222 -0
- package/numkong/include/numkong/spatial/haswell.h +979 -0
- package/numkong/include/numkong/spatial/icelake.h +1067 -0
- package/numkong/include/numkong/spatial/loongsonasx.h +483 -0
- package/numkong/include/numkong/spatial/neon.h +846 -0
- package/numkong/include/numkong/spatial/neonbfdot.h +164 -0
- package/numkong/include/numkong/spatial/neonfp8.h +258 -0
- package/numkong/include/numkong/spatial/neonsdot.h +429 -0
- package/numkong/include/numkong/spatial/powervsx.h +738 -0
- package/numkong/include/numkong/spatial/rvv.h +991 -0
- package/numkong/include/numkong/spatial/rvvbf16.h +128 -0
- package/numkong/include/numkong/spatial/rvvhalf.h +120 -0
- package/numkong/include/numkong/spatial/serial.h +347 -0
- package/numkong/include/numkong/spatial/sierra.h +516 -0
- package/numkong/include/numkong/spatial/skylake.h +605 -0
- package/numkong/include/numkong/spatial/sve.h +246 -0
- package/numkong/include/numkong/spatial/svebfdot.h +125 -0
- package/numkong/include/numkong/spatial/svehalf.h +136 -0
- package/numkong/include/numkong/spatial/svesdot.h +143 -0
- package/numkong/include/numkong/spatial/v128relaxed.h +969 -0
- package/numkong/include/numkong/spatial.h +1681 -0
- package/numkong/include/numkong/spatial.hpp +183 -0
- package/numkong/include/numkong/spatials/README.md +580 -0
- package/numkong/include/numkong/spatials/alder.h +94 -0
- package/numkong/include/numkong/spatials/diamond.h +82 -0
- package/numkong/include/numkong/spatials/genoa.h +94 -0
- package/numkong/include/numkong/spatials/graniteamx.h +173 -0
- package/numkong/include/numkong/spatials/haswell.h +219 -0
- package/numkong/include/numkong/spatials/icelake.h +113 -0
- package/numkong/include/numkong/spatials/loongsonasx.h +153 -0
- package/numkong/include/numkong/spatials/neon.h +109 -0
- package/numkong/include/numkong/spatials/neonbfdot.h +60 -0
- package/numkong/include/numkong/spatials/neonfhm.h +92 -0
- package/numkong/include/numkong/spatials/neonfp8.h +111 -0
- package/numkong/include/numkong/spatials/neonsdot.h +143 -0
- package/numkong/include/numkong/spatials/powervsx.h +153 -0
- package/numkong/include/numkong/spatials/rvv.h +1976 -0
- package/numkong/include/numkong/spatials/sapphireamx.h +1149 -0
- package/numkong/include/numkong/spatials/serial.h +248 -0
- package/numkong/include/numkong/spatials/sierra.h +96 -0
- package/numkong/include/numkong/spatials/skylake.h +184 -0
- package/numkong/include/numkong/spatials/sme.h +1927 -0
- package/numkong/include/numkong/spatials/smef64.h +483 -0
- package/numkong/include/numkong/spatials/v128relaxed.h +240 -0
- package/numkong/include/numkong/spatials.h +3374 -0
- package/numkong/include/numkong/spatials.hpp +509 -0
- package/numkong/include/numkong/tensor.hpp +1981 -0
- package/numkong/include/numkong/trigonometry/README.md +184 -0
- package/numkong/include/numkong/trigonometry/haswell.h +653 -0
- package/numkong/include/numkong/trigonometry/neon.h +638 -0
- package/numkong/include/numkong/trigonometry/rvv.h +700 -0
- package/numkong/include/numkong/trigonometry/serial.h +703 -0
- package/numkong/include/numkong/trigonometry/skylake.h +725 -0
- package/numkong/include/numkong/trigonometry/v128relaxed.h +667 -0
- package/numkong/include/numkong/trigonometry.h +467 -0
- package/numkong/include/numkong/trigonometry.hpp +166 -0
- package/numkong/include/numkong/types.h +1695 -0
- package/numkong/include/numkong/types.hpp +6027 -0
- package/numkong/include/numkong/vector.hpp +766 -0
- package/numkong/javascript/@numkong-darwin-arm64/package.json +26 -0
- package/numkong/javascript/@numkong-darwin-x64/package.json +26 -0
- package/numkong/javascript/@numkong-linux-arm64/package.json +25 -0
- package/numkong/javascript/@numkong-linux-x64/package.json +25 -0
- package/numkong/javascript/@numkong-win32-arm64/package.json +25 -0
- package/numkong/javascript/@numkong-win32-x64/package.json +25 -0
- package/numkong/javascript/README.md +254 -0
- package/numkong/javascript/node-gyp-build.d.ts +4 -0
- package/numkong/javascript/numkong-browser.ts +40 -0
- package/numkong/javascript/numkong-wasm.ts +750 -0
- package/numkong/javascript/numkong.c +712 -0
- package/numkong/javascript/numkong.ts +613 -0
- package/{simsimd → numkong}/javascript/tsconfig-base.json +6 -3
- package/numkong/javascript/tsconfig-cjs.json +13 -0
- package/{simsimd → numkong}/javascript/tsconfig-esm.json +1 -1
- package/numkong/javascript/types.ts +784 -0
- package/numkong/numkong.gypi +104 -0
- package/numkong/package.json +108 -0
- package/numkong/probes/arm_neon.c +8 -0
- package/numkong/probes/arm_neon_bfdot.c +9 -0
- package/numkong/probes/arm_neon_fhm.c +9 -0
- package/numkong/probes/arm_neon_half.c +8 -0
- package/numkong/probes/arm_neon_sdot.c +9 -0
- package/numkong/probes/arm_neonfp8.c +9 -0
- package/numkong/probes/arm_sme.c +16 -0
- package/numkong/probes/arm_sme2.c +16 -0
- package/numkong/probes/arm_sme2p1.c +16 -0
- package/numkong/probes/arm_sme_bf16.c +16 -0
- package/numkong/probes/arm_sme_bi32.c +16 -0
- package/numkong/probes/arm_sme_f64.c +16 -0
- package/numkong/probes/arm_sme_fa64.c +14 -0
- package/numkong/probes/arm_sme_half.c +16 -0
- package/numkong/probes/arm_sme_lut2.c +15 -0
- package/numkong/probes/arm_sve.c +18 -0
- package/numkong/probes/arm_sve2.c +20 -0
- package/numkong/probes/arm_sve2p1.c +18 -0
- package/numkong/probes/arm_sve_bfdot.c +20 -0
- package/numkong/probes/arm_sve_half.c +18 -0
- package/numkong/probes/arm_sve_sdot.c +21 -0
- package/numkong/probes/loongarch_lasx.c +12 -0
- package/numkong/probes/power_vsx.c +12 -0
- package/numkong/probes/probe.js +127 -0
- package/numkong/probes/riscv_rvv.c +14 -0
- package/numkong/probes/riscv_rvv_bb.c +15 -0
- package/numkong/probes/riscv_rvv_bf16.c +17 -0
- package/numkong/probes/riscv_rvv_half.c +14 -0
- package/numkong/probes/wasm_v128relaxed.c +11 -0
- package/numkong/probes/x86_alder.c +17 -0
- package/numkong/probes/x86_diamond.c +17 -0
- package/numkong/probes/x86_genoa.c +17 -0
- package/numkong/probes/x86_graniteamx.c +19 -0
- package/numkong/probes/x86_haswell.c +11 -0
- package/numkong/probes/x86_icelake.c +17 -0
- package/numkong/probes/x86_sapphire.c +16 -0
- package/numkong/probes/x86_sapphireamx.c +18 -0
- package/numkong/probes/x86_sierra.c +17 -0
- package/numkong/probes/x86_skylake.c +15 -0
- package/numkong/probes/x86_turin.c +17 -0
- package/numkong/rust/README.md +698 -0
- package/numkong/rust/capabilities.rs +96 -0
- package/numkong/rust/cast.rs +314 -0
- package/numkong/rust/curved.rs +391 -0
- package/numkong/rust/each.rs +2721 -0
- package/numkong/rust/geospatial.rs +343 -0
- package/numkong/rust/matrix.rs +5424 -0
- package/numkong/rust/maxsim.rs +540 -0
- package/numkong/rust/mesh.rs +837 -0
- package/numkong/rust/numkong.rs +409 -0
- package/numkong/rust/probability.rs +272 -0
- package/numkong/rust/reduce.rs +1249 -0
- package/numkong/rust/set.rs +194 -0
- package/numkong/rust/sparse.rs +513 -0
- package/numkong/rust/spatial.rs +1815 -0
- package/numkong/rust/tensor.rs +7565 -0
- package/numkong/rust/types.rs +3666 -0
- package/numkong/rust/vector.rs +1899 -0
- package/numkong/rustfmt.toml +2 -0
- package/numkong/swift/Matrix.swift +1388 -0
- package/numkong/swift/MaxSim.swift +151 -0
- package/numkong/swift/NumKong.swift +283 -0
- package/numkong/swift/Numerics.swift +329 -0
- package/numkong/swift/README.md +433 -0
- package/numkong/swift/Scalar.swift +741 -0
- package/numkong/swift/Tensor.swift +209 -0
- package/numkong/test/README.md +315 -0
- package/numkong/test/playwright.config.ts +16 -0
- package/numkong/test/swift/Test.swift +534 -0
- package/numkong/test/test-browser-bundle-runner.mjs +36 -0
- package/numkong/test/test-browser-bundle.html +188 -0
- package/numkong/test/test-browser-runner.mjs +43 -0
- package/numkong/test/test-browser.html +305 -0
- package/numkong/test/test-dtypes.mjs +453 -0
- package/numkong/test/test-wasm.mjs +267 -0
- package/numkong/test/test.cpp +442 -0
- package/numkong/test/test.hpp +580 -0
- package/numkong/test/test.mjs +363 -0
- package/numkong/test/test_base.py +1041 -0
- package/numkong/test/test_cast.cpp +242 -0
- package/numkong/test/test_cross.hpp +551 -0
- package/numkong/test/test_cross.py +467 -0
- package/numkong/test/test_cross_amx.cpp +50 -0
- package/numkong/test/test_cross_arm.cpp +225 -0
- package/numkong/test/test_cross_blas.cpp +354 -0
- package/numkong/test/test_cross_loongarch.cpp +90 -0
- package/numkong/test/test_cross_power.cpp +73 -0
- package/numkong/test/test_cross_rvv.cpp +109 -0
- package/numkong/test/test_cross_serial.cpp +181 -0
- package/numkong/test/test_cross_sme.cpp +148 -0
- package/numkong/test/test_cross_wasm.cpp +141 -0
- package/numkong/test/test_cross_x86.cpp +442 -0
- package/numkong/test/test_curved.cpp +182 -0
- package/numkong/test/test_curved.py +207 -0
- package/numkong/test/test_dot.cpp +353 -0
- package/numkong/test/test_dot.py +296 -0
- package/numkong/test/test_each.cpp +437 -0
- package/numkong/test/test_each.py +756 -0
- package/numkong/test/test_geospatial.cpp +155 -0
- package/numkong/test/test_geospatial.py +241 -0
- package/numkong/test/test_maxsim.cpp +138 -0
- package/numkong/test/test_maxsim.py +209 -0
- package/numkong/test/test_mesh.cpp +203 -0
- package/numkong/test/test_mesh.py +394 -0
- package/numkong/test/test_probability.cpp +136 -0
- package/numkong/test/test_probability.py +166 -0
- package/numkong/test/test_reduce.cpp +563 -0
- package/numkong/test/test_reduce.py +781 -0
- package/numkong/test/test_set.cpp +151 -0
- package/numkong/test/test_set.py +120 -0
- package/numkong/test/test_similarities.py +579 -0
- package/numkong/test/test_sparse.cpp +121 -0
- package/numkong/test/test_sparse.py +118 -0
- package/numkong/test/test_spatial.cpp +518 -0
- package/numkong/test/test_spatial.py +269 -0
- package/numkong/test/test_tensor.cpp +884 -0
- package/numkong/test/test_tensor.py +1417 -0
- package/numkong/test/test_trigonometry.cpp +156 -0
- package/numkong/test/test_trigonometry.py +180 -0
- package/package.json +7 -8
- package/prebuilds/darwin-arm64+x64/usearch.node +0 -0
- package/prebuilds/linux-arm64/usearch.node +0 -0
- package/prebuilds/linux-x64/usearch.node +0 -0
- package/fp16/CMakeLists.txt +0 -176
- package/fp16/LICENSE +0 -11
- package/fp16/README.md +0 -20
- package/fp16/bench/alt-element.cc +0 -89
- package/fp16/bench/from-alt-array.cc +0 -175
- package/fp16/bench/from-ieee-array.cc +0 -399
- package/fp16/bench/ieee-element.cc +0 -272
- package/fp16/bench/to-alt-array.cc +0 -91
- package/fp16/bench/to-ieee-array.cc +0 -303
- package/fp16/cmake/DownloadGoogleBenchmark.cmake +0 -15
- package/fp16/cmake/DownloadGoogleTest.cmake +0 -15
- package/fp16/cmake/DownloadPSimd.cmake +0 -15
- package/fp16/configure.py +0 -65
- package/fp16/confu.yaml +0 -8
- package/fp16/include/fp16/__init__.py +0 -0
- package/fp16/include/fp16/avx.py +0 -50
- package/fp16/include/fp16/avx2.py +0 -53
- package/fp16/include/fp16/bitcasts.h +0 -92
- package/fp16/include/fp16/fp16.h +0 -451
- package/fp16/include/fp16/psimd.h +0 -131
- package/fp16/include/fp16.h +0 -11
- package/fp16/jni/Android.mk +0 -6
- package/fp16/jni/Application.mk +0 -4
- package/fp16/test/alt-from-fp32-value.cc +0 -498
- package/fp16/test/alt-to-fp32-bits.cc +0 -263
- package/fp16/test/alt-to-fp32-psimd.cc +0 -145
- package/fp16/test/alt-to-fp32-value.cc +0 -348
- package/fp16/test/alt-to-fp32x2-psimd.cc +0 -245
- package/fp16/test/bitcasts.cc +0 -56
- package/fp16/test/ieee-from-fp32-value.cc +0 -523
- package/fp16/test/ieee-to-fp32-bits.cc +0 -333
- package/fp16/test/ieee-to-fp32-psimd.cc +0 -312
- package/fp16/test/ieee-to-fp32-value.cc +0 -420
- package/fp16/test/ieee-to-fp32x2-psimd.cc +0 -541
- package/fp16/test/peachpy/alt-xmm-to-fp32-xmm-avx.cc +0 -96
- package/fp16/test/peachpy/alt-xmm-to-fp32-ymm-avx2.cc +0 -96
- package/fp16/test/peachpy/stubs.py +0 -38
- package/fp16/test/tables.cc +0 -530
- package/fp16/test/tables.h +0 -13
- package/fp16/third-party/THHalf.h +0 -92
- package/fp16/third-party/eigen-half.h +0 -170
- package/fp16/third-party/float16-compressor.h +0 -80
- package/fp16/third-party/half.hpp +0 -2916
- package/fp16/third-party/npy-halffloat.h +0 -328
- package/simsimd/.git-blame-ignore-revs +0 -2
- package/simsimd/CONTRIBUTING.md +0 -321
- package/simsimd/Cargo.toml +0 -49
- package/simsimd/MANIFEST.in +0 -4
- package/simsimd/Package.swift +0 -28
- package/simsimd/README.md +0 -1493
- package/simsimd/binding.gyp +0 -35
- package/simsimd/build.rs +0 -70
- package/simsimd/c/lib.c +0 -374
- package/simsimd/include/module.modulemap +0 -4
- package/simsimd/include/simsimd/binary.h +0 -486
- package/simsimd/include/simsimd/curved.h +0 -1541
- package/simsimd/include/simsimd/dot.h +0 -1853
- package/simsimd/include/simsimd/elementwise.h +0 -2465
- package/simsimd/include/simsimd/geospatial.h +0 -43
- package/simsimd/include/simsimd/mesh.h +0 -69
- package/simsimd/include/simsimd/probability.h +0 -606
- package/simsimd/include/simsimd/simsimd.h +0 -2567
- package/simsimd/include/simsimd/sparse.h +0 -1384
- package/simsimd/include/simsimd/spatial.h +0 -2335
- package/simsimd/include/simsimd/types.h +0 -666
- package/simsimd/javascript/fallback.ts +0 -233
- package/simsimd/javascript/lib.c +0 -125
- package/simsimd/javascript/node-gyp-build.d.ts +0 -1
- package/simsimd/javascript/simsimd.ts +0 -179
- package/simsimd/javascript/tsconfig-cjs.json +0 -8
- package/simsimd/package-lock.json +0 -1761
- package/simsimd/package.json +0 -61
- package/simsimd/rust/lib.rs +0 -1821
- package/simsimd/scripts/bench.cxx +0 -1170
- package/simsimd/scripts/bench.ipynb +0 -187
- package/simsimd/scripts/bench.js +0 -127
- package/simsimd/scripts/bench.rs +0 -876
- package/simsimd/scripts/bench_vectors.py +0 -734
- package/simsimd/scripts/bench_vectors_live.py +0 -213
- package/simsimd/scripts/test.c +0 -187
- package/simsimd/scripts/test.mjs +0 -220
- package/simsimd/scripts/test.py +0 -1505
- package/simsimd/swift/SimSIMD.swift +0 -149
- package/simsimd/swift/Test.swift +0 -128
- /package/{simsimd → numkong}/CODE_OF_CONDUCT.md +0 -0
- /package/{simsimd → numkong}/LICENSE +0 -0
- /package/{simsimd → numkong}/javascript/dist-package-cjs.json +0 -0
- /package/{simsimd → numkong}/javascript/dist-package-esm.json +0 -0
|
@@ -1,213 +0,0 @@
|
|
|
1
|
-
#!/usr/bin/env python3
|
|
2
|
-
# -*- coding: utf-8 -*-
|
|
3
|
-
"""
|
|
4
|
-
Module: bench_vectors_live.py
|
|
5
|
-
|
|
6
|
-
This script visualizes the performance difference between SimSIMD and default
|
|
7
|
-
numerics libraries like NumPy and SimSIMD for the most common kernels.
|
|
8
|
-
|
|
9
|
-
One plot contains information about one distance function, but many data types
|
|
10
|
-
and libraries. For each benchmark, the baseline is the NumPy/SciPy distance function
|
|
11
|
-
applied to `float64` input data. The "x" axis represents the growth in the number of
|
|
12
|
-
dimensions of the input vectors, while the "y" axis represents the speedup factor
|
|
13
|
-
of every kernel against the baseline.
|
|
14
|
-
"""
|
|
15
|
-
import os
|
|
16
|
-
import argparse
|
|
17
|
-
from typing import List
|
|
18
|
-
|
|
19
|
-
import numpy as np
|
|
20
|
-
|
|
21
|
-
import perfplot
|
|
22
|
-
|
|
23
|
-
from bench_vectors import (
|
|
24
|
-
metric_families,
|
|
25
|
-
dtype_names,
|
|
26
|
-
Kernel,
|
|
27
|
-
yield_kernels,
|
|
28
|
-
random_matrix,
|
|
29
|
-
)
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
def ndim_argument(value):
|
|
33
|
-
if value == "default":
|
|
34
|
-
return [2**k for k in range(16)]
|
|
35
|
-
try:
|
|
36
|
-
# Split the input string by commas and convert each part to an integer
|
|
37
|
-
return [int(x) for x in value.split(",")]
|
|
38
|
-
except ValueError:
|
|
39
|
-
raise argparse.ArgumentTypeError("Value must be 'default' or a comma-separated list of integers")
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
def main():
|
|
43
|
-
# Argument parsing
|
|
44
|
-
parser = argparse.ArgumentParser(description="Visualize Performance Difference between SimSIMD and other libraries")
|
|
45
|
-
parser.add_argument(
|
|
46
|
-
"--ndim-min",
|
|
47
|
-
type=int,
|
|
48
|
-
default=2,
|
|
49
|
-
help="",
|
|
50
|
-
)
|
|
51
|
-
parser.add_argument(
|
|
52
|
-
"--ndim-max",
|
|
53
|
-
type=int,
|
|
54
|
-
default=1024 * 1024,
|
|
55
|
-
help="",
|
|
56
|
-
)
|
|
57
|
-
parser.add_argument(
|
|
58
|
-
"-o",
|
|
59
|
-
"--output-path",
|
|
60
|
-
type=str,
|
|
61
|
-
default=None,
|
|
62
|
-
help="File to save the plot to (default: None, plot is shown live)",
|
|
63
|
-
)
|
|
64
|
-
parser.add_argument(
|
|
65
|
-
"-n",
|
|
66
|
-
"--count",
|
|
67
|
-
type=int,
|
|
68
|
-
default=1,
|
|
69
|
-
help="""Number of vectors per batch (default: 1)
|
|
70
|
-
|
|
71
|
-
By default, when set to 1 the benchmark will generate many vectors of size (ndim, )
|
|
72
|
-
and call the functions on pairs of single vectors: both directly, and through `cdist`.
|
|
73
|
-
Alternatively, for larger batch sizes the benchmark will generate two matrices of
|
|
74
|
-
size (n, ndim) and compute:
|
|
75
|
-
|
|
76
|
-
- batch mode: (n) distances between vectors in identical rows of the two matrices,
|
|
77
|
-
- all-pairs mode: (n^2) distances between all pairs of vectors in the two matrices via `cdist`.
|
|
78
|
-
""",
|
|
79
|
-
)
|
|
80
|
-
parser.add_argument(
|
|
81
|
-
"--mode",
|
|
82
|
-
choices=["batch", "all-pairs"],
|
|
83
|
-
default="batch",
|
|
84
|
-
help="""Choose between 'batch' and 'all-pairs' mode (default: batch)
|
|
85
|
-
|
|
86
|
-
In 'batch' mode, the latency will generate two matrices of size (n, ndim)
|
|
87
|
-
and compute (n) distances between vectors in identical rows of the two matrices.
|
|
88
|
-
In 'all-pairs' mode, the latency will generate two matrices of size (n, ndim)
|
|
89
|
-
and compute (n^2) distances between all pairs of vectors in the two matrices via `cdist`.
|
|
90
|
-
""",
|
|
91
|
-
)
|
|
92
|
-
parser.add_argument(
|
|
93
|
-
"--metric",
|
|
94
|
-
choices=metric_families,
|
|
95
|
-
default="dot",
|
|
96
|
-
help=f"Distance metric to use, profiles `dot` by default",
|
|
97
|
-
)
|
|
98
|
-
parser.add_argument(
|
|
99
|
-
"--dtype",
|
|
100
|
-
choices=dtype_names,
|
|
101
|
-
default="float64",
|
|
102
|
-
help=f"Defines numeric types to latency, profiles `float64` by default",
|
|
103
|
-
)
|
|
104
|
-
parser.add_argument("--scipy", action="store_true", help="Profile SciPy, must be installed")
|
|
105
|
-
parser.add_argument("--scikit", action="store_true", help="Profile scikit-learn, must be installed")
|
|
106
|
-
parser.add_argument("--torch", action="store_true", help="Profile PyTorch, must be installed")
|
|
107
|
-
parser.add_argument("--tf", action="store_true", help="Profile TensorFlow, must be installed")
|
|
108
|
-
parser.add_argument("--jax", action="store_true", help="Profile JAX, must be installed")
|
|
109
|
-
|
|
110
|
-
args = parser.parse_args()
|
|
111
|
-
assert args.count > 0, "Number of vectors per batch must be greater than 0"
|
|
112
|
-
assert args.ndim_min > 0, "Number of dimensions must be greater than 0"
|
|
113
|
-
assert args.ndim_max > 0, "Number of dimensions must be greater than 0"
|
|
114
|
-
|
|
115
|
-
ndim_range = [args.ndim_min]
|
|
116
|
-
while ndim_range[-1] <= args.ndim_max:
|
|
117
|
-
ndim_range.append(ndim_range[-1] * 2)
|
|
118
|
-
|
|
119
|
-
kernels: List[Kernel] = list(
|
|
120
|
-
yield_kernels(
|
|
121
|
-
[args.metric],
|
|
122
|
-
dtype_names,
|
|
123
|
-
include_scipy=args.scipy,
|
|
124
|
-
include_scikit=args.scikit,
|
|
125
|
-
include_torch=args.torch,
|
|
126
|
-
include_tf=args.tf,
|
|
127
|
-
include_jax=args.jax,
|
|
128
|
-
)
|
|
129
|
-
)
|
|
130
|
-
if len(kernels) == 0:
|
|
131
|
-
raise RuntimeError("No kernels found!")
|
|
132
|
-
|
|
133
|
-
def precomputed_flops(ndim: int) -> int:
|
|
134
|
-
if args.mode == "all-pairs":
|
|
135
|
-
return ndim * (args.count**2)
|
|
136
|
-
else:
|
|
137
|
-
return ndim * (args.count)
|
|
138
|
-
|
|
139
|
-
def generate_matrix(ndim: int) -> np.ndarray:
|
|
140
|
-
if args.count == 1:
|
|
141
|
-
return random_matrix(1, ndim, dtype=args.dtype).flatten()
|
|
142
|
-
else:
|
|
143
|
-
return random_matrix(args.count, ndim, dtype=args.dtype)
|
|
144
|
-
|
|
145
|
-
def wrap_binary_function(function):
|
|
146
|
-
def wrapped(A):
|
|
147
|
-
return function(A, A)
|
|
148
|
-
|
|
149
|
-
return wrapped
|
|
150
|
-
|
|
151
|
-
kernel_labels: List[str] = []
|
|
152
|
-
kernel_callables: List[callable] = []
|
|
153
|
-
|
|
154
|
-
# Add SimSIMD kernels
|
|
155
|
-
for kernel in kernels:
|
|
156
|
-
if not kernel.name.startswith("numpy.") and not kernel.name.startswith("scipy."):
|
|
157
|
-
continue
|
|
158
|
-
_, _, function_name = kernel.name.partition(".")
|
|
159
|
-
kernel_labels.append(f"simsimd.{function_name}<{kernel.dtype}>")
|
|
160
|
-
if args.mode == "all-pairs":
|
|
161
|
-
kernel_callables.append(wrap_binary_function(kernel.simsimd_all_pairs_func))
|
|
162
|
-
else:
|
|
163
|
-
kernel_callables.append(wrap_binary_function(kernel.simsimd_func))
|
|
164
|
-
|
|
165
|
-
# Add other kernels
|
|
166
|
-
for kernel in kernels:
|
|
167
|
-
kernel_labels.append(f"{kernel.name}<{kernel.dtype}>")
|
|
168
|
-
if args.mode == "all-pairs":
|
|
169
|
-
kernel_callables.append(wrap_binary_function(kernel.baseline_all_pairs_func))
|
|
170
|
-
elif args.count == 1:
|
|
171
|
-
kernel_callables.append(wrap_binary_function(kernel.baseline_one_to_one_func))
|
|
172
|
-
else:
|
|
173
|
-
kernel_callables.append(wrap_binary_function(kernel.baseline_many_to_many_func))
|
|
174
|
-
|
|
175
|
-
# Filter-out kernels that raise any exceptions
|
|
176
|
-
safe_callables = []
|
|
177
|
-
safe_labels = []
|
|
178
|
-
for kernel_label, kernel_callable in zip(kernel_labels, kernel_callables):
|
|
179
|
-
try:
|
|
180
|
-
kernel_callable(generate_matrix(ndim_range[0]))
|
|
181
|
-
safe_callables.append(kernel_callable)
|
|
182
|
-
safe_labels.append(kernel_label)
|
|
183
|
-
except:
|
|
184
|
-
print(f"Skipping {kernel_label}")
|
|
185
|
-
|
|
186
|
-
print(safe_callables)
|
|
187
|
-
print(safe_labels)
|
|
188
|
-
|
|
189
|
-
# Settings are mostly the same for live charts and exported ones
|
|
190
|
-
profiler_settings = dict(
|
|
191
|
-
setup=generate_matrix,
|
|
192
|
-
kernels=safe_callables,
|
|
193
|
-
labels=safe_labels,
|
|
194
|
-
n_range=ndim_range,
|
|
195
|
-
flops=precomputed_flops,
|
|
196
|
-
xlabel="ndim",
|
|
197
|
-
equality_check=None, # bypass correctness check, we have tests for that
|
|
198
|
-
)
|
|
199
|
-
|
|
200
|
-
# Plot the results
|
|
201
|
-
if args.output_path is not None:
|
|
202
|
-
plot_fp = os.path.abspath(args.output_path)
|
|
203
|
-
profiler_settings["filename"] = plot_fp
|
|
204
|
-
profiler_settings["show_progress"] = False
|
|
205
|
-
results = perfplot.bench(**profiler_settings)
|
|
206
|
-
results.save(plot_fp, transparent=False, bbox_inches="tight", relative_to=0, logy="auto")
|
|
207
|
-
else:
|
|
208
|
-
profiler_settings.pop("flops")
|
|
209
|
-
perfplot.live(**profiler_settings)
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
if __name__ == "__main__":
|
|
213
|
-
main()
|
package/simsimd/scripts/test.c
DELETED
|
@@ -1,187 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* @file test.c
|
|
3
|
-
* @brief Test focusing only on the simplest functionality.
|
|
4
|
-
*/
|
|
5
|
-
|
|
6
|
-
#include <assert.h> // `assert`
|
|
7
|
-
#include <math.h> // `sqrtf`
|
|
8
|
-
#include <stdio.h> // `printf`
|
|
9
|
-
|
|
10
|
-
#define SIMSIMD_NATIVE_F16 0
|
|
11
|
-
#define SIMSIMD_NATIVE_BF16 0
|
|
12
|
-
#include <simsimd/simsimd.h>
|
|
13
|
-
|
|
14
|
-
/**
|
|
15
|
-
* @brief Logs CPU capabilities supported by the current build (compile-time) and runtime.
|
|
16
|
-
*/
|
|
17
|
-
void print_capabilities(void) {
|
|
18
|
-
simsimd_capability_t runtime_caps = simsimd_capabilities();
|
|
19
|
-
|
|
20
|
-
// Log supported functionality
|
|
21
|
-
char const *flags[2] = {"false", "true"};
|
|
22
|
-
printf("Benchmarking Similarity Measures\n");
|
|
23
|
-
printf("- Compiler used native F16: %s\n", flags[SIMSIMD_NATIVE_F16]);
|
|
24
|
-
printf("- Compiler used native BF16: %s\n", flags[SIMSIMD_NATIVE_BF16]);
|
|
25
|
-
printf("\n");
|
|
26
|
-
printf("Compile-time settings:\n");
|
|
27
|
-
printf("- Arm NEON support enabled: %s\n", flags[SIMSIMD_TARGET_NEON]);
|
|
28
|
-
printf("- Arm SVE support enabled: %s\n", flags[SIMSIMD_TARGET_SVE]);
|
|
29
|
-
printf("- Arm SVE2 support enabled: %s\n", flags[SIMSIMD_TARGET_SVE2]);
|
|
30
|
-
printf("- x86 Haswell support enabled: %s\n", flags[SIMSIMD_TARGET_HASWELL]);
|
|
31
|
-
printf("- x86 Skylake support enabled: %s\n", flags[SIMSIMD_TARGET_SKYLAKE]);
|
|
32
|
-
printf("- x86 Ice Lake support enabled: %s\n", flags[SIMSIMD_TARGET_ICE]);
|
|
33
|
-
printf("- x86 Genoa support enabled: %s\n", flags[SIMSIMD_TARGET_GENOA]);
|
|
34
|
-
printf("- x86 Sapphire Rapids support enabled: %s\n", flags[SIMSIMD_TARGET_SAPPHIRE]);
|
|
35
|
-
printf("- x86 Turin support enabled: %s\n", flags[SIMSIMD_TARGET_TURIN]);
|
|
36
|
-
printf("- x86 Sierra Forest support enabled: %s\n", flags[SIMSIMD_TARGET_SIERRA]);
|
|
37
|
-
printf("\n");
|
|
38
|
-
printf("Run-time settings:\n");
|
|
39
|
-
printf("- Arm NEON support enabled: %s\n", flags[(runtime_caps & simsimd_cap_neon_k) != 0]);
|
|
40
|
-
printf("- Arm NEON F16 support enabled: %s\n", flags[(runtime_caps & simsimd_cap_neon_f16_k) != 0]);
|
|
41
|
-
printf("- Arm NEON BF16 support enabled: %s\n", flags[(runtime_caps & simsimd_cap_neon_bf16_k) != 0]);
|
|
42
|
-
printf("- Arm NEON I8 support enabled: %s\n", flags[(runtime_caps & simsimd_cap_neon_i8_k) != 0]);
|
|
43
|
-
printf("- Arm SVE support enabled: %s\n", flags[(runtime_caps & simsimd_cap_sve_k) != 0]);
|
|
44
|
-
printf("- Arm SVE F16 support enabled: %s\n", flags[(runtime_caps & simsimd_cap_sve_f16_k) != 0]);
|
|
45
|
-
printf("- Arm SVE BF16 support enabled: %s\n", flags[(runtime_caps & simsimd_cap_sve_bf16_k) != 0]);
|
|
46
|
-
printf("- Arm SVE I8 support enabled: %s\n", flags[(runtime_caps & simsimd_cap_sve_i8_k) != 0]);
|
|
47
|
-
printf("- Arm SVE2 support enabled: %s\n", flags[(runtime_caps & simsimd_cap_sve2_k) != 0]);
|
|
48
|
-
printf("- x86 Haswell support enabled: %s\n", flags[(runtime_caps & simsimd_cap_haswell_k) != 0]);
|
|
49
|
-
printf("- x86 Skylake support enabled: %s\n", flags[(runtime_caps & simsimd_cap_skylake_k) != 0]);
|
|
50
|
-
printf("- x86 Ice Lake support enabled: %s\n", flags[(runtime_caps & simsimd_cap_ice_k) != 0]);
|
|
51
|
-
printf("- x86 Genoa support enabled: %s\n", flags[(runtime_caps & simsimd_cap_genoa_k) != 0]);
|
|
52
|
-
printf("- x86 Sapphire Rapids support enabled: %s\n", flags[(runtime_caps & simsimd_cap_sapphire_k) != 0]);
|
|
53
|
-
printf("- x86 Turin support enabled: %s\n", flags[(runtime_caps & simsimd_cap_turin_k) != 0]);
|
|
54
|
-
printf("\n");
|
|
55
|
-
}
|
|
56
|
-
|
|
57
|
-
/**
|
|
58
|
-
* @brief A trivial test that checks if the utility functions return the expected values.
|
|
59
|
-
*/
|
|
60
|
-
void test_utilities(void) {
|
|
61
|
-
simsimd_capability_t capabilities = simsimd_capabilities();
|
|
62
|
-
|
|
63
|
-
int uses_neon = simsimd_uses_neon();
|
|
64
|
-
int uses_sve = simsimd_uses_sve();
|
|
65
|
-
int uses_haswell = simsimd_uses_haswell();
|
|
66
|
-
int uses_skylake = simsimd_uses_skylake();
|
|
67
|
-
int uses_ice = simsimd_uses_ice();
|
|
68
|
-
int uses_genoa = simsimd_uses_genoa();
|
|
69
|
-
int uses_sapphire = simsimd_uses_sapphire();
|
|
70
|
-
int uses_turin = simsimd_uses_turin();
|
|
71
|
-
int uses_sierra = simsimd_uses_sierra();
|
|
72
|
-
|
|
73
|
-
assert(uses_neon == ((capabilities & simsimd_cap_neon_k) != 0));
|
|
74
|
-
assert(uses_sve == ((capabilities & simsimd_cap_sve_k) != 0));
|
|
75
|
-
assert(uses_haswell == ((capabilities & simsimd_cap_haswell_k) != 0));
|
|
76
|
-
assert(uses_skylake == ((capabilities & simsimd_cap_skylake_k) != 0));
|
|
77
|
-
assert(uses_ice == ((capabilities & simsimd_cap_ice_k) != 0));
|
|
78
|
-
assert(uses_genoa == ((capabilities & simsimd_cap_genoa_k) != 0));
|
|
79
|
-
assert(uses_sapphire == ((capabilities & simsimd_cap_sapphire_k) != 0));
|
|
80
|
-
assert(uses_turin == ((capabilities & simsimd_cap_turin_k) != 0));
|
|
81
|
-
assert(uses_sierra == ((capabilities & simsimd_cap_sierra_k) != 0));
|
|
82
|
-
}
|
|
83
|
-
|
|
84
|
-
/**
|
|
85
|
-
* @brief A trivial test that calls every implemented distance function and their dispatch versions
|
|
86
|
-
* on vectors A and B, where A and B are equal.
|
|
87
|
-
*/
|
|
88
|
-
void test_distance_from_itself(void) {
|
|
89
|
-
simsimd_f64_t f64s[1536];
|
|
90
|
-
simsimd_f32_t f32s[1536];
|
|
91
|
-
simsimd_f16_t f16s[1536];
|
|
92
|
-
simsimd_bf16_t bf16s[1536];
|
|
93
|
-
|
|
94
|
-
simsimd_f64c_t f64cs[768];
|
|
95
|
-
simsimd_f32c_t f32cs[768];
|
|
96
|
-
simsimd_f16c_t f16cs[768];
|
|
97
|
-
simsimd_bf16c_t bf16cs[768];
|
|
98
|
-
|
|
99
|
-
simsimd_i8_t i8s[1536];
|
|
100
|
-
simsimd_u8_t u8s[1536];
|
|
101
|
-
simsimd_b8_t b8s[1536 / 8]; // 8 bits per word
|
|
102
|
-
simsimd_distance_t distance[2]; // For complex dot-products we need two values
|
|
103
|
-
|
|
104
|
-
// Cosine distance between two vectors
|
|
105
|
-
simsimd_cos_i8(i8s, i8s, 1536, &distance[0]);
|
|
106
|
-
simsimd_cos_u8(u8s, u8s, 1536, &distance[0]);
|
|
107
|
-
simsimd_cos_f16(f16s, f16s, 1536, &distance[0]);
|
|
108
|
-
simsimd_cos_bf16(bf16s, bf16s, 1536, &distance[0]);
|
|
109
|
-
simsimd_cos_f32(f32s, f32s, 1536, &distance[0]);
|
|
110
|
-
simsimd_cos_f64(f64s, f64s, 1536, &distance[0]);
|
|
111
|
-
|
|
112
|
-
// Euclidean distance between two vectors
|
|
113
|
-
simsimd_l2sq_i8(i8s, i8s, 1536, &distance[0]);
|
|
114
|
-
simsimd_l2sq_u8(u8s, u8s, 1536, &distance[0]);
|
|
115
|
-
simsimd_l2sq_f16(f16s, f16s, 1536, &distance[0]);
|
|
116
|
-
simsimd_l2sq_bf16(bf16s, bf16s, 1536, &distance[0]);
|
|
117
|
-
simsimd_l2sq_f32(f32s, f32s, 1536, &distance[0]);
|
|
118
|
-
simsimd_l2sq_f64(f64s, f64s, 1536, &distance[0]);
|
|
119
|
-
|
|
120
|
-
// Inner product between two vectors
|
|
121
|
-
simsimd_dot_i8(i8s, i8s, 1536, &distance[0]);
|
|
122
|
-
simsimd_dot_u8(u8s, u8s, 1536, &distance[0]);
|
|
123
|
-
simsimd_dot_f16(f16s, f16s, 1536, &distance[0]);
|
|
124
|
-
simsimd_dot_bf16(bf16s, bf16s, 1536, &distance[0]);
|
|
125
|
-
simsimd_dot_f32(f32s, f32s, 1536, &distance[0]);
|
|
126
|
-
simsimd_dot_f64(f64s, f64s, 1536, &distance[0]);
|
|
127
|
-
|
|
128
|
-
// Complex inner product between two vectors
|
|
129
|
-
simsimd_dot_bf16c(bf16cs, bf16cs, 768, &distance[0]);
|
|
130
|
-
simsimd_dot_f16c(f16cs, f16cs, 768, &distance[0]);
|
|
131
|
-
simsimd_dot_f32c(f32cs, f32cs, 768, &distance[0]);
|
|
132
|
-
simsimd_dot_f64c(f64cs, f64cs, 768, &distance[0]);
|
|
133
|
-
|
|
134
|
-
// Complex conjugate inner product between two vectors
|
|
135
|
-
simsimd_vdot_bf16c(bf16cs, bf16cs, 768, &distance[0]);
|
|
136
|
-
simsimd_vdot_f16c(f16cs, f16cs, 768, &distance[0]);
|
|
137
|
-
simsimd_vdot_f32c(f32cs, f32cs, 768, &distance[0]);
|
|
138
|
-
simsimd_vdot_f64c(f64cs, f64cs, 768, &distance[0]);
|
|
139
|
-
|
|
140
|
-
// Hamming distance between two vectors
|
|
141
|
-
simsimd_hamming_b8(b8s, b8s, 1536 / 8, &distance[0]);
|
|
142
|
-
|
|
143
|
-
// Jaccard distance between two vectors
|
|
144
|
-
simsimd_jaccard_b8(b8s, b8s, 1536 / 8, &distance[0]);
|
|
145
|
-
|
|
146
|
-
// Jensen-Shannon divergence between two vectors
|
|
147
|
-
simsimd_js_f16(f16s, f16s, 1536, &distance[0]);
|
|
148
|
-
simsimd_js_bf16(bf16s, bf16s, 1536, &distance[0]);
|
|
149
|
-
simsimd_js_f32(f32s, f32s, 1536, &distance[0]);
|
|
150
|
-
simsimd_js_f64(f64s, f64s, 1536, &distance[0]);
|
|
151
|
-
|
|
152
|
-
// Kullback-Leibler divergence between two vectors
|
|
153
|
-
simsimd_kl_f16(f16s, f16s, 1536, &distance[0]);
|
|
154
|
-
simsimd_kl_bf16(bf16s, bf16s, 1536, &distance[0]);
|
|
155
|
-
simsimd_kl_f32(f32s, f32s, 1536, &distance[0]);
|
|
156
|
-
simsimd_kl_f64(f64s, f64s, 1536, &distance[0]);
|
|
157
|
-
}
|
|
158
|
-
|
|
159
|
-
/**
|
|
160
|
-
* @brief Test whether denormals are being flushed to zero or not.
|
|
161
|
-
*
|
|
162
|
-
* We create subnormal float values, do a small computation (multiplication),
|
|
163
|
-
* and classify the result. If flush-to-zero @b (FTZ) is enabled, the result is
|
|
164
|
-
* likely zero. Otherwise, you may see another subnormal or normal number.
|
|
165
|
-
*/
|
|
166
|
-
static void test_denormals(void) {
|
|
167
|
-
|
|
168
|
-
// Create two subnormal floats:
|
|
169
|
-
// 1e-40 ~ 1.0 * 10^-40 is typically a subnormal in IEEE-754 single precision
|
|
170
|
-
float subnorm1 = 1e-40f;
|
|
171
|
-
float subnorm2 = 2e-40f;
|
|
172
|
-
float result = subnorm1 * subnorm2; // This might be subnormal, zero, or normal
|
|
173
|
-
int classification = fpclassify(result);
|
|
174
|
-
if (classification == FP_SUBNORMAL) { printf("Denormal test: result is subnormal: %.8g\n", result); }
|
|
175
|
-
else if (result == 0.0f) { printf("Denormal test: result is zero (denormals likely flushed).\n"); }
|
|
176
|
-
else if (classification == FP_NORMAL) { printf("Denormal test: result is normal: %.8g\n", result); }
|
|
177
|
-
else { printf("Denormal test: result has unexpected classification.\n"); }
|
|
178
|
-
}
|
|
179
|
-
|
|
180
|
-
int main(int argc, char **argv) {
|
|
181
|
-
|
|
182
|
-
print_capabilities();
|
|
183
|
-
test_utilities();
|
|
184
|
-
test_distance_from_itself();
|
|
185
|
-
test_denormals();
|
|
186
|
-
return 0;
|
|
187
|
-
}
|
package/simsimd/scripts/test.mjs
DELETED
|
@@ -1,220 +0,0 @@
|
|
|
1
|
-
// Currently the builds are expected to run only on Node.js,
|
|
2
|
-
// but Deno tests pass as well.
|
|
3
|
-
//
|
|
4
|
-
// Bun supports `node:assert`, but not `node:test`.
|
|
5
|
-
// Using `require` we can make the tests compatible with Bun.
|
|
6
|
-
//
|
|
7
|
-
// const isBun = typeof Bun !== "undefined";
|
|
8
|
-
// let assert, test;
|
|
9
|
-
// if (isBun) {
|
|
10
|
-
// assert = require('node:assert');
|
|
11
|
-
// test = require('bun:test');
|
|
12
|
-
// } else {
|
|
13
|
-
// assert = require('node:assert');
|
|
14
|
-
// test = require('node:test');
|
|
15
|
-
// }
|
|
16
|
-
//
|
|
17
|
-
// That, however, leads to other issues, like the following:
|
|
18
|
-
//
|
|
19
|
-
// require is not defined in ES module scope, you can use import instead
|
|
20
|
-
//
|
|
21
|
-
// https://bun.sh/docs/runtime/nodejs-apis
|
|
22
|
-
// https://bun.sh/guides/util/detect-bun
|
|
23
|
-
import test from "node:test";
|
|
24
|
-
import assert from "node:assert";
|
|
25
|
-
|
|
26
|
-
import * as simsimd from "../javascript/dist/esm/simsimd.js";
|
|
27
|
-
import * as fallback from "../javascript/dist/esm/fallback.js";
|
|
28
|
-
|
|
29
|
-
function assertAlmostEqual(actual, expected, tolerance = 1e-6) {
|
|
30
|
-
const lowerBound = expected - tolerance;
|
|
31
|
-
const upperBound = expected + tolerance;
|
|
32
|
-
assert(
|
|
33
|
-
actual >= lowerBound && actual <= upperBound,
|
|
34
|
-
`Expected ${actual} to be almost equal to ${expected}`
|
|
35
|
-
);
|
|
36
|
-
}
|
|
37
|
-
|
|
38
|
-
test("Distance from itself", () => {
|
|
39
|
-
const f32s = new Float32Array([1.0, 2.0, 3.0]);
|
|
40
|
-
assertAlmostEqual(simsimd.sqeuclidean(f32s, f32s), 0.0, 0.01);
|
|
41
|
-
assertAlmostEqual(simsimd.cosine(f32s, f32s), 0.0, 0.01);
|
|
42
|
-
assertAlmostEqual(fallback.sqeuclidean(f32s, f32s), 0.0, 0.01);
|
|
43
|
-
assertAlmostEqual(fallback.cosine(f32s, f32s), 0.0, 0.01);
|
|
44
|
-
|
|
45
|
-
const f64s = new Float64Array([1.0, 2.0, 3.0]);
|
|
46
|
-
assertAlmostEqual(simsimd.sqeuclidean(f64s, f64s), 0.0, 0.01);
|
|
47
|
-
assertAlmostEqual(simsimd.cosine(f64s, f64s), 0.0, 0.01);
|
|
48
|
-
assertAlmostEqual(fallback.sqeuclidean(f64s, f64s), 0.0, 0.01);
|
|
49
|
-
assertAlmostEqual(fallback.cosine(f64s, f64s), 0.0, 0.01);
|
|
50
|
-
|
|
51
|
-
const f32sNormalized = new Float32Array([1 / Math.sqrt(14), 2 / Math.sqrt(14), 3 / Math.sqrt(14)]);
|
|
52
|
-
assertAlmostEqual(simsimd.inner(f32sNormalized, f32sNormalized), 1.0, 0.01);
|
|
53
|
-
assertAlmostEqual(fallback.inner(f32sNormalized, f32sNormalized), 1.0, 0.01);
|
|
54
|
-
|
|
55
|
-
const f32sHistogram = new Float32Array([1.0 / 6, 2.0 / 6, 3.0 / 6]);
|
|
56
|
-
assertAlmostEqual(simsimd.kullbackleibler(f32sHistogram, f32sHistogram), 0.0, 0.01);
|
|
57
|
-
assertAlmostEqual(simsimd.jensenshannon(f32sHistogram, f32sHistogram), 0.0, 0.01);
|
|
58
|
-
assertAlmostEqual(fallback.kullbackleibler(f32sHistogram, f32sHistogram), 0.0, 0.01);
|
|
59
|
-
assertAlmostEqual(fallback.jensenshannon(f32sHistogram, f32sHistogram), 0.0, 0.01);
|
|
60
|
-
|
|
61
|
-
const u8s = new Uint8Array([1, 2, 3]);
|
|
62
|
-
assertAlmostEqual(simsimd.hamming(u8s, u8s), 0.0, 0.01);
|
|
63
|
-
assertAlmostEqual(simsimd.jaccard(u8s, u8s), 0.0, 0.01);
|
|
64
|
-
assertAlmostEqual(fallback.hamming(u8s, u8s), 0.0, 0.01);
|
|
65
|
-
assertAlmostEqual(fallback.jaccard(u8s, u8s), 0.0, 0.01);
|
|
66
|
-
});
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
test("Squared Euclidean Distance", () => {
|
|
70
|
-
const f64sOne = new Float64Array([1.0, 2.0, 3.0]);
|
|
71
|
-
const f64sTwo = new Float64Array([4.0, 5.0, 6.0]);
|
|
72
|
-
const f64sResult = simsimd.sqeuclidean(f64sOne, f64sTwo);
|
|
73
|
-
const f64sResultJS = fallback.sqeuclidean(f64sOne, f64sTwo);
|
|
74
|
-
assertAlmostEqual(f64sResultJS, 27.0, 0.01);
|
|
75
|
-
assertAlmostEqual(f64sResult, 27.0, 0.01);
|
|
76
|
-
|
|
77
|
-
const f32sOne = new Float32Array([1.0, 2.0, 3.0]);
|
|
78
|
-
const f32sTwo = new Float32Array([4.0, 5.0, 6.0]);
|
|
79
|
-
const f32sResult = simsimd.sqeuclidean(f32sOne, f32sTwo);
|
|
80
|
-
const f32sResultJS = fallback.sqeuclidean(f32sOne, f32sTwo);
|
|
81
|
-
assertAlmostEqual(f32sResultJS, 27.0, 0.01);
|
|
82
|
-
assertAlmostEqual(f32sResult, 27.0, 0.01);
|
|
83
|
-
|
|
84
|
-
const u8sOne = new Uint8Array([1, 2, 3]);
|
|
85
|
-
const u8sTwo = new Uint8Array([4, 5, 6]);
|
|
86
|
-
const u8sResult = simsimd.sqeuclidean(u8sOne, u8sTwo);
|
|
87
|
-
const u8sResultJS = fallback.sqeuclidean(u8sOne, u8sTwo);
|
|
88
|
-
assertAlmostEqual(u8sResultJS, 27.0, 0.01);
|
|
89
|
-
assertAlmostEqual(u8sResult, 27.0, 0.01);
|
|
90
|
-
|
|
91
|
-
const i8sOne = new Int8Array([1, 2, 3]);
|
|
92
|
-
const i8sTwo = new Int8Array([4, 5, 6]);
|
|
93
|
-
const i8sResult = simsimd.sqeuclidean(i8sOne, i8sTwo);
|
|
94
|
-
const i8sResultJS = fallback.sqeuclidean(i8sOne, i8sTwo);
|
|
95
|
-
assertAlmostEqual(i8sResultJS, 27.0, 0.01);
|
|
96
|
-
assertAlmostEqual(i8sResult, 27.0, 0.01);
|
|
97
|
-
});
|
|
98
|
-
|
|
99
|
-
test("Euclidean Distance", () => {
|
|
100
|
-
const f64sOne = new Float64Array([1.0, 2.0, 3.0]);
|
|
101
|
-
const f64sTwo = new Float64Array([4.0, 5.0, 6.0]);
|
|
102
|
-
const f64sResult = simsimd.euclidean(f64sOne, f64sTwo);
|
|
103
|
-
const f64sResultJS = fallback.euclidean(f64sOne, f64sTwo);
|
|
104
|
-
assertAlmostEqual(f64sResultJS, 5.2, 0.01);
|
|
105
|
-
assertAlmostEqual(f64sResult, 5.2, 0.01);
|
|
106
|
-
|
|
107
|
-
const f32sOne = new Float32Array([1.0, 2.0, 3.0]);
|
|
108
|
-
const f32sTwo = new Float32Array([4.0, 5.0, 6.0]);
|
|
109
|
-
const f32sResult = simsimd.euclidean(f32sOne, f32sTwo);
|
|
110
|
-
const f32sResultJS = fallback.euclidean(f32sOne, f32sTwo);
|
|
111
|
-
assertAlmostEqual(f32sResultJS, 5.2, 0.01);
|
|
112
|
-
assertAlmostEqual(f32sResult, 5.2, 0.01);
|
|
113
|
-
|
|
114
|
-
const u8sOne = new Uint8Array([1, 2, 3]);
|
|
115
|
-
const u8sTwo = new Uint8Array([4, 5, 6]);
|
|
116
|
-
const u8sResult = simsimd.euclidean(u8sOne, u8sTwo);
|
|
117
|
-
const u8sResultJS = fallback.euclidean(u8sOne, u8sTwo);
|
|
118
|
-
assertAlmostEqual(u8sResultJS, 5.2, 0.01);
|
|
119
|
-
assertAlmostEqual(u8sResult, 5.2, 0.01);
|
|
120
|
-
|
|
121
|
-
const i8sOne = new Int8Array([1, 2, 3]);
|
|
122
|
-
const i8sTwo = new Int8Array([4, 5, 6]);
|
|
123
|
-
const i8sResult = simsimd.euclidean(i8sOne, i8sTwo);
|
|
124
|
-
const i8sResultJS = fallback.euclidean(i8sOne, i8sTwo);
|
|
125
|
-
assertAlmostEqual(i8sResultJS, 5.2, 0.01);
|
|
126
|
-
assertAlmostEqual(i8sResult, 5.2, 0.01);
|
|
127
|
-
});
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
test("Inner Product", () => {
|
|
131
|
-
const f64sOne = new Float64Array([1.0, 2.0, 3.0]);
|
|
132
|
-
const f64sTwo = new Float64Array([4.0, 5.0, 6.0]);
|
|
133
|
-
const f64sResult = simsimd.inner(f64sOne, f64sTwo);
|
|
134
|
-
const f64sResultJS = fallback.inner(f64sOne, f64sTwo);
|
|
135
|
-
assertAlmostEqual(f64sResultJS, 32.0, 0.01);
|
|
136
|
-
assertAlmostEqual(f64sResult, 32.0, 0.01);
|
|
137
|
-
|
|
138
|
-
const f32sOne = new Float32Array([1.0, 2.0, 3.0]);
|
|
139
|
-
const f32sTwo = new Float32Array([4.0, 5.0, 6.0]);
|
|
140
|
-
const f32sResult = simsimd.inner(f32sOne, f32sTwo);
|
|
141
|
-
const f32sResultJS = fallback.inner(f32sOne, f32sTwo);
|
|
142
|
-
assertAlmostEqual(f32sResultJS, 32.0, 0.01);
|
|
143
|
-
assertAlmostEqual(f32sResult, 32.0, 0.01);
|
|
144
|
-
|
|
145
|
-
const u8sOne = new Uint8Array([1, 2, 3]);
|
|
146
|
-
const u8sTwo = new Uint8Array([4, 5, 6]);
|
|
147
|
-
const u8sResult = simsimd.inner(u8sOne, u8sTwo);
|
|
148
|
-
const u8sResultJS = fallback.inner(u8sOne, u8sTwo);
|
|
149
|
-
assertAlmostEqual(u8sResultJS, 32.0, 0.01);
|
|
150
|
-
assertAlmostEqual(u8sResult, 32.0, 0.01);
|
|
151
|
-
|
|
152
|
-
const i8sOne = new Int8Array([1, 2, 3]);
|
|
153
|
-
const i8sTwo = new Int8Array([4, 5, 6]);
|
|
154
|
-
const i8sResult = simsimd.inner(i8sOne, i8sTwo);
|
|
155
|
-
const i8sResultJS = fallback.inner(i8sOne, i8sTwo);
|
|
156
|
-
assertAlmostEqual(i8sResultJS, 32.0, 0.01);
|
|
157
|
-
assertAlmostEqual(i8sResult, 32.0, 0.01);
|
|
158
|
-
});
|
|
159
|
-
|
|
160
|
-
test("Cosine Distance", () => {
|
|
161
|
-
const f64sOne = new Float64Array([1.0, 2.0, 3.0]);
|
|
162
|
-
const f64sTwo = new Float64Array([4.0, 5.0, 6.0]);
|
|
163
|
-
const f64sResult = simsimd.cosine(f64sOne, f64sTwo);
|
|
164
|
-
const f64sResultJS = fallback.cosine(f64sOne, f64sTwo);
|
|
165
|
-
assertAlmostEqual(f64sResultJS, 0.03, 0.01);
|
|
166
|
-
assertAlmostEqual(f64sResult, 0.03, 0.01);
|
|
167
|
-
|
|
168
|
-
const f32sOne = new Float32Array([1.0, 2.0, 3.0]);
|
|
169
|
-
const f32sTwo = new Float32Array([4.0, 5.0, 6.0]);
|
|
170
|
-
const f32sResult = simsimd.cosine(f32sOne, f32sTwo);
|
|
171
|
-
const f32sResultJS = fallback.cosine(f32sOne, f32sTwo);
|
|
172
|
-
assertAlmostEqual(f32sResultJS, 0.03, 0.01);
|
|
173
|
-
assertAlmostEqual(f32sResult, 0.03, 0.01);
|
|
174
|
-
|
|
175
|
-
const u8sOne = new Uint8Array([1, 2, 3]);
|
|
176
|
-
const u8sTwo = new Uint8Array([4, 5, 6]);
|
|
177
|
-
const u8sResult = simsimd.cosine(u8sOne, u8sTwo);
|
|
178
|
-
const u8sResultJS = fallback.cosine(u8sOne, u8sTwo);
|
|
179
|
-
assertAlmostEqual(u8sResultJS, 0.03, 0.01);
|
|
180
|
-
assertAlmostEqual(u8sResult, 0.03, 0.01);
|
|
181
|
-
|
|
182
|
-
const i8sOne = new Int8Array([1, 2, 3]);
|
|
183
|
-
const i8sTwo = new Int8Array([4, 5, 6]);
|
|
184
|
-
const i8sResult = simsimd.cosine(i8sOne, i8sTwo);
|
|
185
|
-
const i8sResultJS = fallback.cosine(i8sOne, i8sTwo);
|
|
186
|
-
assertAlmostEqual(i8sResultJS, 0.03, 0.01);
|
|
187
|
-
assertAlmostEqual(i8sResult, 0.03, 0.01);
|
|
188
|
-
});
|
|
189
|
-
|
|
190
|
-
test("Kullback-Leibler", () => {
|
|
191
|
-
const f64sOne = new Float64Array([1.0 / 6, 2.0 / 6, 3.0 / 6]);
|
|
192
|
-
const f64sTwo = new Float64Array([4.0 / 17, 5.0 / 17, 6.0 / 17]);
|
|
193
|
-
const f64sResult = simsimd.kullbackleibler(f64sOne, f64sTwo);
|
|
194
|
-
const f64sResultJS = fallback.kullbackleibler(f64sOne, f64sTwo);
|
|
195
|
-
assertAlmostEqual(f64sResultJS, 0.16, 0.01);
|
|
196
|
-
assertAlmostEqual(f64sResult, 0.16, 0.01);
|
|
197
|
-
|
|
198
|
-
const f32sOne = new Float32Array([1.0 / 6, 2.0 / 6, 3.0 / 6]);
|
|
199
|
-
const f32sTwo = new Float32Array([4.0 / 17, 5.0 / 17, 6.0 / 17]);
|
|
200
|
-
const f32sResult = simsimd.kullbackleibler(f32sOne, f32sTwo);
|
|
201
|
-
const f32sResultJS = fallback.kullbackleibler(f32sOne, f32sTwo);
|
|
202
|
-
assertAlmostEqual(f32sResultJS, 0.16, 0.01);
|
|
203
|
-
assertAlmostEqual(f32sResult, 0.16, 0.01);
|
|
204
|
-
});
|
|
205
|
-
|
|
206
|
-
test("Jensen-Shannon", () => {
|
|
207
|
-
const f64sOne = new Float64Array([1.0 / 6, 2.0 / 6, 3.0 / 6]);
|
|
208
|
-
const f64sTwo = new Float64Array([4.0 / 17, 5.0 / 17, 6.0 / 17]);
|
|
209
|
-
const f64sResult = simsimd.jensenshannon(f64sOne, f64sTwo);
|
|
210
|
-
const f64sResultJS = fallback.jensenshannon(f64sOne, f64sTwo);
|
|
211
|
-
assertAlmostEqual(f64sResultJS, 0.095, 0.01);
|
|
212
|
-
assertAlmostEqual(f64sResult, 0.095, 0.01);
|
|
213
|
-
|
|
214
|
-
const f32sOne = new Float32Array([1.0 / 6, 2.0 / 6, 3.0 / 6]);
|
|
215
|
-
const f32sTwo = new Float32Array([4.0 / 17, 5.0 / 17, 6.0 / 17]);
|
|
216
|
-
const f32sResult = simsimd.jensenshannon(f32sOne, f32sTwo);
|
|
217
|
-
const f32sResultJS = fallback.jensenshannon(f32sOne, f32sTwo);
|
|
218
|
-
assertAlmostEqual(f32sResultJS, 0.095, 0.01);
|
|
219
|
-
assertAlmostEqual(f32sResult, 0.095, 0.01);
|
|
220
|
-
});
|