usearch 2.21.4 → 2.25.1
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 +65 -69
- package/binding.gyp +15 -37
- package/c/CMakeLists.txt +4 -5
- package/c/README.md +8 -8
- package/c/lib.cpp +32 -14
- package/c/test.c +124 -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/README.md +1 -1
- 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.test.js +117 -94
- 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
package/README.md
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
<h1 align="center">USearch</h1>
|
|
2
2
|
<h3 align="center">
|
|
3
3
|
Smaller & <a href="https://www.unum.cloud/blog/2023-11-07-scaling-vector-search-with-intel">Faster</a> Single-File<br/>
|
|
4
|
-
Similarity Search & Clustering Engine for <a href="https://github.com/ashvardanian/
|
|
4
|
+
Similarity Search & Clustering Engine for <a href="https://github.com/ashvardanian/numkong">Vectors</a> & 🔜 <a href="https://github.com/ashvardanian/stringzilla">Texts</a>
|
|
5
5
|
</h3>
|
|
6
6
|
<br/>
|
|
7
7
|
|
|
@@ -14,26 +14,26 @@ Similarity Search & Clustering Engine for <a href="https://github.com/ashvardani
|
|
|
14
14
|
|
|
15
15
|
<a href="https://unum.cloud/post"><img height="25" src="https://github.com/unum-cloud/.github/raw/main/assets/blog.svg" alt="Blog"></a>
|
|
16
16
|
|
|
17
|
-
<a href="https://github.com/unum-cloud/
|
|
17
|
+
<a href="https://github.com/unum-cloud/USearch"><img height="25" src="https://github.com/unum-cloud/.github/raw/main/assets/github.svg" alt="GitHub"></a>
|
|
18
18
|
</p>
|
|
19
19
|
|
|
20
20
|
<p align="center">
|
|
21
21
|
Spatial • Binary • Probabilistic • User-Defined Metrics
|
|
22
22
|
<br/>
|
|
23
|
-
<a href="https://unum-cloud.github.io/
|
|
24
|
-
<a href="https://unum-cloud.github.io/
|
|
25
|
-
<a href="https://unum-cloud.github.io/
|
|
26
|
-
<a href="https://unum-cloud.github.io/
|
|
27
|
-
<a href="https://unum-cloud.github.io/
|
|
28
|
-
<a href="https://unum-cloud.github.io/
|
|
29
|
-
<a href="https://unum-cloud.github.io/
|
|
30
|
-
<a href="https://unum-cloud.github.io/
|
|
31
|
-
<a href="https://unum-cloud.github.io/
|
|
32
|
-
<a href="https://unum-cloud.github.io/
|
|
33
|
-
<a href="https://unum-cloud.github.io/
|
|
23
|
+
<a href="https://unum-cloud.github.io/USearch/cpp">C++11</a> •
|
|
24
|
+
<a href="https://unum-cloud.github.io/USearch/python">Python 3</a> •
|
|
25
|
+
<a href="https://unum-cloud.github.io/USearch/javascript">JavaScript</a> •
|
|
26
|
+
<a href="https://unum-cloud.github.io/USearch/java">Java</a> •
|
|
27
|
+
<a href="https://unum-cloud.github.io/USearch/rust">Rust</a> •
|
|
28
|
+
<a href="https://unum-cloud.github.io/USearch/c">C99</a> •
|
|
29
|
+
<a href="https://unum-cloud.github.io/USearch/objective-c">Objective-C</a> •
|
|
30
|
+
<a href="https://unum-cloud.github.io/USearch/swift">Swift</a> •
|
|
31
|
+
<a href="https://unum-cloud.github.io/USearch/csharp">C#</a> •
|
|
32
|
+
<a href="https://unum-cloud.github.io/USearch/golang">Go</a> •
|
|
33
|
+
<a href="https://unum-cloud.github.io/USearch/wolfram">Wolfram</a>
|
|
34
34
|
<br/>
|
|
35
35
|
Linux • macOS • Windows • iOS • Android • WebAssembly •
|
|
36
|
-
<a href="https://unum-cloud.github.io/
|
|
36
|
+
<a href="https://unum-cloud.github.io/USearch/sqlite">SQLite</a>
|
|
37
37
|
</p>
|
|
38
38
|
|
|
39
39
|
<div align="center">
|
|
@@ -51,17 +51,17 @@ Linux • macOS • Windows • iOS • Android • WebAssembly •
|
|
|
51
51
|
- ✅ Simple and extensible [single C++11 header][usearch-header] __library__.
|
|
52
52
|
- ✅ [Trusted](#integrations) by giants like Google and DBs like [ClickHouse][clickhouse-docs] & [DuckDB][duckdb-docs].
|
|
53
53
|
- ✅ [SIMD][simd]-optimized and [user-defined metrics](#user-defined-functions) with JIT compilation.
|
|
54
|
-
- ✅ Hardware-agnostic `
|
|
54
|
+
- ✅ Hardware-agnostic `bf16`, `e5m2`, & `i8` - [half-precision & quarter-precision support](#memory-efficiency-downcasting-and-quantization).
|
|
55
55
|
- ✅ [View large indexes from disk](#serialization--serving-index-from-disk) without loading into RAM.
|
|
56
56
|
- ✅ Heterogeneous lookups, renaming/relabeling, and on-the-fly deletions.
|
|
57
57
|
- ✅ Binary Tanimoto and Sorensen coefficients for [Genomics and Chemistry applications](#usearch--rdkit--molecular-search).
|
|
58
58
|
- ✅ Space-efficient point-clouds with `uint40_t`, accommodating 4B+ size.
|
|
59
59
|
- ✅ Compatible with OpenMP and custom "executors" for fine-grained parallelism.
|
|
60
|
-
- ✅ [Semantic Search](#usearch--
|
|
60
|
+
- ✅ [Semantic Search](#usearch--uform--ucall--multimodal-semantic-search) and [Joins](#joins-one-to-one-one-to-many-and-many-to-many-mappings).
|
|
61
61
|
- 🔄 Near-real-time [clustering and sub-clustering](#clustering) for Tens or Millions of clusters.
|
|
62
62
|
|
|
63
63
|
[faiss]: https://github.com/facebookresearch/faiss
|
|
64
|
-
[usearch-header]: https://github.com/unum-cloud/
|
|
64
|
+
[usearch-header]: https://github.com/unum-cloud/USearch/blob/main/include/usearch/index.hpp
|
|
65
65
|
[obscure-use-cases]: https://ashvardanian.com/posts/abusing-vector-search
|
|
66
66
|
[hnsw-algorithm]: https://arxiv.org/abs/1603.09320
|
|
67
67
|
[simd]: https://en.wikipedia.org/wiki/Single_instruction,_multiple_data
|
|
@@ -138,7 +138,7 @@ The default storage/quantization level is hardware-dependant for efficiency, but
|
|
|
138
138
|
index = Index(
|
|
139
139
|
ndim=3, # Define the number of dimensions in input vectors
|
|
140
140
|
metric='cos', # Choose 'l2sq', 'ip', 'haversine' or other metric, default = 'cos'
|
|
141
|
-
dtype='bf16', # Store as 'f64', 'f32', 'f16', 'i8', 'b1'..., default = None
|
|
141
|
+
dtype='bf16', # Store as 'f64', 'f32', 'bf16', 'f16', 'e5m2', 'e4m3', 'e3m2', 'e2m3', 'u8', 'i8', 'b1'..., default = None
|
|
142
142
|
connectivity=16, # Optional: Limit number of neighbors per graph node
|
|
143
143
|
expansion_add=128, # Optional: Control the recall of indexing
|
|
144
144
|
expansion_search=64, # Optional: Control the quality of the search
|
|
@@ -185,8 +185,8 @@ one_in_many: Matches = search(vectors, vector, 50, MetricKind.L2sq, exact=True)
|
|
|
185
185
|
many_in_many: BatchMatches = search(vectors, vectors, 50, MetricKind.L2sq, exact=True)
|
|
186
186
|
```
|
|
187
187
|
|
|
188
|
-
If you pass the `exact=True` argument, the system bypasses indexing altogether and performs a brute-force search through the entire dataset using SIMD-optimized similarity metrics from [
|
|
189
|
-
When compared to FAISS's `IndexFlatL2` in Google Colab, __[USearch may offer up to a 20x performance improvement](https://github.com/unum-cloud/
|
|
188
|
+
If you pass the `exact=True` argument, the system bypasses indexing altogether and performs a brute-force search through the entire dataset using SIMD-optimized similarity metrics from [NumKong](https://github.com/ashvardanian/numkong).
|
|
189
|
+
When compared to FAISS's `IndexFlatL2` in Google Colab, __[USearch may offer up to a 20x performance improvement](https://github.com/unum-cloud/USearch/issues/176#issuecomment-1666650778)__:
|
|
190
190
|
|
|
191
191
|
- `faiss.IndexFlatL2`: __55.3 ms__.
|
|
192
192
|
- `usearch.index.search`: __2.54 ms__.
|
|
@@ -195,7 +195,7 @@ When compared to FAISS's `IndexFlatL2` in Google Colab, __[USearch may offer up
|
|
|
195
195
|
|
|
196
196
|
While most vector search packages concentrate on just two metrics, "Inner Product distance" and "Euclidean distance", USearch allows arbitrary user-defined metrics.
|
|
197
197
|
This flexibility allows you to customize your search for various applications, from computing geospatial coordinates with the rare [Haversine][haversine] distance to creating custom metrics for composite embeddings from multiple AI models, like joint image-text embeddings.
|
|
198
|
-
You can use [Numba][numba], [Cppyy][cppyy], or [PeachPy][peachpy] to define your [custom metric even in Python](https://unum-cloud.github.io/
|
|
198
|
+
You can use [Numba][numba], [Cppyy][cppyy], or [PeachPy][peachpy] to define your [custom metric even in Python](https://unum-cloud.github.io/USearch/python#user-defined-metrics-and-jit-in-python):
|
|
199
199
|
|
|
200
200
|
```py
|
|
201
201
|
from numba import cfunc, types, carray
|
|
@@ -251,7 +251,7 @@ assert!(
|
|
|
251
251
|
Training a quantization model and dimension-reduction is a common approach to accelerate vector search.
|
|
252
252
|
Those, however, are only sometimes reliable, can significantly affect the statistical properties of your data, and require regular adjustments if your distribution shifts.
|
|
253
253
|
Instead, we have focused on high-precision arithmetic over low-precision downcasted vectors.
|
|
254
|
-
The same index, and `add` and `search` operations will automatically down-cast or up-cast between `f64_t`, `f32_t`, `f16_t`, `i8_t`, and single-bit `b1x8_t` representations.
|
|
254
|
+
The same index, and `add` and `search` operations will automatically down-cast or up-cast between `f64_t`, `f32_t`, `bf16_t`, `f16_t`, `e5m2_t`, `e4m3_t`, `e3m2_t`, `e2m3_t`, `u8_t`, `i8_t`, and single-bit `b1x8_t` representations.
|
|
255
255
|
You can use the following command to check, if hardware acceleration is enabled:
|
|
256
256
|
|
|
257
257
|
```sh
|
|
@@ -261,14 +261,16 @@ $ python -c 'from usearch.index import Index; print(Index(ndim=166, metric="tani
|
|
|
261
261
|
> ice
|
|
262
262
|
```
|
|
263
263
|
|
|
264
|
-
In most cases,
|
|
264
|
+
In most cases, `bf16` is recommended for modern CPUs.
|
|
265
|
+
For even smaller footprints, USearch supports IEEE & MX-compatible Float8 (`e5m2` and `e4m3`) and Float6 (`e3m2` and `e2m3`) formats.
|
|
266
|
+
You can pass pre-quantized buffers from [NumKong](https://github.com/ashvardanian/numkong) with the explicit `dtype=` parameter on `add` and `search`, or let USearch handle the quantization internally from higher-precision inputs.
|
|
265
267
|
When quantization is enabled, the "get"-like functions won't be able to recover the original data, so you may want to replicate the original vectors elsewhere.
|
|
266
268
|
When quantizing to `i8_t` integers, note that it's only valid for cosine-like metrics.
|
|
267
269
|
As part of the quantization process, the vectors are normalized to unit length and later scaled to [-127, 127] range to occupy the full 8-bit range.
|
|
268
270
|
When quantizing to `b1x8_t` single-bit representations, note that it's only valid for binary metrics like Jaccard, Hamming, etc.
|
|
269
271
|
As part of the quantization process, the scalar components greater than zero are set to `true`, and the rest to `false`.
|
|
270
272
|
|
|
271
|
-

|
|
272
274
|
|
|
273
275
|
Using smaller numeric types will save you RAM needed to store the vectors, but you can also compress the neighbors lists forming our proximity graphs.
|
|
274
276
|
By default, 32-bit `uint32_t` is used to enumerate those, which is not enough if you need to address over 4 Billion entries.
|
|
@@ -479,46 +481,41 @@ The Haversine distance is available out of the box, but you can also define more
|
|
|
479
481
|
from numba import cfunc, types, carray
|
|
480
482
|
import math
|
|
481
483
|
|
|
482
|
-
# Define the dimension as 2 for latitude and longitude
|
|
483
484
|
ndim = 2
|
|
485
|
+
semi_major, flattening = 6378137.0, 1 / 298.257223563
|
|
486
|
+
semi_minor = (1 - flattening) * semi_major
|
|
487
|
+
|
|
488
|
+
def vincenty_distance(first_ptr, second_ptr):
|
|
489
|
+
first, second = carray(first_ptr, ndim), carray(second_ptr, ndim)
|
|
490
|
+
lat1, lon1, lat2, lon2 = first[0], first[1], second[0], second[1]
|
|
491
|
+
diff_lon = lon2 - lon1
|
|
492
|
+
rlat1, rlat2 = math.atan((1 - flattening) * math.tan(lat1)), math.atan((1 - flattening) * math.tan(lat2))
|
|
493
|
+
sin_rlat1, cos_rlat1 = math.sin(rlat1), math.cos(rlat1)
|
|
494
|
+
sin_rlat2, cos_rlat2 = math.sin(rlat2), math.cos(rlat2)
|
|
495
|
+
lon_on_sphere = diff_lon
|
|
496
|
+
for _ in range(100):
|
|
497
|
+
sin_lon, cos_lon = math.sin(lon_on_sphere), math.cos(lon_on_sphere)
|
|
498
|
+
sin_ang = math.sqrt((cos_rlat2 * sin_lon) ** 2 + (cos_rlat1 * sin_rlat2 - sin_rlat1 * cos_rlat2 * cos_lon) ** 2)
|
|
499
|
+
if sin_ang == 0: return 0.0
|
|
500
|
+
cos_ang = sin_rlat1 * sin_rlat2 + cos_rlat1 * cos_rlat2 * cos_lon
|
|
501
|
+
ang = math.atan2(sin_ang, cos_ang)
|
|
502
|
+
sin_az = cos_rlat1 * cos_rlat2 * sin_lon / sin_ang
|
|
503
|
+
cos2_az = 1 - sin_az ** 2
|
|
504
|
+
cos2_mid = cos_ang - 2 * sin_rlat1 * sin_rlat2 / cos2_az if cos2_az != 0 else 0.0
|
|
505
|
+
corr = flattening / 16 * cos2_az * (4 + flattening * (4 - 3 * cos2_az))
|
|
506
|
+
prev = lon_on_sphere
|
|
507
|
+
lon_on_sphere = diff_lon + (1 - corr) * flattening * (
|
|
508
|
+
sin_az * (ang + corr * sin_ang * (cos2_mid + corr * cos_ang * (-1 + 2 * cos2_mid ** 2))))
|
|
509
|
+
if abs(lon_on_sphere - prev) <= 1e-12: break
|
|
510
|
+
else:
|
|
511
|
+
return float('nan')
|
|
512
|
+
u_sq = cos2_az * (semi_major ** 2 - semi_minor ** 2) / (semi_minor ** 2)
|
|
513
|
+
ca = 1 + u_sq / 16384 * (4096 + u_sq * (-768 + u_sq * (320 - 175 * u_sq)))
|
|
514
|
+
cb = u_sq / 1024 * (256 + u_sq * (-128 + u_sq * (74 - 47 * u_sq)))
|
|
515
|
+
delta = cb * sin_ang * (cos2_mid + cb / 4 * (cos_ang * (-1 + 2 * cos2_mid ** 2)
|
|
516
|
+
- cb / 6 * cos2_mid * (-3 + 4 * sin_ang ** 2) * (-3 + 4 * cos2_mid ** 2)))
|
|
517
|
+
return semi_minor * ca * (ang - delta) / 1000.0
|
|
484
518
|
|
|
485
|
-
# Signature for the custom metric
|
|
486
|
-
signature = types.float32(
|
|
487
|
-
types.CPointer(types.float32),
|
|
488
|
-
types.CPointer(types.float32))
|
|
489
|
-
|
|
490
|
-
# WGS-84 ellipsoid parameters
|
|
491
|
-
a = 6378137.0 # major axis in meters
|
|
492
|
-
f = 1 / 298.257223563 # flattening
|
|
493
|
-
b = (1 - f) * a # minor axis
|
|
494
|
-
|
|
495
|
-
def vincenty_distance(a_ptr, b_ptr):
|
|
496
|
-
a_array = carray(a_ptr, ndim)
|
|
497
|
-
b_array = carray(b_ptr, ndim)
|
|
498
|
-
lat1, lon1, lat2, lon2 = a_array[0], a_array[1], b_array[0], b_array[1]
|
|
499
|
-
L, U1, U2 = lon2 - lon1, math.atan((1 - f) * math.tan(lat1)), math.atan((1 - f) * math.tan(lat2))
|
|
500
|
-
sinU1, cosU1, sinU2, cosU2 = math.sin(U1), math.cos(U1), math.sin(U2), math.cos(U2)
|
|
501
|
-
lambda_, iterLimit = L, 100
|
|
502
|
-
while iterLimit > 0:
|
|
503
|
-
iterLimit -= 1
|
|
504
|
-
sinLambda, cosLambda = math.sin(lambda_), math.cos(lambda_)
|
|
505
|
-
sinSigma = math.sqrt((cosU2 * sinLambda) ** 2 + (cosU1 * sinU2 - sinU1 * cosU2 * cosLambda) ** 2)
|
|
506
|
-
if sinSigma == 0: return 0.0 # Co-incident points
|
|
507
|
-
cosSigma, sigma = sinU1 * sinU2 + cosU1 * cosU2 * cosLambda, math.atan2(sinSigma, cosSigma)
|
|
508
|
-
sinAlpha, cos2Alpha = cosU1 * cosU2 * sinLambda / sinSigma, 1 - (cosU1 * cosU2 * sinLambda / sinSigma) ** 2
|
|
509
|
-
cos2SigmaM = cosSigma - 2 * sinU1 * sinU2 / cos2Alpha if not math.isnan(cosSigma - 2 * sinU1 * sinU2 / cos2Alpha) else 0 # Equatorial line
|
|
510
|
-
C = f / 16 * cos2Alpha * (4 + f * (4 - 3 * cos2Alpha))
|
|
511
|
-
lambda_, lambdaP = L + (1 - C) * f * (sinAlpha * (sigma + C * sinSigma * (cos2SigmaM + C * cosSigma * (-1 + 2 * cos2SigmaM ** 2)))), lambda_
|
|
512
|
-
if abs(lambda_ - lambdaP) <= 1e-12: break
|
|
513
|
-
if iterLimit == 0: return float('nan') # formula failed to converge
|
|
514
|
-
u2 = cos2Alpha * (a ** 2 - b ** 2) / (b ** 2)
|
|
515
|
-
A = 1 + u2 / 16384 * (4096 + u2 * (-768 + u2 * (320 - 175 * u2)))
|
|
516
|
-
B = u2 / 1024 * (256 + u2 * (-128 + u2 * (74 - 47 * u2)))
|
|
517
|
-
deltaSigma = B * sinSigma * (cos2SigmaM + B / 4 * (cosSigma * (-1 + 2 * cos2SigmaM ** 2) - B / 6 * cos2SigmaM * (-3 + 4 * sinSigma ** 2) * (-3 + 4 * cos2SigmaM ** 2)))
|
|
518
|
-
s = b * A * (sigma - deltaSigma)
|
|
519
|
-
return s / 1000.0 # Distance in kilometers
|
|
520
|
-
|
|
521
|
-
# Example usage:
|
|
522
519
|
index = Index(ndim=ndim, metric=CompiledMetric(
|
|
523
520
|
pointer=vincenty_distance.address,
|
|
524
521
|
kind=MetricKind.Haversine,
|
|
@@ -533,27 +530,26 @@ index = Index(ndim=ndim, metric=CompiledMetric(
|
|
|
533
530
|
- [x] ScyllaDB: [Rust](https://github.com/scylladb/vector-store), [presentation](https://www.slideshare.net/slideshow/vector-search-with-scylladb-by-szymon-wasik/276571548).
|
|
534
531
|
- [x] TiDB & TiFlash: [C++](https://github.com/pingcap/tiflash), [announcement](https://www.pingcap.com/article/introduce-vector-search-indexes-in-tidb/).
|
|
535
532
|
- [x] YugaByte: [C++](https://github.com/yugabyte/yugabyte-db/blob/366b9f5e3c4df3a1a17d553db41d6dc50146f488/src/yb/vector_index/usearch_wrapper.cc).
|
|
536
|
-
- [x] Google: [UniSim](https://github.com/google/unisim), [RetSim](https://arxiv.org/abs/2311.17264) paper.
|
|
537
533
|
- [x] MemGraph: [C++](https://github.com/memgraph/memgraph/blob/784dd8520f65050d033aea8b29446e84e487d091/src/storage/v2/indices/vector_index.cpp), [announcement](https://memgraph.com/blog/simplify-data-retrieval-memgraph-vector-search).
|
|
538
|
-
- [x]
|
|
534
|
+
- [x] Google: [UniSim](https://github.com/google/unisim), [RetSim](https://arxiv.org/abs/2311.17264) paper.
|
|
539
535
|
- [x] LangChain: [Python](https://github.com/langchain-ai/langchain/releases/tag/v0.0.257) and [JavaScript](https://github.com/hwchase17/langchainjs/releases/tag/0.0.125).
|
|
540
536
|
- [x] Microsoft Semantic Kernel: [Python](https://github.com/microsoft/semantic-kernel/releases/tag/python-0.3.9.dev) and C#.
|
|
541
537
|
- [x] GPTCache: [Python](https://github.com/zilliztech/GPTCache/releases/tag/0.1.29).
|
|
542
538
|
- [x] Sentence-Transformers: Python [docs](https://www.sbert.net/docs/package_reference/quantization.html#sentence_transformers.quantization.semantic_search_usearch).
|
|
543
539
|
- [x] Pathway: [Rust](https://github.com/pathwaycom/pathway).
|
|
544
540
|
- [x] Vald: [GoLang](https://github.com/vdaas/vald).
|
|
541
|
+
- [x] MatrixOne: [GoLang](https://github.com/matrixorigin/matrixone).
|
|
545
542
|
|
|
546
543
|
|
|
547
544
|
## Citations
|
|
548
545
|
|
|
549
546
|
```bibtex
|
|
550
|
-
@software{
|
|
547
|
+
@software{Vardanian_USearch,
|
|
551
548
|
doi = {10.5281/zenodo.7949416},
|
|
552
549
|
author = {Vardanian, Ash},
|
|
553
550
|
title = {{USearch by Unum Cloud}},
|
|
554
|
-
url = {https://github.com/unum-cloud/
|
|
555
|
-
version = {2.
|
|
556
|
-
year = {
|
|
557
|
-
month = oct,
|
|
551
|
+
url = {https://github.com/unum-cloud/USearch},
|
|
552
|
+
version = {2.25.1},
|
|
553
|
+
year = {2026},
|
|
558
554
|
}
|
|
559
555
|
```
|
package/binding.gyp
CHANGED
|
@@ -1,8 +1,16 @@
|
|
|
1
1
|
{
|
|
2
|
+
"variables": {
|
|
3
|
+
"numkong_root": "./numkong",
|
|
4
|
+
},
|
|
5
|
+
"includes": ["./numkong/numkong.gypi"],
|
|
2
6
|
"targets": [
|
|
3
7
|
{
|
|
4
8
|
"target_name": "usearch",
|
|
5
|
-
"sources": ["javascript/lib.cpp"
|
|
9
|
+
"sources": ["javascript/lib.cpp"],
|
|
10
|
+
"dependencies": [
|
|
11
|
+
"<!(node -p \"require('node-addon-api').gyp\")",
|
|
12
|
+
"numkong_lib",
|
|
13
|
+
],
|
|
6
14
|
"cflags": [
|
|
7
15
|
"-fexceptions",
|
|
8
16
|
"-Wno-unknown-pragmas",
|
|
@@ -17,10 +25,11 @@
|
|
|
17
25
|
"include_dirs": [
|
|
18
26
|
"<!@(node -p \"require('node-addon-api').include\")",
|
|
19
27
|
"include",
|
|
20
|
-
"fp16/include",
|
|
21
|
-
"simsimd/include",
|
|
22
28
|
],
|
|
23
|
-
"
|
|
29
|
+
"defines": [
|
|
30
|
+
"USEARCH_USE_NUMKONG=1",
|
|
31
|
+
"NK_DYNAMIC_DISPATCH=1",
|
|
32
|
+
],
|
|
24
33
|
"xcode_settings": {
|
|
25
34
|
"GCC_ENABLE_CPP_EXCEPTIONS": "YES",
|
|
26
35
|
"CLANG_CXX_LIBRARY": "libc++",
|
|
@@ -31,7 +40,7 @@
|
|
|
31
40
|
"msvs_settings": {
|
|
32
41
|
"VCCLCompilerTool": {
|
|
33
42
|
"ExceptionHandling": 1,
|
|
34
|
-
"AdditionalOptions": ["-std:c++17"],
|
|
43
|
+
"AdditionalOptions": ["-std:c++17", "/Zc:preprocessor"],
|
|
35
44
|
}
|
|
36
45
|
},
|
|
37
46
|
"conditions": [
|
|
@@ -44,17 +53,6 @@
|
|
|
44
53
|
"ldflags": ['<!(if [ "$USEARCH_USE_OPENMP" = "1" ]; then echo \'-lgomp\'; fi)'],
|
|
45
54
|
"defines": [
|
|
46
55
|
"USEARCH_USE_OPENMP=<!(echo ${USEARCH_USE_OPENMP:-0})",
|
|
47
|
-
"USEARCH_USE_SIMSIMD=<!(echo ${USEARCH_USE_SIMSIMD:-1})",
|
|
48
|
-
"USEARCH_USE_FP16LIB=<!(echo ${USEARCH_USE_FP16LIB:-1})",
|
|
49
|
-
"SIMSIMD_TARGET_NEON=<!(echo ${SIMSIMD_TARGET_NEON:-1})",
|
|
50
|
-
"SIMSIMD_TARGET_NEON_BF16=<!(echo ${SIMSIMD_TARGET_NEON_BF16:-0})",
|
|
51
|
-
"SIMSIMD_TARGET_SVE=<!(echo ${SIMSIMD_TARGET_SVE:-1})",
|
|
52
|
-
"SIMSIMD_TARGET_SVE_BF16=<!(echo ${SIMSIMD_TARGET_SVE_BF16:-0})",
|
|
53
|
-
"SIMSIMD_TARGET_HASWELL=<!(echo ${SIMSIMD_TARGET_HASWELL:-1})",
|
|
54
|
-
"SIMSIMD_TARGET_SKYLAKE=<!(echo ${SIMSIMD_TARGET_SKYLAKE:-1})",
|
|
55
|
-
"SIMSIMD_TARGET_ICE=<!(echo ${SIMSIMD_TARGET_ICE:-1})",
|
|
56
|
-
"SIMSIMD_TARGET_GENOA=<!(echo ${SIMSIMD_TARGET_GENOA:-1})",
|
|
57
|
-
"SIMSIMD_TARGET_SAPPHIRE=<!(echo ${SIMSIMD_TARGET_SAPPHIRE:-1})",
|
|
58
56
|
],
|
|
59
57
|
},
|
|
60
58
|
],
|
|
@@ -62,17 +60,7 @@
|
|
|
62
60
|
'OS=="mac"',
|
|
63
61
|
{
|
|
64
62
|
"defines": [
|
|
65
|
-
"USEARCH_USE_OPENMP
|
|
66
|
-
"USEARCH_USE_SIMSIMD=<!(echo ${USEARCH_USE_SIMSIMD:-0})",
|
|
67
|
-
"USEARCH_USE_FP16LIB=<!(echo ${USEARCH_USE_FP16LIB:-1})",
|
|
68
|
-
"SIMSIMD_TARGET_NEON=<!(echo ${SIMSIMD_TARGET_NEON:-1})",
|
|
69
|
-
"SIMSIMD_TARGET_NEON_BF16=<!(echo ${SIMSIMD_TARGET_NEON_BF16:-0})",
|
|
70
|
-
"SIMSIMD_TARGET_SVE=<!(echo ${SIMSIMD_TARGET_SVE:-0})",
|
|
71
|
-
"SIMSIMD_TARGET_HASWELL=<!(echo ${SIMSIMD_TARGET_HASWELL:-1})",
|
|
72
|
-
"SIMSIMD_TARGET_SKYLAKE=<!(echo ${SIMSIMD_TARGET_SKYLAKE:-0})",
|
|
73
|
-
"SIMSIMD_TARGET_ICE=<!(echo ${SIMSIMD_TARGET_ICE:-0})",
|
|
74
|
-
"SIMSIMD_TARGET_GENOA=<!(echo ${SIMSIMD_TARGET_GENOA:-0})",
|
|
75
|
-
"SIMSIMD_TARGET_SAPPHIRE=<!(echo ${SIMSIMD_TARGET_SAPPHIRE:-0})",
|
|
63
|
+
"USEARCH_USE_OPENMP=0",
|
|
76
64
|
],
|
|
77
65
|
},
|
|
78
66
|
],
|
|
@@ -81,16 +69,6 @@
|
|
|
81
69
|
{
|
|
82
70
|
"defines": [
|
|
83
71
|
"USEARCH_USE_OPENMP=0",
|
|
84
|
-
"USEARCH_USE_SIMSIMD=0",
|
|
85
|
-
"USEARCH_USE_FP16LIB=1",
|
|
86
|
-
"SIMSIMD_TARGET_SKYLAKE=0",
|
|
87
|
-
"SIMSIMD_TARGET_ICE=0",
|
|
88
|
-
"SIMSIMD_TARGET_SAPPHIRE=0",
|
|
89
|
-
"SIMSIMD_TARGET_GENOA=0",
|
|
90
|
-
"SIMSIMD_TARGET_SVE=0",
|
|
91
|
-
"SIMSIMD_TARGET_HASWELL=0",
|
|
92
|
-
"SIMSIMD_TARGET_NEON=0",
|
|
93
|
-
"SIMSIMD_TARGET_NEON_BF16=0",
|
|
94
72
|
],
|
|
95
73
|
},
|
|
96
74
|
],
|
package/c/CMakeLists.txt
CHANGED
|
@@ -1,9 +1,4 @@
|
|
|
1
|
-
|
|
2
|
-
# Define the source files conditionally
|
|
3
1
|
set(USEARCH_LIB_SOURCES lib.cpp)
|
|
4
|
-
if (USEARCH_USE_SIMSIMD)
|
|
5
|
-
list(APPEND USEARCH_LIB_SOURCES ../simsimd/c/lib.c)
|
|
6
|
-
endif ()
|
|
7
2
|
|
|
8
3
|
if (USEARCH_BUILD_TEST_C)
|
|
9
4
|
add_executable(test_c test.c ${USEARCH_LIB_SOURCES})
|
|
@@ -11,6 +6,10 @@ if (USEARCH_BUILD_TEST_C)
|
|
|
11
6
|
include(CTest)
|
|
12
7
|
enable_testing()
|
|
13
8
|
add_test(NAME test_c COMMAND test_c)
|
|
9
|
+
|
|
10
|
+
# Export the dynamic symbol table so `backtrace_symbols_fd` can resolve
|
|
11
|
+
# function names when the in-test crash handler fires.
|
|
12
|
+
set_target_properties(test_c PROPERTIES ENABLE_EXPORTS ON)
|
|
14
13
|
endif ()
|
|
15
14
|
|
|
16
15
|
# This article discusses a better way to allow building either static or shared libraries:
|
package/c/README.md
CHANGED
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
## Installation
|
|
4
4
|
|
|
5
5
|
USearch vector-search engine can be integrated into your project using CMake.
|
|
6
|
-
Alternatively, you can download one of the precompiled binaries from the [releases page](https://github.com/unum-cloud/
|
|
6
|
+
Alternatively, you can download one of the precompiled binaries from the [releases page](https://github.com/unum-cloud/USearch/releases).
|
|
7
7
|
|
|
8
8
|
## Quickstart
|
|
9
9
|
|
|
@@ -19,7 +19,7 @@ int main() {
|
|
|
19
19
|
usearch_error_t error = NULL;
|
|
20
20
|
usearch_init_options_t opts = {
|
|
21
21
|
.metric_kind = usearch_metric_cos_k,
|
|
22
|
-
.scalar_kind = usearch_scalar_f16_k,
|
|
22
|
+
.scalar_kind = usearch_scalar_f16_k, // or f32_k, bf16_k, e5m2_k, e4m3_k, e3m2_k, e2m3_k, i8_k, u8_k
|
|
23
23
|
.dimensions = dimensions,
|
|
24
24
|
.expansion_add = 0, // for defaults
|
|
25
25
|
.expansion_search = 0 // for defaults
|
|
@@ -89,7 +89,7 @@ usearch_metadata_buffer(buffer, bytes, &opts, &error);
|
|
|
89
89
|
|
|
90
90
|
## Metrics
|
|
91
91
|
|
|
92
|
-
USearch comes pre-packaged with
|
|
92
|
+
USearch comes pre-packaged with NumKong, bringing over 100 SIMD-accelerated distance kernels for x86 and ARM architectures.
|
|
93
93
|
That includes:
|
|
94
94
|
|
|
95
95
|
- `usearch_metric_cos_k` - Cosine Similarity metric, defined as `Cos = 1 - sum(a[i] * b[i]) / (sqrt(sum(a[i]^2) * sqrt(sum(b[i]^2)))`.
|
|
@@ -107,7 +107,7 @@ That includes:
|
|
|
107
107
|
You can also define your own metrics by implementing the `usearch_metric_t` interface:
|
|
108
108
|
|
|
109
109
|
```c
|
|
110
|
-
|
|
110
|
+
usearch_distance_t callback(void const* a, void const* b, void* state) {
|
|
111
111
|
// Your custom metric implementation here
|
|
112
112
|
}
|
|
113
113
|
|
|
@@ -183,15 +183,15 @@ Alternatively, you can benefit from faster thread-pools and priority queues for
|
|
|
183
183
|
size_t threads = 0;
|
|
184
184
|
size_t top_k = 10;
|
|
185
185
|
size_t dataset_count = 1000, queries_count = 10;
|
|
186
|
-
|
|
187
|
-
|
|
186
|
+
nk_f16_t dataset[dataset_count][dimensions];
|
|
187
|
+
nk_f16_t queries[queries_count][dimensions];
|
|
188
188
|
|
|
189
189
|
usearch_key_t resulting_keys[queries_count][top_k];
|
|
190
190
|
usearch_distance_t resulting_distances[queries_count][top_k];
|
|
191
191
|
|
|
192
192
|
usearch_exact_search(
|
|
193
|
-
&dataset[0][0], dataset_count, dimensions * sizeof(
|
|
194
|
-
&queries[0][0], queries_count, dimensions * sizeof(
|
|
193
|
+
&dataset[0][0], dataset_count, dimensions * sizeof(nk_f16_t),
|
|
194
|
+
&queries[0][0], queries_count, dimensions * sizeof(nk_f16_t),
|
|
195
195
|
usearch_scalar_f16_k, top_k, threads,
|
|
196
196
|
&resulting_keys[0][0], sizeof(usearch_key_t) * top_k,
|
|
197
197
|
&resulting_distances[0][0], sizeof(usearch_distance_t) * top_k,
|
package/c/lib.cpp
CHANGED
|
@@ -56,11 +56,16 @@ usearch_metric_kind_t metric_kind_to_c(metric_kind_t kind) {
|
|
|
56
56
|
}
|
|
57
57
|
scalar_kind_t scalar_kind_to_cpp(usearch_scalar_kind_t kind) {
|
|
58
58
|
switch (kind) {
|
|
59
|
-
case usearch_scalar_f32_k: return scalar_kind_t::f32_k;
|
|
60
59
|
case usearch_scalar_f64_k: return scalar_kind_t::f64_k;
|
|
61
|
-
case
|
|
60
|
+
case usearch_scalar_f32_k: return scalar_kind_t::f32_k;
|
|
62
61
|
case usearch_scalar_bf16_k: return scalar_kind_t::bf16_k;
|
|
62
|
+
case usearch_scalar_f16_k: return scalar_kind_t::f16_k;
|
|
63
|
+
case usearch_scalar_e5m2_k: return scalar_kind_t::e5m2_k;
|
|
64
|
+
case usearch_scalar_e4m3_k: return scalar_kind_t::e4m3_k;
|
|
65
|
+
case usearch_scalar_e3m2_k: return scalar_kind_t::e3m2_k;
|
|
66
|
+
case usearch_scalar_e2m3_k: return scalar_kind_t::e2m3_k;
|
|
63
67
|
case usearch_scalar_i8_k: return scalar_kind_t::i8_k;
|
|
68
|
+
case usearch_scalar_u8_k: return scalar_kind_t::u8_k;
|
|
64
69
|
case usearch_scalar_b1_k: return scalar_kind_t::b1x8_k;
|
|
65
70
|
default: return scalar_kind_t::unknown_k;
|
|
66
71
|
}
|
|
@@ -68,11 +73,16 @@ scalar_kind_t scalar_kind_to_cpp(usearch_scalar_kind_t kind) {
|
|
|
68
73
|
|
|
69
74
|
usearch_scalar_kind_t scalar_kind_to_c(scalar_kind_t kind) {
|
|
70
75
|
switch (kind) {
|
|
71
|
-
case scalar_kind_t::f32_k: return usearch_scalar_f32_k;
|
|
72
76
|
case scalar_kind_t::f64_k: return usearch_scalar_f64_k;
|
|
73
|
-
case scalar_kind_t::
|
|
77
|
+
case scalar_kind_t::f32_k: return usearch_scalar_f32_k;
|
|
74
78
|
case scalar_kind_t::bf16_k: return usearch_scalar_bf16_k;
|
|
79
|
+
case scalar_kind_t::f16_k: return usearch_scalar_f16_k;
|
|
80
|
+
case scalar_kind_t::e5m2_k: return usearch_scalar_e5m2_k;
|
|
81
|
+
case scalar_kind_t::e4m3_k: return usearch_scalar_e4m3_k;
|
|
82
|
+
case scalar_kind_t::e3m2_k: return usearch_scalar_e3m2_k;
|
|
83
|
+
case scalar_kind_t::e2m3_k: return usearch_scalar_e2m3_k;
|
|
75
84
|
case scalar_kind_t::i8_k: return usearch_scalar_i8_k;
|
|
85
|
+
case scalar_kind_t::u8_k: return usearch_scalar_u8_k;
|
|
76
86
|
case scalar_kind_t::b1x8_k: return usearch_scalar_b1_k;
|
|
77
87
|
default: return usearch_scalar_unknown_k;
|
|
78
88
|
}
|
|
@@ -80,11 +90,12 @@ usearch_scalar_kind_t scalar_kind_to_c(scalar_kind_t kind) {
|
|
|
80
90
|
|
|
81
91
|
add_result_t add_(index_dense_t* index, usearch_key_t key, void const* vector, scalar_kind_t kind) {
|
|
82
92
|
switch (kind) {
|
|
83
|
-
case scalar_kind_t::f32_k: return index->add(key, (f32_t const*)vector);
|
|
84
93
|
case scalar_kind_t::f64_k: return index->add(key, (f64_t const*)vector);
|
|
85
|
-
case scalar_kind_t::
|
|
94
|
+
case scalar_kind_t::f32_k: return index->add(key, (f32_t const*)vector);
|
|
86
95
|
case scalar_kind_t::bf16_k: return index->add(key, (bf16_t const*)vector);
|
|
96
|
+
case scalar_kind_t::f16_k: return index->add(key, (f16_t const*)vector);
|
|
87
97
|
case scalar_kind_t::i8_k: return index->add(key, (i8_t const*)vector);
|
|
98
|
+
case scalar_kind_t::u8_k: return index->add(key, (u8_t const*)vector);
|
|
88
99
|
case scalar_kind_t::b1x8_k: return index->add(key, (b1x8_t const*)vector);
|
|
89
100
|
default: return add_result_t{}.failed("Unknown scalar kind!");
|
|
90
101
|
}
|
|
@@ -92,11 +103,12 @@ add_result_t add_(index_dense_t* index, usearch_key_t key, void const* vector, s
|
|
|
92
103
|
|
|
93
104
|
std::size_t get_(index_dense_t* index, usearch_key_t key, size_t count, void* vector, scalar_kind_t kind) {
|
|
94
105
|
switch (kind) {
|
|
95
|
-
case scalar_kind_t::f32_k: return index->get(key, (f32_t*)vector, count);
|
|
96
106
|
case scalar_kind_t::f64_k: return index->get(key, (f64_t*)vector, count);
|
|
97
|
-
case scalar_kind_t::
|
|
107
|
+
case scalar_kind_t::f32_k: return index->get(key, (f32_t*)vector, count);
|
|
98
108
|
case scalar_kind_t::bf16_k: return index->get(key, (bf16_t*)vector, count);
|
|
109
|
+
case scalar_kind_t::f16_k: return index->get(key, (f16_t*)vector, count);
|
|
99
110
|
case scalar_kind_t::i8_k: return index->get(key, (i8_t*)vector, count);
|
|
111
|
+
case scalar_kind_t::u8_k: return index->get(key, (u8_t*)vector, count);
|
|
100
112
|
case scalar_kind_t::b1x8_k: return index->get(key, (b1x8_t*)vector, count);
|
|
101
113
|
default: return search_result_t(*index).failed("Unknown scalar kind!");
|
|
102
114
|
}
|
|
@@ -106,16 +118,18 @@ template <typename predicate_at = dummy_predicate_t>
|
|
|
106
118
|
search_result_t search_(index_dense_t* index, void const* vector, scalar_kind_t kind, size_t n,
|
|
107
119
|
predicate_at&& predicate = predicate_at{}) {
|
|
108
120
|
switch (kind) {
|
|
109
|
-
case scalar_kind_t::f32_k:
|
|
110
|
-
return index->filtered_search((f32_t const*)vector, n, std::forward<predicate_at>(predicate));
|
|
111
121
|
case scalar_kind_t::f64_k:
|
|
112
122
|
return index->filtered_search((f64_t const*)vector, n, std::forward<predicate_at>(predicate));
|
|
113
|
-
case scalar_kind_t::
|
|
114
|
-
return index->filtered_search((
|
|
123
|
+
case scalar_kind_t::f32_k:
|
|
124
|
+
return index->filtered_search((f32_t const*)vector, n, std::forward<predicate_at>(predicate));
|
|
115
125
|
case scalar_kind_t::bf16_k:
|
|
116
126
|
return index->filtered_search((bf16_t const*)vector, n, std::forward<predicate_at>(predicate));
|
|
127
|
+
case scalar_kind_t::f16_k:
|
|
128
|
+
return index->filtered_search((f16_t const*)vector, n, std::forward<predicate_at>(predicate));
|
|
117
129
|
case scalar_kind_t::i8_k:
|
|
118
130
|
return index->filtered_search((i8_t const*)vector, n, std::forward<predicate_at>(predicate));
|
|
131
|
+
case scalar_kind_t::u8_k:
|
|
132
|
+
return index->filtered_search((u8_t const*)vector, n, std::forward<predicate_at>(predicate));
|
|
119
133
|
case scalar_kind_t::b1x8_k:
|
|
120
134
|
return index->filtered_search((b1x8_t const*)vector, n, std::forward<predicate_at>(predicate));
|
|
121
135
|
default: return search_result_t(*index).failed("Unknown scalar kind!");
|
|
@@ -133,6 +147,10 @@ USEARCH_EXPORT char const* usearch_version(void) {
|
|
|
133
147
|
return version;
|
|
134
148
|
}
|
|
135
149
|
|
|
150
|
+
USEARCH_EXPORT char const* usearch_hardware_acceleration_compiled(void) { return hardware_acceleration_compiled(); }
|
|
151
|
+
|
|
152
|
+
USEARCH_EXPORT char const* usearch_hardware_acceleration_available(void) { return hardware_acceleration_available(); }
|
|
153
|
+
|
|
136
154
|
USEARCH_EXPORT usearch_index_t usearch_init(usearch_init_options_t* options, usearch_error_t* error) {
|
|
137
155
|
|
|
138
156
|
USEARCH_ASSERT(error && "Missing arguments");
|
|
@@ -413,7 +431,7 @@ USEARCH_EXPORT size_t usearch_search(
|
|
|
413
431
|
USEARCH_EXPORT size_t usearch_filtered_search( //
|
|
414
432
|
usearch_index_t index, //
|
|
415
433
|
void const* query, usearch_scalar_kind_t query_kind, size_t results_limit, //
|
|
416
|
-
|
|
434
|
+
usearch_filtered_search_callback_t filter, void* filter_state, //
|
|
417
435
|
usearch_key_t* found_keys, usearch_distance_t* found_distances, usearch_error_t* error) {
|
|
418
436
|
|
|
419
437
|
USEARCH_ASSERT(index && query && filter && error && "Missing arguments");
|
|
@@ -478,7 +496,7 @@ USEARCH_EXPORT void usearch_exact_search( //
|
|
|
478
496
|
|
|
479
497
|
metric_punned_t metric(dimensions, metric_kind_to_cpp(metric_kind), scalar_kind_to_cpp(scalar_kind));
|
|
480
498
|
executor_default_t executor(threads);
|
|
481
|
-
|
|
499
|
+
exact_search_t search;
|
|
482
500
|
exact_search_results_t result = search( //
|
|
483
501
|
(byte_t const*)dataset, dataset_count, dataset_stride, //
|
|
484
502
|
(byte_t const*)queries, queries_count, queries_stride, //
|