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
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">
|
|
@@ -57,11 +57,11 @@ Linux • macOS • Windows • iOS • Android • WebAssembly •
|
|
|
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
|
|
@@ -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
|
|
@@ -268,7 +268,7 @@ As part of the quantization process, the vectors are normalized to unit length a
|
|
|
268
268
|
When quantizing to `b1x8_t` single-bit representations, note that it's only valid for binary metrics like Jaccard, Hamming, etc.
|
|
269
269
|
As part of the quantization process, the scalar components greater than zero are set to `true`, and the rest to `false`.
|
|
270
270
|
|
|
271
|
-

|
|
272
272
|
|
|
273
273
|
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
274
|
By default, 32-bit `uint32_t` is used to enumerate those, which is not enough if you need to address over 4 Billion entries.
|
|
@@ -533,15 +533,15 @@ index = Index(ndim=ndim, metric=CompiledMetric(
|
|
|
533
533
|
- [x] ScyllaDB: [Rust](https://github.com/scylladb/vector-store), [presentation](https://www.slideshare.net/slideshow/vector-search-with-scylladb-by-szymon-wasik/276571548).
|
|
534
534
|
- [x] TiDB & TiFlash: [C++](https://github.com/pingcap/tiflash), [announcement](https://www.pingcap.com/article/introduce-vector-search-indexes-in-tidb/).
|
|
535
535
|
- [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
536
|
- [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]
|
|
537
|
+
- [x] Google: [UniSim](https://github.com/google/unisim), [RetSim](https://arxiv.org/abs/2311.17264) paper.
|
|
539
538
|
- [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
539
|
- [x] Microsoft Semantic Kernel: [Python](https://github.com/microsoft/semantic-kernel/releases/tag/python-0.3.9.dev) and C#.
|
|
541
540
|
- [x] GPTCache: [Python](https://github.com/zilliztech/GPTCache/releases/tag/0.1.29).
|
|
542
541
|
- [x] Sentence-Transformers: Python [docs](https://www.sbert.net/docs/package_reference/quantization.html#sentence_transformers.quantization.semantic_search_usearch).
|
|
543
542
|
- [x] Pathway: [Rust](https://github.com/pathwaycom/pathway).
|
|
544
543
|
- [x] Vald: [GoLang](https://github.com/vdaas/vald).
|
|
544
|
+
- [x] MatrixOne: [GoLang](https://github.com/matrixorigin/matrixone).
|
|
545
545
|
|
|
546
546
|
|
|
547
547
|
## Citations
|
|
@@ -551,8 +551,8 @@ index = Index(ndim=ndim, metric=CompiledMetric(
|
|
|
551
551
|
doi = {10.5281/zenodo.7949416},
|
|
552
552
|
author = {Vardanian, Ash},
|
|
553
553
|
title = {{USearch by Unum Cloud}},
|
|
554
|
-
url = {https://github.com/unum-cloud/
|
|
555
|
-
version = {2.
|
|
554
|
+
url = {https://github.com/unum-cloud/USearch},
|
|
555
|
+
version = {2.25.0},
|
|
556
556
|
year = {2023},
|
|
557
557
|
month = oct,
|
|
558
558
|
}
|
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
|
|
|
@@ -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, //
|
package/c/test.c
CHANGED
|
@@ -1,10 +1,91 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @file test.c
|
|
3
|
+
* @author Ash Vardanian
|
|
4
|
+
* @brief Unit tests for the pure-C ABI of USearch (`usearch.h`).
|
|
5
|
+
* @date June 25, 2023
|
|
6
|
+
*
|
|
7
|
+
* Exercises the lifecycle of `usearch_index_t` through the public C surface:
|
|
8
|
+
* index creation with every supported metric and scalar kind, `add` / `get` /
|
|
9
|
+
* `find` / `remove`, on-disk `save` / `load` / `view`, and error propagation
|
|
10
|
+
* via `usearch_error_t`. The harness is intentionally dependency-free so it
|
|
11
|
+
* can run in the same matrix as the C++ tests and on cross-compilation
|
|
12
|
+
* targets where only the C runtime is available.
|
|
13
|
+
*
|
|
14
|
+
* On startup we install a signal handler (see `install_crash_handlers`) that
|
|
15
|
+
* prints a native back-trace before re-raising, so CI logs pinpoint the
|
|
16
|
+
* faulting frame instead of stopping at a bare exit code.
|
|
17
|
+
*/
|
|
1
18
|
#include <errno.h>
|
|
2
|
-
#include <
|
|
19
|
+
#include <signal.h> // `signal`, `raise`, `SIGSEGV`
|
|
20
|
+
#include <stdio.h> // `remove`
|
|
3
21
|
#include <stdlib.h>
|
|
22
|
+
#include <string.h> // `memset`
|
|
4
23
|
#include <sys/stat.h>
|
|
5
24
|
|
|
25
|
+
/* Back-trace support for the C test harness. The `signal` API is standard C;
|
|
26
|
+
* the back-trace itself is taken via an OS-specific facility since C has no
|
|
27
|
+
* standard stack-introspection API. On Windows, `dbghelp.h` references types
|
|
28
|
+
* (e.g. `PSTR`) that are only defined after `windows.h`, so the two headers
|
|
29
|
+
* are separated by a blank line to keep clang-format from re-sorting them
|
|
30
|
+
* into a single alphabetized block. */
|
|
31
|
+
#if defined(_WIN32)
|
|
32
|
+
#include <windows.h>
|
|
33
|
+
|
|
34
|
+
#include <dbghelp.h>
|
|
35
|
+
#pragma comment(lib, "Dbghelp.lib")
|
|
36
|
+
#elif defined(__unix__) || defined(__APPLE__)
|
|
37
|
+
#include <execinfo.h>
|
|
38
|
+
#include <unistd.h>
|
|
39
|
+
#endif
|
|
40
|
+
|
|
6
41
|
#include "usearch.h"
|
|
7
42
|
|
|
43
|
+
static void usearch_write_backtrace(int signal_number) {
|
|
44
|
+
fprintf(stderr, "\n[usearch] Fatal signal %d. Back-trace:\n", signal_number);
|
|
45
|
+
#if defined(_WIN32)
|
|
46
|
+
enum { backtrace_depth_limit = 64 };
|
|
47
|
+
void* backtrace_frames[backtrace_depth_limit];
|
|
48
|
+
USHORT backtrace_depth = CaptureStackBackTrace(0, backtrace_depth_limit, backtrace_frames, NULL);
|
|
49
|
+
HANDLE current_process = GetCurrentProcess();
|
|
50
|
+
SymInitialize(current_process, NULL, TRUE);
|
|
51
|
+
|
|
52
|
+
unsigned char symbol_info_buffer[sizeof(SYMBOL_INFO) + 256 * sizeof(char)];
|
|
53
|
+
SYMBOL_INFO* symbol_info = (SYMBOL_INFO*)symbol_info_buffer;
|
|
54
|
+
symbol_info->MaxNameLen = 255;
|
|
55
|
+
symbol_info->SizeOfStruct = sizeof(SYMBOL_INFO);
|
|
56
|
+
|
|
57
|
+
for (USHORT frame_index = 0; frame_index < backtrace_depth; ++frame_index) {
|
|
58
|
+
if (SymFromAddr(current_process, (DWORD64)backtrace_frames[frame_index], 0, symbol_info))
|
|
59
|
+
fprintf(stderr, " #%2u %s + 0x%llx\n", (unsigned)frame_index, symbol_info->Name,
|
|
60
|
+
(unsigned long long)((DWORD64)backtrace_frames[frame_index] - symbol_info->Address));
|
|
61
|
+
else
|
|
62
|
+
fprintf(stderr, " #%2u %p\n", (unsigned)frame_index, backtrace_frames[frame_index]);
|
|
63
|
+
}
|
|
64
|
+
#elif defined(__unix__) || defined(__APPLE__)
|
|
65
|
+
enum { backtrace_depth_limit = 64 };
|
|
66
|
+
void* backtrace_frames[backtrace_depth_limit];
|
|
67
|
+
int backtrace_depth = backtrace(backtrace_frames, backtrace_depth_limit);
|
|
68
|
+
backtrace_symbols_fd(backtrace_frames, backtrace_depth, STDERR_FILENO);
|
|
69
|
+
#else
|
|
70
|
+
(void)signal_number;
|
|
71
|
+
fprintf(stderr, " <back-trace unavailable on this platform>\n");
|
|
72
|
+
#endif
|
|
73
|
+
fflush(stderr);
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
static void usearch_crash_handler(int signal_number) {
|
|
77
|
+
usearch_write_backtrace(signal_number);
|
|
78
|
+
/* Restore the default disposition and re-raise so the shell / CI sees the true exit status. */
|
|
79
|
+
signal(signal_number, SIG_DFL);
|
|
80
|
+
raise(signal_number);
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
static void install_crash_handlers(void) {
|
|
84
|
+
int const fatal_signals[] = {SIGSEGV, SIGABRT, SIGILL, SIGFPE};
|
|
85
|
+
for (unsigned signal_index = 0; signal_index < sizeof(fatal_signals) / sizeof(fatal_signals[0]); ++signal_index)
|
|
86
|
+
signal(fatal_signals[signal_index], &usearch_crash_handler);
|
|
87
|
+
}
|
|
88
|
+
|
|
8
89
|
void expect(bool must_be_true, char const* message) {
|
|
9
90
|
if (must_be_true)
|
|
10
91
|
return;
|
|
@@ -368,6 +449,7 @@ void test_view(size_t const collection_size, size_t const dimensions) {
|
|
|
368
449
|
}
|
|
369
450
|
|
|
370
451
|
int main(int argc, char const* argv[]) {
|
|
452
|
+
install_crash_handlers();
|
|
371
453
|
printf("Running tests...\n");
|
|
372
454
|
printf("USearch version: %s\n", usearch_version());
|
|
373
455
|
|
package/c/usearch.h
CHANGED
|
@@ -53,12 +53,17 @@ USEARCH_EXPORT typedef enum usearch_metric_kind_t {
|
|
|
53
53
|
|
|
54
54
|
USEARCH_EXPORT typedef enum usearch_scalar_kind_t {
|
|
55
55
|
usearch_scalar_unknown_k = 0,
|
|
56
|
-
usearch_scalar_f32_k = 1,
|
|
57
56
|
usearch_scalar_f64_k = 2,
|
|
57
|
+
usearch_scalar_f32_k = 1,
|
|
58
|
+
usearch_scalar_bf16_k = 6,
|
|
58
59
|
usearch_scalar_f16_k = 3,
|
|
60
|
+
usearch_scalar_e5m2_k = 7,
|
|
61
|
+
usearch_scalar_e4m3_k = 8,
|
|
62
|
+
usearch_scalar_e3m2_k = 11,
|
|
63
|
+
usearch_scalar_e2m3_k = 10,
|
|
59
64
|
usearch_scalar_i8_k = 4,
|
|
65
|
+
usearch_scalar_u8_k = 9,
|
|
60
66
|
usearch_scalar_b1_k = 5,
|
|
61
|
-
usearch_scalar_bf16_k = 6,
|
|
62
67
|
} usearch_scalar_kind_t;
|
|
63
68
|
|
|
64
69
|
USEARCH_EXPORT typedef struct usearch_init_options_t {
|
|
@@ -109,12 +114,26 @@ USEARCH_EXPORT typedef struct usearch_init_options_t {
|
|
|
109
114
|
bool multi;
|
|
110
115
|
} usearch_init_options_t;
|
|
111
116
|
|
|
117
|
+
USEARCH_EXPORT typedef int (*usearch_filtered_search_callback_t)(usearch_key_t, void*);
|
|
118
|
+
|
|
112
119
|
/**
|
|
113
120
|
* @brief Retrieves the version of the library.
|
|
114
121
|
* @return The version of the library.
|
|
115
122
|
*/
|
|
116
123
|
USEARCH_EXPORT char const* usearch_version(void);
|
|
117
124
|
|
|
125
|
+
/**
|
|
126
|
+
* @brief Retrieves a list of hardware capabilities in this precompiled binary.
|
|
127
|
+
* @return A comma-separated string with names of CPU features.
|
|
128
|
+
*/
|
|
129
|
+
USEARCH_EXPORT char const* usearch_hardware_acceleration_compiled(void);
|
|
130
|
+
|
|
131
|
+
/**
|
|
132
|
+
* @brief Retrieves a list of hardware capabilities supported by the current machine.
|
|
133
|
+
* @return A comma-separated string with names of CPU features.
|
|
134
|
+
*/
|
|
135
|
+
USEARCH_EXPORT char const* usearch_hardware_acceleration_available(void);
|
|
136
|
+
|
|
118
137
|
/**
|
|
119
138
|
* @brief Initializes a new instance of the index.
|
|
120
139
|
* @param options Pointer to the `usearch_init_options_t` structure containing initialization options.
|
|
@@ -391,7 +410,7 @@ USEARCH_EXPORT size_t usearch_search( //
|
|
|
391
410
|
USEARCH_EXPORT size_t usearch_filtered_search( //
|
|
392
411
|
usearch_index_t index, //
|
|
393
412
|
void const* query_vector, usearch_scalar_kind_t query_kind, size_t count, //
|
|
394
|
-
|
|
413
|
+
usearch_filtered_search_callback_t filter, void* filter_state, //
|
|
395
414
|
usearch_key_t* keys, usearch_distance_t* distances, usearch_error_t* error);
|
|
396
415
|
|
|
397
416
|
/**
|
|
@@ -480,6 +499,8 @@ USEARCH_EXPORT void usearch_exact_search( //
|
|
|
480
499
|
*/
|
|
481
500
|
USEARCH_EXPORT void usearch_clear(usearch_index_t index, usearch_error_t* error);
|
|
482
501
|
|
|
502
|
+
extern int goFilteredSearchCallback(usearch_key_t, void*);
|
|
503
|
+
|
|
483
504
|
#ifdef __cplusplus
|
|
484
505
|
}
|
|
485
506
|
#endif
|
package/cpp/CMakeLists.txt
CHANGED
|
@@ -7,6 +7,10 @@ if (USEARCH_BUILD_TEST_CPP)
|
|
|
7
7
|
|
|
8
8
|
target_include_directories(test_cpp PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}/../stringzilla/include)
|
|
9
9
|
|
|
10
|
+
# Export the dynamic symbol table so `backtrace_symbols` / `std::stacktrace`
|
|
11
|
+
# can resolve function names when the in-test crash handler fires.
|
|
12
|
+
set_target_properties(test_cpp PROPERTIES ENABLE_EXPORTS ON)
|
|
13
|
+
|
|
10
14
|
if (CMAKE_CXX_COMPILER_ID STREQUAL "GNU" OR CMAKE_CXX_COMPILER_ID MATCHES "Clang")
|
|
11
15
|
target_compile_options(test_cpp PRIVATE -Wno-vla -Wno-unused-function -Wno-cast-function-type)
|
|
12
16
|
endif ()
|
package/cpp/README.md
CHANGED
|
@@ -6,7 +6,7 @@ To use in a C++ project, copy the `include/usearch/*` headers into your project.
|
|
|
6
6
|
Alternatively, fetch it with CMake:
|
|
7
7
|
|
|
8
8
|
```cmake
|
|
9
|
-
FetchContent_Declare(usearch GIT_REPOSITORY https://github.com/unum-cloud/
|
|
9
|
+
FetchContent_Declare(usearch GIT_REPOSITORY https://github.com/unum-cloud/USearch.git)
|
|
10
10
|
FetchContent_MakeAvailable(usearch)
|
|
11
11
|
```
|
|
12
12
|
|
|
@@ -43,9 +43,9 @@ int main(int argc, char **argv) {
|
|
|
43
43
|
|
|
44
44
|
Here we:
|
|
45
45
|
|
|
46
|
-
- define a metric of kind [`metric_kind_t::l2sq_k`](https://unum-cloud.github.io/
|
|
47
|
-
- to be applied to [`scalar_kind_t::f32_k`](https://unum-cloud.github.io/
|
|
48
|
-
- instantiate an [`index_dense_t`](https://unum-cloud.github.io/
|
|
46
|
+
- define a metric of kind [`metric_kind_t::l2sq_k`](https://unum-cloud.github.io/USearch/cpp/reference.html#_CPPv413metric_kind_t),
|
|
47
|
+
- to be applied to [`scalar_kind_t::f32_k`](https://unum-cloud.github.io/USearch/cpp/reference.html#_CPPv413scalar_kind_t) floating-point vectors,
|
|
48
|
+
- instantiate an [`index_dense_t`](https://unum-cloud.github.io/USearch/cpp/reference.html#_CPPv4I00EN4unum7usearch14index_dense_gtE) index.
|
|
49
49
|
|
|
50
50
|
The `add` is thread-safe for concurrent index construction.
|
|
51
51
|
It also has an overload for different vector types, casting them under the hood.
|
|
@@ -174,7 +174,7 @@ In its high-level interface, USearch supports a variety of metrics, including th
|
|
|
174
174
|
- `metric_haversine_gt<scalar_t>` for "Haversine" or "Great Circle" distance between coordinates used in GIS applications.
|
|
175
175
|
- `metric_divergence_gt<scalar_t>` for the "Jensen Shannon" similarity between probability distributions.
|
|
176
176
|
|
|
177
|
-
In reality, for most common types, one of the [
|
|
177
|
+
In reality, for most common types, one of the [NumKong](https://github.com/ashvardanian/numkong) backends will be triggered, providing hardware-acceleration for most common CPUs.
|
|
178
178
|
|
|
179
179
|
If you need a different metric, you can implement it yourself and wrap it into a `metric_punned_t`, which is our alternative to the `std::function`.
|
|
180
180
|
Unlike the `std::function`, it is a trivial type, which is important for performance.
|