usearch 2.21.4 → 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 +224 -48
- 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,233 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* @brief Computes the inner product of two vectors (dot product).
|
|
3
|
-
* @param {Float64Array|Float32Array} a - The first vector.
|
|
4
|
-
* @param {Float64Array|Float32Array} b - The second vector.
|
|
5
|
-
* @returns {number} The inner product of vectors a and b.
|
|
6
|
-
*/
|
|
7
|
-
export function inner(a: Float64Array | Float32Array, b: Float64Array | Float32Array): number {
|
|
8
|
-
if (a.length !== b.length) {
|
|
9
|
-
throw new Error("Vectors must have the same length");
|
|
10
|
-
}
|
|
11
|
-
|
|
12
|
-
let result = 0;
|
|
13
|
-
for (let i = 0; i < a.length; i++) {
|
|
14
|
-
result += a[i] * b[i];
|
|
15
|
-
}
|
|
16
|
-
return result;
|
|
17
|
-
}
|
|
18
|
-
|
|
19
|
-
/**
|
|
20
|
-
* @brief Computes the dot product of two vectors (same as inner product).
|
|
21
|
-
* @param {Float64Array|Float32Array} a - The first vector.
|
|
22
|
-
* @param {Float64Array|Float32Array} b - The second vector.
|
|
23
|
-
* @returns {number} The dot product of vectors a and b.
|
|
24
|
-
*/
|
|
25
|
-
export function dot(a: Float64Array | Float32Array, b: Float64Array | Float32Array): number {
|
|
26
|
-
return inner(a, b);
|
|
27
|
-
}
|
|
28
|
-
|
|
29
|
-
/**
|
|
30
|
-
* @brief Computes the squared Euclidean distance between two vectors.
|
|
31
|
-
* @param {Float64Array|Float32Array|Int8Array|Uint8Array} a - The first vector.
|
|
32
|
-
* @param {Float64Array|Float32Array|Int8Array|Uint8Array} b - The second vector.
|
|
33
|
-
* @returns {number} The squared Euclidean distance between vectors a and b.
|
|
34
|
-
*/
|
|
35
|
-
export function sqeuclidean(
|
|
36
|
-
a: Float64Array | Float32Array | Int8Array | Uint8Array,
|
|
37
|
-
b: Float64Array | Float32Array | Int8Array | Uint8Array
|
|
38
|
-
): number {
|
|
39
|
-
if (a.length !== b.length) {
|
|
40
|
-
throw new Error("Vectors must have the same length");
|
|
41
|
-
}
|
|
42
|
-
|
|
43
|
-
let result = 0;
|
|
44
|
-
for (let i = 0; i < a.length; i++) {
|
|
45
|
-
result += (a[i] - b[i]) * (a[i] - b[i]);
|
|
46
|
-
}
|
|
47
|
-
return result;
|
|
48
|
-
}
|
|
49
|
-
|
|
50
|
-
/**
|
|
51
|
-
* @brief Computes the L2 Euclidean distance between two vectors.
|
|
52
|
-
* @param {Float64Array|Float32Array|Int8Array | Uint8Array} a - The first vector.
|
|
53
|
-
* @param {Float64Array|Float32Array|Int8Array | Uint8Array} b - The second vector.
|
|
54
|
-
* @returns {number} The L2 Euclidean distance between vectors a and b.
|
|
55
|
-
*/
|
|
56
|
-
export function euclidean(
|
|
57
|
-
a: Float64Array | Float32Array | Int8Array | Uint8Array,
|
|
58
|
-
b: Float64Array | Float32Array | Int8Array | Uint8Array
|
|
59
|
-
): number {
|
|
60
|
-
if (a.length !== b.length) {
|
|
61
|
-
throw new Error("Vectors must have the same length");
|
|
62
|
-
}
|
|
63
|
-
|
|
64
|
-
let result = 0;
|
|
65
|
-
for (let i = 0; i < a.length; i++) {
|
|
66
|
-
result += (a[i] - b[i]) * (a[i] - b[i]);
|
|
67
|
-
}
|
|
68
|
-
return Math.sqrt(result);
|
|
69
|
-
}
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
/**
|
|
73
|
-
* @brief Computes the cosine distance between two vectors.
|
|
74
|
-
* @param {Float64Array|Float32Array|Int8Array} a - The first vector.
|
|
75
|
-
* @param {Float64Array|Float32Array|Int8Array} b - The second vector.
|
|
76
|
-
* @returns {number} The cosine distance between vectors a and b.
|
|
77
|
-
*/
|
|
78
|
-
export function cosine(
|
|
79
|
-
a: Float64Array | Float32Array | Int8Array,
|
|
80
|
-
b: Float64Array | Float32Array | Int8Array
|
|
81
|
-
): number {
|
|
82
|
-
if (a.length !== b.length) {
|
|
83
|
-
throw new Error("Vectors must have the same length");
|
|
84
|
-
}
|
|
85
|
-
|
|
86
|
-
let dotProduct = 0;
|
|
87
|
-
let magnitudeA = 0;
|
|
88
|
-
let magnitudeB = 0;
|
|
89
|
-
|
|
90
|
-
for (let i = 0; i < a.length; i++) {
|
|
91
|
-
dotProduct += a[i] * b[i];
|
|
92
|
-
magnitudeA += a[i] * a[i];
|
|
93
|
-
magnitudeB += b[i] * b[i];
|
|
94
|
-
}
|
|
95
|
-
|
|
96
|
-
magnitudeA = Math.sqrt(magnitudeA);
|
|
97
|
-
magnitudeB = Math.sqrt(magnitudeB);
|
|
98
|
-
|
|
99
|
-
if (magnitudeA === 0 && magnitudeB === 0) return 0; // distance when both zero
|
|
100
|
-
if (magnitudeA === 0 || magnitudeB === 0) return 1; // distance when one is zero
|
|
101
|
-
|
|
102
|
-
return 1 - dotProduct / (magnitudeA * magnitudeB);
|
|
103
|
-
}
|
|
104
|
-
|
|
105
|
-
/**
|
|
106
|
-
* @brief Computes the bitwise Hamming distance between two vectors.
|
|
107
|
-
* @param {Uint8Array} a - The first vector.
|
|
108
|
-
* @param {Uint8Array} b - The second vector.
|
|
109
|
-
* @returns {number} The Hamming distance between vectors a and b.
|
|
110
|
-
*/
|
|
111
|
-
export const hamming = (a: Uint8Array, b: Uint8Array): number => {
|
|
112
|
-
if (a.length !== b.length) {
|
|
113
|
-
throw new Error("Arrays must be of the same length");
|
|
114
|
-
}
|
|
115
|
-
|
|
116
|
-
let distance = 0;
|
|
117
|
-
|
|
118
|
-
for (let i = 0; i < a.length; i++) {
|
|
119
|
-
let xor = a[i] ^ b[i]; // XOR operation to find differing bits
|
|
120
|
-
|
|
121
|
-
// Count the number of set bits (differing bits)
|
|
122
|
-
while (xor > 0) {
|
|
123
|
-
distance += xor & 1;
|
|
124
|
-
xor >>= 1;
|
|
125
|
-
}
|
|
126
|
-
}
|
|
127
|
-
|
|
128
|
-
return distance;
|
|
129
|
-
};
|
|
130
|
-
|
|
131
|
-
/**
|
|
132
|
-
* @brief Computes the bitwise Jaccard distance between two vectors.
|
|
133
|
-
* @param {Uint8Array} a - The first vector.
|
|
134
|
-
* @param {Uint8Array} b - The second vector.
|
|
135
|
-
* @returns {number} The Jaccard distance between vectors a and b.
|
|
136
|
-
*/
|
|
137
|
-
export const jaccard = (a: Uint8Array, b: Uint8Array): number => {
|
|
138
|
-
if (a.length !== b.length) {
|
|
139
|
-
throw new Error("Arrays must be of the same length");
|
|
140
|
-
}
|
|
141
|
-
|
|
142
|
-
let intersection = 0;
|
|
143
|
-
let union = 0;
|
|
144
|
-
|
|
145
|
-
for (let i = 0; i < a.length; i++) {
|
|
146
|
-
let ai = a[i];
|
|
147
|
-
let bi = b[i];
|
|
148
|
-
|
|
149
|
-
// Count the number of set bits in a AND b for intersection
|
|
150
|
-
let and = ai & bi;
|
|
151
|
-
while (and > 0) {
|
|
152
|
-
intersection += and & 1;
|
|
153
|
-
and >>= 1;
|
|
154
|
-
}
|
|
155
|
-
|
|
156
|
-
// Count the number of set bits in a OR b for union
|
|
157
|
-
let or = ai | bi;
|
|
158
|
-
while (or > 0) {
|
|
159
|
-
union += or & 1;
|
|
160
|
-
or >>= 1;
|
|
161
|
-
}
|
|
162
|
-
}
|
|
163
|
-
|
|
164
|
-
if (union === 0) return 0; // Avoid division by zero
|
|
165
|
-
|
|
166
|
-
return 1 - intersection / union;
|
|
167
|
-
};
|
|
168
|
-
|
|
169
|
-
/**
|
|
170
|
-
* @brief Computes the Kullback-Leibler divergence between two probability distributions.
|
|
171
|
-
* @param {Float64Array|Float32Array} a - The first vector.
|
|
172
|
-
* @param {Float64Array|Float32Array} b - The second vector.
|
|
173
|
-
* @returns {number} The Kullback-Leibler divergence between vectors a and b.
|
|
174
|
-
*/
|
|
175
|
-
export const kullbackleibler = (a: Float64Array | Float32Array, b: Float64Array | Float32Array): number => {
|
|
176
|
-
if (a.length !== b.length) {
|
|
177
|
-
throw new Error("Arrays must be of the same length");
|
|
178
|
-
}
|
|
179
|
-
|
|
180
|
-
let divergence = 0.0;
|
|
181
|
-
for (let i = 0; i < a.length; i++) {
|
|
182
|
-
if (a[i] < 0 || b[i] < 0) {
|
|
183
|
-
throw new Error("Negative values are not allowed in probability distributions");
|
|
184
|
-
}
|
|
185
|
-
if (b[i] === 0) {
|
|
186
|
-
throw new Error(
|
|
187
|
-
"Division by zero encountered in KL divergence calculation"
|
|
188
|
-
);
|
|
189
|
-
}
|
|
190
|
-
divergence += a[i] * Math.log(a[i] / b[i]);
|
|
191
|
-
}
|
|
192
|
-
|
|
193
|
-
return divergence;
|
|
194
|
-
};
|
|
195
|
-
|
|
196
|
-
/**
|
|
197
|
-
* @brief Computes the Jensen-Shannon distance between two probability distributions.
|
|
198
|
-
* @param {Float64Array|Float32Array} a - The first probability distribution.
|
|
199
|
-
* @param {Float64Array|Float32Array} b - The second probability distribution.
|
|
200
|
-
* @returns {number} The Jensen-Shannon distance between distributions a and b.
|
|
201
|
-
*/
|
|
202
|
-
export const jensenshannon = (a: Float64Array | Float32Array, b: Float64Array | Float32Array): number => {
|
|
203
|
-
if (a.length !== b.length) {
|
|
204
|
-
throw new Error("Arrays must be of the same length");
|
|
205
|
-
}
|
|
206
|
-
|
|
207
|
-
let divergence = 0;
|
|
208
|
-
for (let i = 0; i < a.length; i++) {
|
|
209
|
-
if (a[i] < 0 || b[i] < 0) {
|
|
210
|
-
throw new Error("Negative values are not allowed in probability distributions");
|
|
211
|
-
}
|
|
212
|
-
const m = (a[i] + b[i]) / 2;
|
|
213
|
-
if (m > 0) {
|
|
214
|
-
if (a[i] > 0) divergence += a[i] * Math.log(a[i] / m);
|
|
215
|
-
if (b[i] > 0) divergence += b[i] * Math.log(b[i] / m);
|
|
216
|
-
}
|
|
217
|
-
}
|
|
218
|
-
|
|
219
|
-
divergence /= 2;
|
|
220
|
-
return Math.sqrt(divergence);
|
|
221
|
-
};
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
export default {
|
|
225
|
-
sqeuclidean,
|
|
226
|
-
euclidean,
|
|
227
|
-
cosine,
|
|
228
|
-
inner,
|
|
229
|
-
hamming,
|
|
230
|
-
jaccard,
|
|
231
|
-
kullbackleibler,
|
|
232
|
-
jensenshannon,
|
|
233
|
-
};
|
package/simsimd/javascript/lib.c
DELETED
|
@@ -1,125 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* @file lib.c
|
|
3
|
-
* @brief JavaScript bindings for SimSIMD.
|
|
4
|
-
* @author Ash Vardanian
|
|
5
|
-
* @date October 18, 2023
|
|
6
|
-
*
|
|
7
|
-
* @see NodeJS docs: https://nodejs.org/api/n-api.html
|
|
8
|
-
*/
|
|
9
|
-
|
|
10
|
-
#include <node_api.h> // `napi_*` functions
|
|
11
|
-
#include <simsimd/simsimd.h> // `simsimd_*` functions
|
|
12
|
-
|
|
13
|
-
/// @brief Global variable that caches the CPU capabilities, and is computed just once, when the module is loaded.
|
|
14
|
-
simsimd_capability_t static_capabilities = simsimd_cap_serial_k;
|
|
15
|
-
|
|
16
|
-
napi_value dense(napi_env env, napi_callback_info info, simsimd_metric_kind_t metric_kind,
|
|
17
|
-
simsimd_datatype_t datatype) {
|
|
18
|
-
size_t argc = 2;
|
|
19
|
-
napi_value args[2];
|
|
20
|
-
napi_status status;
|
|
21
|
-
|
|
22
|
-
// Get callback info and ensure the argument count is correct
|
|
23
|
-
status = napi_get_cb_info(env, info, &argc, args, NULL, NULL);
|
|
24
|
-
if (status != napi_ok || argc != 2) {
|
|
25
|
-
napi_throw_error(env, NULL, "Wrong number of arguments");
|
|
26
|
-
return NULL;
|
|
27
|
-
}
|
|
28
|
-
|
|
29
|
-
// Obtain the typed arrays from the arguments
|
|
30
|
-
void *data_a, *data_b;
|
|
31
|
-
size_t length_a, length_b;
|
|
32
|
-
napi_typedarray_type type_a, type_b;
|
|
33
|
-
napi_status status_a, status_b;
|
|
34
|
-
status_a = napi_get_typedarray_info(env, args[0], &type_a, &length_a, &data_a, NULL, NULL);
|
|
35
|
-
status_b = napi_get_typedarray_info(env, args[1], &type_b, &length_b, &data_b, NULL, NULL);
|
|
36
|
-
if (status_a != napi_ok || status_b != napi_ok || type_a != type_b || length_a != length_b) {
|
|
37
|
-
napi_throw_error(env, NULL, "Both arguments must be typed arrays of matching types and dimensionality");
|
|
38
|
-
return NULL;
|
|
39
|
-
}
|
|
40
|
-
if (type_a != napi_float64_array && type_a != napi_float32_array && //
|
|
41
|
-
type_a != napi_int8_array && type_a != napi_uint8_array) {
|
|
42
|
-
napi_throw_error(env, NULL,
|
|
43
|
-
"Only `float64`, `float32`, `int8` and `uint8` arrays are supported in JavaScript bindings");
|
|
44
|
-
return NULL;
|
|
45
|
-
}
|
|
46
|
-
|
|
47
|
-
if (datatype == simsimd_datatype_unknown_k) switch (type_a) {
|
|
48
|
-
case napi_float64_array: datatype = simsimd_datatype_f64_k; break;
|
|
49
|
-
case napi_float32_array: datatype = simsimd_datatype_f32_k; break;
|
|
50
|
-
case napi_int8_array: datatype = simsimd_datatype_i8_k; break;
|
|
51
|
-
case napi_uint8_array: datatype = simsimd_datatype_u8_k; break;
|
|
52
|
-
default: break;
|
|
53
|
-
}
|
|
54
|
-
|
|
55
|
-
simsimd_metric_dense_punned_t metric = NULL;
|
|
56
|
-
simsimd_capability_t capability = simsimd_cap_serial_k;
|
|
57
|
-
simsimd_find_kernel_punned(metric_kind, datatype, static_capabilities, simsimd_cap_any_k,
|
|
58
|
-
(simsimd_kernel_punned_t *)&metric, &capability);
|
|
59
|
-
if (metric == NULL) {
|
|
60
|
-
napi_throw_error(env, NULL, "Unsupported datatype for given metric");
|
|
61
|
-
return NULL;
|
|
62
|
-
}
|
|
63
|
-
|
|
64
|
-
simsimd_distance_t result;
|
|
65
|
-
metric(data_a, data_b, length_a, &result);
|
|
66
|
-
|
|
67
|
-
// Convert the result to a JavaScript number
|
|
68
|
-
napi_value js_result;
|
|
69
|
-
status = napi_create_double(env, result, &js_result);
|
|
70
|
-
if (status != napi_ok) return NULL;
|
|
71
|
-
|
|
72
|
-
return js_result;
|
|
73
|
-
}
|
|
74
|
-
|
|
75
|
-
napi_value api_ip(napi_env env, napi_callback_info info) {
|
|
76
|
-
return dense(env, info, simsimd_metric_dot_k, simsimd_datatype_unknown_k);
|
|
77
|
-
}
|
|
78
|
-
napi_value api_cos(napi_env env, napi_callback_info info) {
|
|
79
|
-
return dense(env, info, simsimd_metric_cosine_k, simsimd_datatype_unknown_k);
|
|
80
|
-
}
|
|
81
|
-
napi_value api_l2sq(napi_env env, napi_callback_info info) {
|
|
82
|
-
return dense(env, info, simsimd_metric_sqeuclidean_k, simsimd_datatype_unknown_k);
|
|
83
|
-
}
|
|
84
|
-
napi_value api_l2(napi_env env, napi_callback_info info) {
|
|
85
|
-
return dense(env, info, simsimd_metric_l2_k, simsimd_datatype_unknown_k);
|
|
86
|
-
}
|
|
87
|
-
napi_value api_kl(napi_env env, napi_callback_info info) {
|
|
88
|
-
return dense(env, info, simsimd_metric_kl_k, simsimd_datatype_unknown_k);
|
|
89
|
-
}
|
|
90
|
-
napi_value api_js(napi_env env, napi_callback_info info) {
|
|
91
|
-
return dense(env, info, simsimd_metric_js_k, simsimd_datatype_unknown_k);
|
|
92
|
-
}
|
|
93
|
-
napi_value api_hamming(napi_env env, napi_callback_info info) {
|
|
94
|
-
return dense(env, info, simsimd_metric_hamming_k, simsimd_datatype_b8_k);
|
|
95
|
-
}
|
|
96
|
-
napi_value api_jaccard(napi_env env, napi_callback_info info) {
|
|
97
|
-
return dense(env, info, simsimd_metric_jaccard_k, simsimd_datatype_b8_k);
|
|
98
|
-
}
|
|
99
|
-
|
|
100
|
-
napi_value Init(napi_env env, napi_value exports) {
|
|
101
|
-
|
|
102
|
-
// Define an array of property descriptors
|
|
103
|
-
napi_property_descriptor dot_descriptor = {"dot", 0, api_ip, 0, 0, 0, napi_default, 0};
|
|
104
|
-
napi_property_descriptor inner_descriptor = {"inner", 0, api_ip, 0, 0, 0, napi_default, 0};
|
|
105
|
-
napi_property_descriptor sqeuclidean_descriptor = {"sqeuclidean", 0, api_l2sq, 0, 0, 0, napi_default, 0};
|
|
106
|
-
napi_property_descriptor euclidean_descriptor = {"euclidean", 0, api_l2, 0, 0, 0, napi_default, 0};
|
|
107
|
-
napi_property_descriptor cosine_descriptor = {"cosine", 0, api_cos, 0, 0, 0, napi_default, 0};
|
|
108
|
-
napi_property_descriptor hamming_descriptor = {"hamming", 0, api_hamming, 0, 0, 0, napi_default, 0};
|
|
109
|
-
napi_property_descriptor jaccard_descriptor = {"jaccard", 0, api_jaccard, 0, 0, 0, napi_default, 0};
|
|
110
|
-
napi_property_descriptor kl_descriptor = {"kullbackleibler", 0, api_kl, 0, 0, 0, napi_default, 0};
|
|
111
|
-
napi_property_descriptor js_descriptor = {"jensenshannon", 0, api_js, 0, 0, 0, napi_default, 0};
|
|
112
|
-
napi_property_descriptor properties[] = {
|
|
113
|
-
dot_descriptor, inner_descriptor, sqeuclidean_descriptor, euclidean_descriptor, cosine_descriptor,
|
|
114
|
-
hamming_descriptor, jaccard_descriptor, kl_descriptor, js_descriptor,
|
|
115
|
-
};
|
|
116
|
-
|
|
117
|
-
// Define the properties on the `exports` object
|
|
118
|
-
size_t property_count = sizeof(properties) / sizeof(properties[0]);
|
|
119
|
-
napi_define_properties(env, exports, property_count, properties);
|
|
120
|
-
|
|
121
|
-
static_capabilities = simsimd_capabilities();
|
|
122
|
-
return exports;
|
|
123
|
-
}
|
|
124
|
-
|
|
125
|
-
NAPI_MODULE(NODE_GYP_MODULE_NAME, Init)
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
declare module "node-gyp-build";
|
|
@@ -1,179 +0,0 @@
|
|
|
1
|
-
import build from "node-gyp-build";
|
|
2
|
-
import * as path from "node:path";
|
|
3
|
-
import { existsSync } from "node:fs";
|
|
4
|
-
import { getFileName, getRoot } from "bindings";
|
|
5
|
-
import * as fallback from "./fallback.js";
|
|
6
|
-
|
|
7
|
-
let compiled: any;
|
|
8
|
-
|
|
9
|
-
try {
|
|
10
|
-
let builddir = getBuildDir(getDirName());
|
|
11
|
-
compiled = build(builddir);
|
|
12
|
-
} catch (e) {
|
|
13
|
-
compiled = fallback;
|
|
14
|
-
console.warn(
|
|
15
|
-
"It seems like your environment doesn't support the native simsimd module, so we are providing a JS fallback."
|
|
16
|
-
);
|
|
17
|
-
}
|
|
18
|
-
|
|
19
|
-
/**
|
|
20
|
-
* @brief Computes the squared Euclidean distance between two vectors.
|
|
21
|
-
* @param {Float64Array|Float32Array|Int8Array|Uint8Array} a - The first vector.
|
|
22
|
-
* @param {Float64Array|Float32Array|Int8Array|Uint8Array} b - The second vector.
|
|
23
|
-
* @returns {number} The squared Euclidean distance between vectors a and b.
|
|
24
|
-
*/
|
|
25
|
-
export const sqeuclidean = (
|
|
26
|
-
a: Float64Array | Float32Array | Int8Array | Uint8Array,
|
|
27
|
-
b: Float64Array | Float32Array | Int8Array | Uint8Array
|
|
28
|
-
): number => {
|
|
29
|
-
return compiled.sqeuclidean(a, b);
|
|
30
|
-
};
|
|
31
|
-
|
|
32
|
-
/**
|
|
33
|
-
* @brief Computes the Euclidean distance between two vectors.
|
|
34
|
-
* @param {Float64Array|Float32Array|Int8Array|Uint8Array} a - The first vector.
|
|
35
|
-
* @param {Float64Array|Float32Array|Int8Array|Uint8Array} b - The second vector.
|
|
36
|
-
* @returns {number} The Euclidean distance between vectors a and b.
|
|
37
|
-
*/
|
|
38
|
-
export const euclidean = (
|
|
39
|
-
a: Float64Array | Float32Array | Int8Array | Uint8Array,
|
|
40
|
-
b: Float64Array | Float32Array | Int8Array | Uint8Array
|
|
41
|
-
): number => {
|
|
42
|
-
return compiled.euclidean(a, b);
|
|
43
|
-
};
|
|
44
|
-
|
|
45
|
-
/**
|
|
46
|
-
* @brief Computes the cosine distance between two vectors.
|
|
47
|
-
* @param {Float64Array|Float32Array|Int8Array|Uint8Array} a - The first vector.
|
|
48
|
-
* @param {Float64Array|Float32Array|Int8Array|Uint8Array} b - The second vector.
|
|
49
|
-
* @returns {number} The cosine distance between vectors a and b.
|
|
50
|
-
*/
|
|
51
|
-
export const cosine = (
|
|
52
|
-
a: Float64Array | Float32Array | Int8Array | Uint8Array,
|
|
53
|
-
b: Float64Array | Float32Array | Int8Array | Uint8Array
|
|
54
|
-
): number => {
|
|
55
|
-
return compiled.cosine(a, b);
|
|
56
|
-
};
|
|
57
|
-
|
|
58
|
-
/**
|
|
59
|
-
* @brief Computes the inner product of two vectors (same as dot product).
|
|
60
|
-
* @param {Float64Array|Float32Array|Int8Array|Uint8Array} a - The first vector.
|
|
61
|
-
* @param {Float64Array|Float32Array|Int8Array|Uint8Array} b - The second vector.
|
|
62
|
-
* @returns {number} The inner product of vectors a and b.
|
|
63
|
-
*/
|
|
64
|
-
export const inner = (
|
|
65
|
-
a: Float64Array | Float32Array | Int8Array | Uint8Array,
|
|
66
|
-
b: Float64Array | Float32Array | Int8Array | Uint8Array
|
|
67
|
-
): number => {
|
|
68
|
-
return compiled.inner(a, b);
|
|
69
|
-
};
|
|
70
|
-
|
|
71
|
-
/**
|
|
72
|
-
* @brief Computes the dot product of two vectors (same as inner product).
|
|
73
|
-
* @param {Float64Array|Float32Array|Int8Array|Uint8Array} a - The first vector.
|
|
74
|
-
* @param {Float64Array|Float32Array|Int8Array|Uint8Array} b - The second vector.
|
|
75
|
-
* @returns {number} The dot product of vectors a and b.
|
|
76
|
-
*/
|
|
77
|
-
export const dot = (
|
|
78
|
-
a: Float64Array | Float32Array | Int8Array | Uint8Array,
|
|
79
|
-
b: Float64Array | Float32Array | Int8Array | Uint8Array
|
|
80
|
-
): number => {
|
|
81
|
-
return compiled.dot(a, b);
|
|
82
|
-
};
|
|
83
|
-
|
|
84
|
-
/**
|
|
85
|
-
* @brief Computes the bitwise Hamming distance between two vectors.
|
|
86
|
-
* @param {Uint8Array} a - The first vector.
|
|
87
|
-
* @param {Uint8Array} b - The second vector.
|
|
88
|
-
* @returns {number} The Hamming distance between vectors a and b.
|
|
89
|
-
*/
|
|
90
|
-
export const hamming = (a: Uint8Array, b: Uint8Array): number => {
|
|
91
|
-
return compiled.hamming(a, b);
|
|
92
|
-
};
|
|
93
|
-
|
|
94
|
-
/**
|
|
95
|
-
* @brief Computes the bitwise Jaccard distance between two vectors.
|
|
96
|
-
* @param {Uint8Array} a - The first vector.
|
|
97
|
-
* @param {Uint8Array} b - The second vector.
|
|
98
|
-
* @returns {number} The Jaccard distance between vectors a and b.
|
|
99
|
-
*/
|
|
100
|
-
export const jaccard = (a: Uint8Array, b: Uint8Array): number => {
|
|
101
|
-
return compiled.jaccard(a, b);
|
|
102
|
-
};
|
|
103
|
-
|
|
104
|
-
/**
|
|
105
|
-
* @brief Computes the Kullback-Leibler divergence between two vectors.
|
|
106
|
-
* @param {Float64Array|Float32Array} a - The first vector.
|
|
107
|
-
* @param {Float64Array|Float32Array} b - The second vector.
|
|
108
|
-
* @returns {number} The Kullback-Leibler divergence between vectors a and b.
|
|
109
|
-
*/
|
|
110
|
-
export const kullbackleibler = (a: Float64Array | Float32Array, b: Float64Array | Float32Array): number => {
|
|
111
|
-
return compiled.kullbackleibler(a, b);
|
|
112
|
-
};
|
|
113
|
-
|
|
114
|
-
/**
|
|
115
|
-
* @brief Computes the Jensen-Shannon divergence between two vectors.
|
|
116
|
-
* @param {Float64Array|Float32Array} a - The first vector.
|
|
117
|
-
* @param {Float64Array|Float32Array} b - The second vector.
|
|
118
|
-
* @returns {number} The Jensen-Shannon divergence between vectors a and b.
|
|
119
|
-
*/
|
|
120
|
-
export const jensenshannon = (a: Float64Array | Float32Array, b: Float64Array | Float32Array): number => {
|
|
121
|
-
return compiled.jensenshannon(a, b);
|
|
122
|
-
};
|
|
123
|
-
|
|
124
|
-
/**
|
|
125
|
-
* Quantizes a floating-point vector into a binary vector (1 for positive values, 0 for non-positive values) and packs the result into a Uint8Array, where each element represents 8 binary values from the original vector.
|
|
126
|
-
* This function is useful for preparing data for bitwise distance computations, such as Hamming or Jaccard indices.
|
|
127
|
-
*
|
|
128
|
-
* @param {Float32Array | Float64Array | Int8Array} vector The floating-point vector to be quantized and packed.
|
|
129
|
-
* @returns {Uint8Array} A Uint8Array where each byte represents 8 binary quantized values from the input vector.
|
|
130
|
-
*/
|
|
131
|
-
export const toBinary = (vector: Float32Array | Float64Array | Int8Array): Uint8Array => {
|
|
132
|
-
const byteLength = Math.ceil(vector.length / 8);
|
|
133
|
-
const packedVector = new Uint8Array(byteLength);
|
|
134
|
-
|
|
135
|
-
for (let i = 0; i < vector.length; i++) {
|
|
136
|
-
if (vector[i] > 0) {
|
|
137
|
-
const byteIndex = Math.floor(i / 8);
|
|
138
|
-
const bitPosition = 7 - (i % 8);
|
|
139
|
-
packedVector[byteIndex] |= (1 << bitPosition);
|
|
140
|
-
}
|
|
141
|
-
}
|
|
142
|
-
|
|
143
|
-
return packedVector;
|
|
144
|
-
};
|
|
145
|
-
export default {
|
|
146
|
-
dot,
|
|
147
|
-
inner,
|
|
148
|
-
sqeuclidean,
|
|
149
|
-
euclidean,
|
|
150
|
-
cosine,
|
|
151
|
-
hamming,
|
|
152
|
-
jaccard,
|
|
153
|
-
kullbackleibler,
|
|
154
|
-
jensenshannon,
|
|
155
|
-
toBinary,
|
|
156
|
-
};
|
|
157
|
-
|
|
158
|
-
/**
|
|
159
|
-
* @brief Finds the directory where the native build of the simsimd module is located.
|
|
160
|
-
* @param {string} dir - The directory to start the search from.
|
|
161
|
-
*/
|
|
162
|
-
function getBuildDir(dir: string) {
|
|
163
|
-
if (existsSync(path.join(dir, "build"))) return dir;
|
|
164
|
-
if (existsSync(path.join(dir, "prebuilds"))) return dir;
|
|
165
|
-
if (path.basename(dir) === ".next") {
|
|
166
|
-
// special case for next.js on custom node (not vercel)
|
|
167
|
-
const sideways = path.join(dir, "..", "node_modules", "simsimd");
|
|
168
|
-
if (existsSync(sideways)) return getBuildDir(sideways);
|
|
169
|
-
}
|
|
170
|
-
if (dir === "/") throw new Error("Could not find native build for simsimd");
|
|
171
|
-
return getBuildDir(path.join(dir, ".."));
|
|
172
|
-
}
|
|
173
|
-
|
|
174
|
-
function getDirName() {
|
|
175
|
-
try {
|
|
176
|
-
if (__dirname) return __dirname;
|
|
177
|
-
} catch (e) { }
|
|
178
|
-
return getRoot(getFileName());
|
|
179
|
-
}
|