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.
Files changed (604) hide show
  1. package/README.md +65 -69
  2. package/binding.gyp +15 -37
  3. package/c/CMakeLists.txt +4 -5
  4. package/c/README.md +8 -8
  5. package/c/lib.cpp +32 -14
  6. package/c/test.c +124 -1
  7. package/c/usearch.h +24 -3
  8. package/cpp/CMakeLists.txt +4 -0
  9. package/cpp/README.md +5 -5
  10. package/cpp/bench.cpp +97 -116
  11. package/cpp/test.cpp +117 -20
  12. package/include/usearch/index.hpp +224 -48
  13. package/include/usearch/index_dense.hpp +105 -40
  14. package/include/usearch/index_plugins.hpp +1387 -204
  15. package/javascript/README.md +1 -1
  16. package/javascript/dist/cjs/usearch.d.ts +8 -3
  17. package/javascript/dist/cjs/usearch.js +12 -4
  18. package/javascript/dist/esm/usearch.d.ts +8 -3
  19. package/javascript/dist/esm/usearch.js +12 -4
  20. package/javascript/lib.cpp +17 -0
  21. package/javascript/usearch.test.js +117 -94
  22. package/javascript/usearch.ts +14 -6
  23. package/numkong/.clang-tidy +30 -0
  24. package/{simsimd → numkong}/.cmake-format.py +18 -0
  25. package/numkong/.editorconfig +12 -0
  26. package/numkong/.git-blame-ignore-revs +123 -0
  27. package/numkong/.mailmap +15 -0
  28. package/numkong/.spi.yml +11 -0
  29. package/numkong/.swift-format +14 -0
  30. package/numkong/CITATION.cff +81 -0
  31. package/numkong/CONTRIBUTING.md +500 -0
  32. package/numkong/Cargo.toml +54 -0
  33. package/numkong/MANIFEST.in +8 -0
  34. package/numkong/Package.swift +84 -0
  35. package/numkong/README.md +569 -0
  36. package/numkong/bench/README.md +217 -0
  37. package/numkong/bench/bench-browser.html +323 -0
  38. package/numkong/bench/bench.cpp +344 -0
  39. package/numkong/bench/bench.hpp +816 -0
  40. package/numkong/bench/bench.js +148 -0
  41. package/numkong/bench/bench.mjs +616 -0
  42. package/numkong/bench/bench_attention.cpp +113 -0
  43. package/numkong/bench/bench_cast.cpp +264 -0
  44. package/numkong/bench/bench_cross_amx.cpp +62 -0
  45. package/numkong/bench/bench_cross_arm.cpp +245 -0
  46. package/numkong/bench/bench_cross_blas.cpp +309 -0
  47. package/numkong/bench/bench_cross_loongarch.cpp +106 -0
  48. package/numkong/bench/bench_cross_power.cpp +84 -0
  49. package/numkong/bench/bench_cross_rvv.cpp +121 -0
  50. package/numkong/bench/bench_cross_serial.cpp +151 -0
  51. package/numkong/bench/bench_cross_sme.cpp +163 -0
  52. package/numkong/bench/bench_cross_wasm.cpp +142 -0
  53. package/numkong/bench/bench_cross_x86.cpp +455 -0
  54. package/numkong/bench/bench_curved.cpp +210 -0
  55. package/numkong/bench/bench_dot.cpp +315 -0
  56. package/numkong/bench/bench_each.cpp +503 -0
  57. package/numkong/bench/bench_geospatial.cpp +112 -0
  58. package/numkong/bench/bench_maxsim.cpp +154 -0
  59. package/numkong/bench/bench_mesh.cpp +148 -0
  60. package/numkong/bench/bench_probability.cpp +60 -0
  61. package/numkong/bench/bench_reduce.cpp +371 -0
  62. package/numkong/bench/bench_set.cpp +73 -0
  63. package/numkong/bench/bench_sparse.cpp +198 -0
  64. package/numkong/bench/bench_spatial.cpp +347 -0
  65. package/numkong/bench/bench_trigonometry.cpp +137 -0
  66. package/numkong/bench/swift/Bench.swift +506 -0
  67. package/numkong/binding.gyp +169 -0
  68. package/numkong/build.rs +484 -0
  69. package/numkong/c/dispatch.h +512 -0
  70. package/numkong/c/dispatch_bf16.c +447 -0
  71. package/numkong/c/dispatch_bf16c.c +52 -0
  72. package/numkong/c/dispatch_e2m3.c +296 -0
  73. package/numkong/c/dispatch_e3m2.c +284 -0
  74. package/numkong/c/dispatch_e4m3.c +318 -0
  75. package/numkong/c/dispatch_e5m2.c +316 -0
  76. package/numkong/c/dispatch_f16.c +452 -0
  77. package/numkong/c/dispatch_f16c.c +58 -0
  78. package/numkong/c/dispatch_f32.c +434 -0
  79. package/numkong/c/dispatch_f32c.c +99 -0
  80. package/numkong/c/dispatch_f64.c +348 -0
  81. package/numkong/c/dispatch_f64c.c +98 -0
  82. package/numkong/c/dispatch_i16.c +96 -0
  83. package/numkong/c/dispatch_i32.c +89 -0
  84. package/numkong/c/dispatch_i4.c +153 -0
  85. package/numkong/c/dispatch_i64.c +86 -0
  86. package/numkong/c/dispatch_i8.c +348 -0
  87. package/numkong/c/dispatch_other.c +348 -0
  88. package/numkong/c/dispatch_u1.c +193 -0
  89. package/numkong/c/dispatch_u16.c +124 -0
  90. package/numkong/c/dispatch_u32.c +118 -0
  91. package/numkong/c/dispatch_u4.c +153 -0
  92. package/numkong/c/dispatch_u64.c +102 -0
  93. package/numkong/c/dispatch_u8.c +364 -0
  94. package/numkong/c/numkong.c +940 -0
  95. package/numkong/cmake/nk_arm_isa_probes.cmake +61 -0
  96. package/numkong/cmake/nk_isa_probe.cmake +90 -0
  97. package/numkong/cmake/nk_loongarch_isa_probes.cmake +15 -0
  98. package/numkong/cmake/nk_math_lib.cmake +46 -0
  99. package/numkong/cmake/nk_power_isa_probes.cmake +15 -0
  100. package/numkong/cmake/nk_riscv_isa_probes.cmake +19 -0
  101. package/numkong/cmake/nk_x86_isa_probes.cmake +35 -0
  102. package/numkong/cmake/toolchain-aarch64-gnu.cmake +86 -0
  103. package/numkong/cmake/toolchain-android-arm64.cmake +25 -0
  104. package/numkong/cmake/toolchain-android-armv7.cmake +25 -0
  105. package/numkong/cmake/toolchain-loongarch64-gnu.cmake +68 -0
  106. package/numkong/cmake/toolchain-ppc64le-gnu.cmake +74 -0
  107. package/numkong/cmake/toolchain-riscv64-gnu.cmake +107 -0
  108. package/numkong/cmake/toolchain-riscv64-llvm.cmake +114 -0
  109. package/numkong/cmake/toolchain-wasi.cmake +77 -0
  110. package/numkong/cmake/toolchain-wasm.cmake +70 -0
  111. package/numkong/cmake/toolchain-wasm64.cmake +62 -0
  112. package/numkong/cmake/toolchain-x86_64-llvm.cmake +47 -0
  113. package/numkong/include/README.md +643 -0
  114. package/numkong/include/module.modulemap +129 -0
  115. package/numkong/include/numkong/attention/sapphireamx.h +1363 -0
  116. package/numkong/include/numkong/attention/sme.h +2075 -0
  117. package/numkong/include/numkong/attention.h +49 -0
  118. package/numkong/include/numkong/capabilities.h +930 -0
  119. package/numkong/include/numkong/cast/README.md +262 -0
  120. package/numkong/include/numkong/cast/diamond.h +64 -0
  121. package/numkong/include/numkong/cast/haswell.h +823 -0
  122. package/numkong/include/numkong/cast/icelake.h +475 -0
  123. package/numkong/include/numkong/cast/loongsonasx.h +252 -0
  124. package/numkong/include/numkong/cast/neon.h +1174 -0
  125. package/numkong/include/numkong/cast/powervsx.h +449 -0
  126. package/numkong/include/numkong/cast/rvv.h +970 -0
  127. package/numkong/include/numkong/cast/sapphire.h +262 -0
  128. package/numkong/include/numkong/cast/serial.h +2336 -0
  129. package/numkong/include/numkong/cast/skylake.h +915 -0
  130. package/numkong/include/numkong/cast/v128relaxed.h +537 -0
  131. package/numkong/include/numkong/cast.h +254 -0
  132. package/numkong/include/numkong/cast.hpp +44 -0
  133. package/numkong/include/numkong/curved/README.md +223 -0
  134. package/numkong/include/numkong/curved/genoa.h +182 -0
  135. package/numkong/include/numkong/curved/haswell.h +276 -0
  136. package/numkong/include/numkong/curved/neon.h +329 -0
  137. package/numkong/include/numkong/curved/neonbfdot.h +211 -0
  138. package/numkong/include/numkong/curved/rvv.h +305 -0
  139. package/numkong/include/numkong/curved/serial.h +207 -0
  140. package/numkong/include/numkong/curved/skylake.h +457 -0
  141. package/numkong/include/numkong/curved/smef64.h +530 -0
  142. package/numkong/include/numkong/curved.h +513 -0
  143. package/numkong/include/numkong/curved.hpp +144 -0
  144. package/numkong/include/numkong/dot/README.md +442 -0
  145. package/numkong/include/numkong/dot/alder.h +563 -0
  146. package/numkong/include/numkong/dot/diamond.h +158 -0
  147. package/numkong/include/numkong/dot/genoa.h +289 -0
  148. package/numkong/include/numkong/dot/haswell.h +1723 -0
  149. package/numkong/include/numkong/dot/icelake.h +997 -0
  150. package/numkong/include/numkong/dot/loongsonasx.h +671 -0
  151. package/numkong/include/numkong/dot/neon.h +869 -0
  152. package/numkong/include/numkong/dot/neonbfdot.h +243 -0
  153. package/numkong/include/numkong/dot/neonfhm.h +358 -0
  154. package/numkong/include/numkong/dot/neonfp8.h +323 -0
  155. package/numkong/include/numkong/dot/neonsdot.h +622 -0
  156. package/numkong/include/numkong/dot/powervsx.h +752 -0
  157. package/numkong/include/numkong/dot/rvv.h +722 -0
  158. package/numkong/include/numkong/dot/rvvbb.h +72 -0
  159. package/numkong/include/numkong/dot/rvvbf16.h +123 -0
  160. package/numkong/include/numkong/dot/rvvhalf.h +129 -0
  161. package/numkong/include/numkong/dot/sapphire.h +141 -0
  162. package/numkong/include/numkong/dot/serial.h +874 -0
  163. package/numkong/include/numkong/dot/sierra.h +405 -0
  164. package/numkong/include/numkong/dot/skylake.h +1116 -0
  165. package/numkong/include/numkong/dot/sve.h +420 -0
  166. package/numkong/include/numkong/dot/svebfdot.h +75 -0
  167. package/numkong/include/numkong/dot/svehalf.h +168 -0
  168. package/numkong/include/numkong/dot/svesdot.h +90 -0
  169. package/numkong/include/numkong/dot/v128relaxed.h +1293 -0
  170. package/numkong/include/numkong/dot.h +1136 -0
  171. package/numkong/include/numkong/dot.hpp +94 -0
  172. package/numkong/include/numkong/dots/README.md +496 -0
  173. package/numkong/include/numkong/dots/alder.h +117 -0
  174. package/numkong/include/numkong/dots/diamond.h +86 -0
  175. package/numkong/include/numkong/dots/genoa.h +100 -0
  176. package/numkong/include/numkong/dots/graniteamx.h +733 -0
  177. package/numkong/include/numkong/dots/haswell.h +310 -0
  178. package/numkong/include/numkong/dots/icelake.h +180 -0
  179. package/numkong/include/numkong/dots/loongsonasx.h +176 -0
  180. package/numkong/include/numkong/dots/neon.h +123 -0
  181. package/numkong/include/numkong/dots/neonbfdot.h +59 -0
  182. package/numkong/include/numkong/dots/neonfhm.h +96 -0
  183. package/numkong/include/numkong/dots/neonfp8.h +99 -0
  184. package/numkong/include/numkong/dots/neonsdot.h +144 -0
  185. package/numkong/include/numkong/dots/powervsx.h +194 -0
  186. package/numkong/include/numkong/dots/rvv.h +2593 -0
  187. package/numkong/include/numkong/dots/sapphireamx.h +4017 -0
  188. package/numkong/include/numkong/dots/serial.h +2867 -0
  189. package/numkong/include/numkong/dots/sierra.h +100 -0
  190. package/numkong/include/numkong/dots/skylake.h +207 -0
  191. package/numkong/include/numkong/dots/sme.h +5041 -0
  192. package/numkong/include/numkong/dots/smebi32.h +477 -0
  193. package/numkong/include/numkong/dots/smef64.h +1328 -0
  194. package/numkong/include/numkong/dots/smehalf.h +47 -0
  195. package/numkong/include/numkong/dots/v128relaxed.h +317 -0
  196. package/numkong/include/numkong/dots.h +3110 -0
  197. package/numkong/include/numkong/dots.hpp +641 -0
  198. package/numkong/include/numkong/each/README.md +465 -0
  199. package/numkong/include/numkong/each/haswell.h +1658 -0
  200. package/numkong/include/numkong/each/icelake.h +272 -0
  201. package/numkong/include/numkong/each/neon.h +1138 -0
  202. package/numkong/include/numkong/each/neonbfdot.h +211 -0
  203. package/numkong/include/numkong/each/neonhalf.h +318 -0
  204. package/numkong/include/numkong/each/rvv.h +1121 -0
  205. package/numkong/include/numkong/each/sapphire.h +343 -0
  206. package/numkong/include/numkong/each/serial.h +282 -0
  207. package/numkong/include/numkong/each/skylake.h +1562 -0
  208. package/numkong/include/numkong/each/v128relaxed.h +562 -0
  209. package/numkong/include/numkong/each.h +2232 -0
  210. package/numkong/include/numkong/each.hpp +434 -0
  211. package/numkong/include/numkong/geospatial/README.md +147 -0
  212. package/numkong/include/numkong/geospatial/haswell.h +633 -0
  213. package/numkong/include/numkong/geospatial/neon.h +615 -0
  214. package/numkong/include/numkong/geospatial/rvv.h +701 -0
  215. package/numkong/include/numkong/geospatial/serial.h +309 -0
  216. package/numkong/include/numkong/geospatial/skylake.h +613 -0
  217. package/numkong/include/numkong/geospatial/v128relaxed.h +652 -0
  218. package/numkong/include/numkong/geospatial.h +453 -0
  219. package/numkong/include/numkong/geospatial.hpp +235 -0
  220. package/numkong/include/numkong/matrix.hpp +336 -0
  221. package/numkong/include/numkong/maxsim/README.md +187 -0
  222. package/numkong/include/numkong/maxsim/alder.h +511 -0
  223. package/numkong/include/numkong/maxsim/genoa.h +115 -0
  224. package/numkong/include/numkong/maxsim/haswell.h +553 -0
  225. package/numkong/include/numkong/maxsim/icelake.h +480 -0
  226. package/numkong/include/numkong/maxsim/neonsdot.h +394 -0
  227. package/numkong/include/numkong/maxsim/sapphireamx.h +877 -0
  228. package/numkong/include/numkong/maxsim/serial.h +490 -0
  229. package/numkong/include/numkong/maxsim/sme.h +993 -0
  230. package/numkong/include/numkong/maxsim/v128relaxed.h +280 -0
  231. package/numkong/include/numkong/maxsim.h +571 -0
  232. package/numkong/include/numkong/maxsim.hpp +133 -0
  233. package/numkong/include/numkong/mesh/README.md +219 -0
  234. package/numkong/include/numkong/mesh/haswell.h +2013 -0
  235. package/numkong/include/numkong/mesh/neon.h +1821 -0
  236. package/numkong/include/numkong/mesh/neonbfdot.h +771 -0
  237. package/numkong/include/numkong/mesh/rvv.h +936 -0
  238. package/numkong/include/numkong/mesh/serial.h +721 -0
  239. package/numkong/include/numkong/mesh/skylake.h +2344 -0
  240. package/numkong/include/numkong/mesh/v128relaxed.h +1081 -0
  241. package/numkong/include/numkong/mesh.h +666 -0
  242. package/numkong/include/numkong/mesh.hpp +701 -0
  243. package/numkong/include/numkong/numkong.h +78 -0
  244. package/numkong/include/numkong/numkong.hpp +58 -0
  245. package/numkong/include/numkong/probability/README.md +177 -0
  246. package/numkong/include/numkong/probability/haswell.h +267 -0
  247. package/numkong/include/numkong/probability/neon.h +255 -0
  248. package/numkong/include/numkong/probability/rvv.h +414 -0
  249. package/numkong/include/numkong/probability/serial.h +181 -0
  250. package/numkong/include/numkong/probability/skylake.h +324 -0
  251. package/numkong/include/numkong/probability.h +380 -0
  252. package/numkong/include/numkong/probability.hpp +120 -0
  253. package/numkong/include/numkong/random.h +50 -0
  254. package/numkong/include/numkong/random.hpp +285 -0
  255. package/numkong/include/numkong/reduce/README.md +552 -0
  256. package/numkong/include/numkong/reduce/alder.h +636 -0
  257. package/numkong/include/numkong/reduce/genoa.h +201 -0
  258. package/numkong/include/numkong/reduce/haswell.h +3785 -0
  259. package/numkong/include/numkong/reduce/icelake.h +549 -0
  260. package/numkong/include/numkong/reduce/neon.h +3980 -0
  261. package/numkong/include/numkong/reduce/neonbfdot.h +142 -0
  262. package/numkong/include/numkong/reduce/neonfhm.h +293 -0
  263. package/numkong/include/numkong/reduce/neonsdot.h +357 -0
  264. package/numkong/include/numkong/reduce/rvv.h +3533 -0
  265. package/numkong/include/numkong/reduce/serial.h +753 -0
  266. package/numkong/include/numkong/reduce/sierra.h +338 -0
  267. package/numkong/include/numkong/reduce/skylake.h +3794 -0
  268. package/numkong/include/numkong/reduce/sve.h +52 -0
  269. package/numkong/include/numkong/reduce/v128relaxed.h +2302 -0
  270. package/numkong/include/numkong/reduce.h +1582 -0
  271. package/numkong/include/numkong/reduce.hpp +778 -0
  272. package/numkong/include/numkong/scalar/README.md +89 -0
  273. package/numkong/include/numkong/scalar/haswell.h +122 -0
  274. package/numkong/include/numkong/scalar/loongsonasx.h +74 -0
  275. package/numkong/include/numkong/scalar/neon.h +122 -0
  276. package/numkong/include/numkong/scalar/neonhalf.h +70 -0
  277. package/numkong/include/numkong/scalar/powervsx.h +96 -0
  278. package/numkong/include/numkong/scalar/rvv.h +211 -0
  279. package/numkong/include/numkong/scalar/sapphire.h +74 -0
  280. package/numkong/include/numkong/scalar/serial.h +332 -0
  281. package/numkong/include/numkong/scalar/v128relaxed.h +56 -0
  282. package/numkong/include/numkong/scalar.h +696 -0
  283. package/numkong/include/numkong/set/README.md +179 -0
  284. package/numkong/include/numkong/set/haswell.h +334 -0
  285. package/numkong/include/numkong/set/icelake.h +485 -0
  286. package/numkong/include/numkong/set/loongsonasx.h +181 -0
  287. package/numkong/include/numkong/set/neon.h +363 -0
  288. package/numkong/include/numkong/set/powervsx.h +326 -0
  289. package/numkong/include/numkong/set/rvv.h +226 -0
  290. package/numkong/include/numkong/set/rvvbb.h +117 -0
  291. package/numkong/include/numkong/set/serial.h +174 -0
  292. package/numkong/include/numkong/set/sve.h +187 -0
  293. package/numkong/include/numkong/set/v128relaxed.h +240 -0
  294. package/numkong/include/numkong/set.h +471 -0
  295. package/numkong/include/numkong/set.hpp +114 -0
  296. package/numkong/include/numkong/sets/README.md +149 -0
  297. package/numkong/include/numkong/sets/haswell.h +63 -0
  298. package/numkong/include/numkong/sets/icelake.h +66 -0
  299. package/numkong/include/numkong/sets/loongsonasx.h +52 -0
  300. package/numkong/include/numkong/sets/neon.h +61 -0
  301. package/numkong/include/numkong/sets/powervsx.h +65 -0
  302. package/numkong/include/numkong/sets/serial.h +43 -0
  303. package/numkong/include/numkong/sets/smebi32.h +1135 -0
  304. package/numkong/include/numkong/sets/v128relaxed.h +58 -0
  305. package/numkong/include/numkong/sets.h +382 -0
  306. package/numkong/include/numkong/sparse/README.md +156 -0
  307. package/numkong/include/numkong/sparse/icelake.h +463 -0
  308. package/numkong/include/numkong/sparse/neon.h +288 -0
  309. package/numkong/include/numkong/sparse/serial.h +117 -0
  310. package/numkong/include/numkong/sparse/sve2.h +504 -0
  311. package/numkong/include/numkong/sparse/turin.h +322 -0
  312. package/numkong/include/numkong/sparse.h +363 -0
  313. package/numkong/include/numkong/sparse.hpp +113 -0
  314. package/numkong/include/numkong/spatial/README.md +439 -0
  315. package/numkong/include/numkong/spatial/alder.h +604 -0
  316. package/numkong/include/numkong/spatial/diamond.h +240 -0
  317. package/numkong/include/numkong/spatial/genoa.h +222 -0
  318. package/numkong/include/numkong/spatial/haswell.h +979 -0
  319. package/numkong/include/numkong/spatial/icelake.h +1067 -0
  320. package/numkong/include/numkong/spatial/loongsonasx.h +483 -0
  321. package/numkong/include/numkong/spatial/neon.h +846 -0
  322. package/numkong/include/numkong/spatial/neonbfdot.h +164 -0
  323. package/numkong/include/numkong/spatial/neonfp8.h +258 -0
  324. package/numkong/include/numkong/spatial/neonsdot.h +429 -0
  325. package/numkong/include/numkong/spatial/powervsx.h +738 -0
  326. package/numkong/include/numkong/spatial/rvv.h +991 -0
  327. package/numkong/include/numkong/spatial/rvvbf16.h +128 -0
  328. package/numkong/include/numkong/spatial/rvvhalf.h +120 -0
  329. package/numkong/include/numkong/spatial/serial.h +347 -0
  330. package/numkong/include/numkong/spatial/sierra.h +516 -0
  331. package/numkong/include/numkong/spatial/skylake.h +605 -0
  332. package/numkong/include/numkong/spatial/sve.h +246 -0
  333. package/numkong/include/numkong/spatial/svebfdot.h +125 -0
  334. package/numkong/include/numkong/spatial/svehalf.h +136 -0
  335. package/numkong/include/numkong/spatial/svesdot.h +143 -0
  336. package/numkong/include/numkong/spatial/v128relaxed.h +969 -0
  337. package/numkong/include/numkong/spatial.h +1681 -0
  338. package/numkong/include/numkong/spatial.hpp +183 -0
  339. package/numkong/include/numkong/spatials/README.md +580 -0
  340. package/numkong/include/numkong/spatials/alder.h +94 -0
  341. package/numkong/include/numkong/spatials/diamond.h +82 -0
  342. package/numkong/include/numkong/spatials/genoa.h +94 -0
  343. package/numkong/include/numkong/spatials/graniteamx.h +173 -0
  344. package/numkong/include/numkong/spatials/haswell.h +219 -0
  345. package/numkong/include/numkong/spatials/icelake.h +113 -0
  346. package/numkong/include/numkong/spatials/loongsonasx.h +153 -0
  347. package/numkong/include/numkong/spatials/neon.h +109 -0
  348. package/numkong/include/numkong/spatials/neonbfdot.h +60 -0
  349. package/numkong/include/numkong/spatials/neonfhm.h +92 -0
  350. package/numkong/include/numkong/spatials/neonfp8.h +111 -0
  351. package/numkong/include/numkong/spatials/neonsdot.h +143 -0
  352. package/numkong/include/numkong/spatials/powervsx.h +153 -0
  353. package/numkong/include/numkong/spatials/rvv.h +1976 -0
  354. package/numkong/include/numkong/spatials/sapphireamx.h +1149 -0
  355. package/numkong/include/numkong/spatials/serial.h +248 -0
  356. package/numkong/include/numkong/spatials/sierra.h +96 -0
  357. package/numkong/include/numkong/spatials/skylake.h +184 -0
  358. package/numkong/include/numkong/spatials/sme.h +1927 -0
  359. package/numkong/include/numkong/spatials/smef64.h +483 -0
  360. package/numkong/include/numkong/spatials/v128relaxed.h +240 -0
  361. package/numkong/include/numkong/spatials.h +3374 -0
  362. package/numkong/include/numkong/spatials.hpp +509 -0
  363. package/numkong/include/numkong/tensor.hpp +1981 -0
  364. package/numkong/include/numkong/trigonometry/README.md +184 -0
  365. package/numkong/include/numkong/trigonometry/haswell.h +653 -0
  366. package/numkong/include/numkong/trigonometry/neon.h +638 -0
  367. package/numkong/include/numkong/trigonometry/rvv.h +700 -0
  368. package/numkong/include/numkong/trigonometry/serial.h +703 -0
  369. package/numkong/include/numkong/trigonometry/skylake.h +725 -0
  370. package/numkong/include/numkong/trigonometry/v128relaxed.h +667 -0
  371. package/numkong/include/numkong/trigonometry.h +467 -0
  372. package/numkong/include/numkong/trigonometry.hpp +166 -0
  373. package/numkong/include/numkong/types.h +1695 -0
  374. package/numkong/include/numkong/types.hpp +6027 -0
  375. package/numkong/include/numkong/vector.hpp +766 -0
  376. package/numkong/javascript/@numkong-darwin-arm64/package.json +26 -0
  377. package/numkong/javascript/@numkong-darwin-x64/package.json +26 -0
  378. package/numkong/javascript/@numkong-linux-arm64/package.json +25 -0
  379. package/numkong/javascript/@numkong-linux-x64/package.json +25 -0
  380. package/numkong/javascript/@numkong-win32-arm64/package.json +25 -0
  381. package/numkong/javascript/@numkong-win32-x64/package.json +25 -0
  382. package/numkong/javascript/README.md +254 -0
  383. package/numkong/javascript/node-gyp-build.d.ts +4 -0
  384. package/numkong/javascript/numkong-browser.ts +40 -0
  385. package/numkong/javascript/numkong-wasm.ts +750 -0
  386. package/numkong/javascript/numkong.c +712 -0
  387. package/numkong/javascript/numkong.ts +613 -0
  388. package/{simsimd → numkong}/javascript/tsconfig-base.json +6 -3
  389. package/numkong/javascript/tsconfig-cjs.json +13 -0
  390. package/{simsimd → numkong}/javascript/tsconfig-esm.json +1 -1
  391. package/numkong/javascript/types.ts +784 -0
  392. package/numkong/numkong.gypi +104 -0
  393. package/numkong/package.json +108 -0
  394. package/numkong/probes/arm_neon.c +8 -0
  395. package/numkong/probes/arm_neon_bfdot.c +9 -0
  396. package/numkong/probes/arm_neon_fhm.c +9 -0
  397. package/numkong/probes/arm_neon_half.c +8 -0
  398. package/numkong/probes/arm_neon_sdot.c +9 -0
  399. package/numkong/probes/arm_neonfp8.c +9 -0
  400. package/numkong/probes/arm_sme.c +16 -0
  401. package/numkong/probes/arm_sme2.c +16 -0
  402. package/numkong/probes/arm_sme2p1.c +16 -0
  403. package/numkong/probes/arm_sme_bf16.c +16 -0
  404. package/numkong/probes/arm_sme_bi32.c +16 -0
  405. package/numkong/probes/arm_sme_f64.c +16 -0
  406. package/numkong/probes/arm_sme_fa64.c +14 -0
  407. package/numkong/probes/arm_sme_half.c +16 -0
  408. package/numkong/probes/arm_sme_lut2.c +15 -0
  409. package/numkong/probes/arm_sve.c +18 -0
  410. package/numkong/probes/arm_sve2.c +20 -0
  411. package/numkong/probes/arm_sve2p1.c +18 -0
  412. package/numkong/probes/arm_sve_bfdot.c +20 -0
  413. package/numkong/probes/arm_sve_half.c +18 -0
  414. package/numkong/probes/arm_sve_sdot.c +21 -0
  415. package/numkong/probes/loongarch_lasx.c +12 -0
  416. package/numkong/probes/power_vsx.c +12 -0
  417. package/numkong/probes/probe.js +127 -0
  418. package/numkong/probes/riscv_rvv.c +14 -0
  419. package/numkong/probes/riscv_rvv_bb.c +15 -0
  420. package/numkong/probes/riscv_rvv_bf16.c +17 -0
  421. package/numkong/probes/riscv_rvv_half.c +14 -0
  422. package/numkong/probes/wasm_v128relaxed.c +11 -0
  423. package/numkong/probes/x86_alder.c +17 -0
  424. package/numkong/probes/x86_diamond.c +17 -0
  425. package/numkong/probes/x86_genoa.c +17 -0
  426. package/numkong/probes/x86_graniteamx.c +19 -0
  427. package/numkong/probes/x86_haswell.c +11 -0
  428. package/numkong/probes/x86_icelake.c +17 -0
  429. package/numkong/probes/x86_sapphire.c +16 -0
  430. package/numkong/probes/x86_sapphireamx.c +18 -0
  431. package/numkong/probes/x86_sierra.c +17 -0
  432. package/numkong/probes/x86_skylake.c +15 -0
  433. package/numkong/probes/x86_turin.c +17 -0
  434. package/numkong/rust/README.md +698 -0
  435. package/numkong/rust/capabilities.rs +96 -0
  436. package/numkong/rust/cast.rs +314 -0
  437. package/numkong/rust/curved.rs +391 -0
  438. package/numkong/rust/each.rs +2721 -0
  439. package/numkong/rust/geospatial.rs +343 -0
  440. package/numkong/rust/matrix.rs +5424 -0
  441. package/numkong/rust/maxsim.rs +540 -0
  442. package/numkong/rust/mesh.rs +837 -0
  443. package/numkong/rust/numkong.rs +409 -0
  444. package/numkong/rust/probability.rs +272 -0
  445. package/numkong/rust/reduce.rs +1249 -0
  446. package/numkong/rust/set.rs +194 -0
  447. package/numkong/rust/sparse.rs +513 -0
  448. package/numkong/rust/spatial.rs +1815 -0
  449. package/numkong/rust/tensor.rs +7565 -0
  450. package/numkong/rust/types.rs +3666 -0
  451. package/numkong/rust/vector.rs +1899 -0
  452. package/numkong/rustfmt.toml +2 -0
  453. package/numkong/swift/Matrix.swift +1388 -0
  454. package/numkong/swift/MaxSim.swift +151 -0
  455. package/numkong/swift/NumKong.swift +283 -0
  456. package/numkong/swift/Numerics.swift +329 -0
  457. package/numkong/swift/README.md +433 -0
  458. package/numkong/swift/Scalar.swift +741 -0
  459. package/numkong/swift/Tensor.swift +209 -0
  460. package/numkong/test/README.md +315 -0
  461. package/numkong/test/playwright.config.ts +16 -0
  462. package/numkong/test/swift/Test.swift +534 -0
  463. package/numkong/test/test-browser-bundle-runner.mjs +36 -0
  464. package/numkong/test/test-browser-bundle.html +188 -0
  465. package/numkong/test/test-browser-runner.mjs +43 -0
  466. package/numkong/test/test-browser.html +305 -0
  467. package/numkong/test/test-dtypes.mjs +453 -0
  468. package/numkong/test/test-wasm.mjs +267 -0
  469. package/numkong/test/test.cpp +442 -0
  470. package/numkong/test/test.hpp +580 -0
  471. package/numkong/test/test.mjs +363 -0
  472. package/numkong/test/test_base.py +1041 -0
  473. package/numkong/test/test_cast.cpp +242 -0
  474. package/numkong/test/test_cross.hpp +551 -0
  475. package/numkong/test/test_cross.py +467 -0
  476. package/numkong/test/test_cross_amx.cpp +50 -0
  477. package/numkong/test/test_cross_arm.cpp +225 -0
  478. package/numkong/test/test_cross_blas.cpp +354 -0
  479. package/numkong/test/test_cross_loongarch.cpp +90 -0
  480. package/numkong/test/test_cross_power.cpp +73 -0
  481. package/numkong/test/test_cross_rvv.cpp +109 -0
  482. package/numkong/test/test_cross_serial.cpp +181 -0
  483. package/numkong/test/test_cross_sme.cpp +148 -0
  484. package/numkong/test/test_cross_wasm.cpp +141 -0
  485. package/numkong/test/test_cross_x86.cpp +442 -0
  486. package/numkong/test/test_curved.cpp +182 -0
  487. package/numkong/test/test_curved.py +207 -0
  488. package/numkong/test/test_dot.cpp +353 -0
  489. package/numkong/test/test_dot.py +296 -0
  490. package/numkong/test/test_each.cpp +437 -0
  491. package/numkong/test/test_each.py +756 -0
  492. package/numkong/test/test_geospatial.cpp +155 -0
  493. package/numkong/test/test_geospatial.py +241 -0
  494. package/numkong/test/test_maxsim.cpp +138 -0
  495. package/numkong/test/test_maxsim.py +209 -0
  496. package/numkong/test/test_mesh.cpp +203 -0
  497. package/numkong/test/test_mesh.py +394 -0
  498. package/numkong/test/test_probability.cpp +136 -0
  499. package/numkong/test/test_probability.py +166 -0
  500. package/numkong/test/test_reduce.cpp +563 -0
  501. package/numkong/test/test_reduce.py +781 -0
  502. package/numkong/test/test_set.cpp +151 -0
  503. package/numkong/test/test_set.py +120 -0
  504. package/numkong/test/test_similarities.py +579 -0
  505. package/numkong/test/test_sparse.cpp +121 -0
  506. package/numkong/test/test_sparse.py +118 -0
  507. package/numkong/test/test_spatial.cpp +518 -0
  508. package/numkong/test/test_spatial.py +269 -0
  509. package/numkong/test/test_tensor.cpp +884 -0
  510. package/numkong/test/test_tensor.py +1417 -0
  511. package/numkong/test/test_trigonometry.cpp +156 -0
  512. package/numkong/test/test_trigonometry.py +180 -0
  513. package/package.json +7 -8
  514. package/prebuilds/darwin-arm64+x64/usearch.node +0 -0
  515. package/prebuilds/linux-arm64/usearch.node +0 -0
  516. package/prebuilds/linux-x64/usearch.node +0 -0
  517. package/fp16/CMakeLists.txt +0 -176
  518. package/fp16/LICENSE +0 -11
  519. package/fp16/README.md +0 -20
  520. package/fp16/bench/alt-element.cc +0 -89
  521. package/fp16/bench/from-alt-array.cc +0 -175
  522. package/fp16/bench/from-ieee-array.cc +0 -399
  523. package/fp16/bench/ieee-element.cc +0 -272
  524. package/fp16/bench/to-alt-array.cc +0 -91
  525. package/fp16/bench/to-ieee-array.cc +0 -303
  526. package/fp16/cmake/DownloadGoogleBenchmark.cmake +0 -15
  527. package/fp16/cmake/DownloadGoogleTest.cmake +0 -15
  528. package/fp16/cmake/DownloadPSimd.cmake +0 -15
  529. package/fp16/configure.py +0 -65
  530. package/fp16/confu.yaml +0 -8
  531. package/fp16/include/fp16/__init__.py +0 -0
  532. package/fp16/include/fp16/avx.py +0 -50
  533. package/fp16/include/fp16/avx2.py +0 -53
  534. package/fp16/include/fp16/bitcasts.h +0 -92
  535. package/fp16/include/fp16/fp16.h +0 -451
  536. package/fp16/include/fp16/psimd.h +0 -131
  537. package/fp16/include/fp16.h +0 -11
  538. package/fp16/jni/Android.mk +0 -6
  539. package/fp16/jni/Application.mk +0 -4
  540. package/fp16/test/alt-from-fp32-value.cc +0 -498
  541. package/fp16/test/alt-to-fp32-bits.cc +0 -263
  542. package/fp16/test/alt-to-fp32-psimd.cc +0 -145
  543. package/fp16/test/alt-to-fp32-value.cc +0 -348
  544. package/fp16/test/alt-to-fp32x2-psimd.cc +0 -245
  545. package/fp16/test/bitcasts.cc +0 -56
  546. package/fp16/test/ieee-from-fp32-value.cc +0 -523
  547. package/fp16/test/ieee-to-fp32-bits.cc +0 -333
  548. package/fp16/test/ieee-to-fp32-psimd.cc +0 -312
  549. package/fp16/test/ieee-to-fp32-value.cc +0 -420
  550. package/fp16/test/ieee-to-fp32x2-psimd.cc +0 -541
  551. package/fp16/test/peachpy/alt-xmm-to-fp32-xmm-avx.cc +0 -96
  552. package/fp16/test/peachpy/alt-xmm-to-fp32-ymm-avx2.cc +0 -96
  553. package/fp16/test/peachpy/stubs.py +0 -38
  554. package/fp16/test/tables.cc +0 -530
  555. package/fp16/test/tables.h +0 -13
  556. package/fp16/third-party/THHalf.h +0 -92
  557. package/fp16/third-party/eigen-half.h +0 -170
  558. package/fp16/third-party/float16-compressor.h +0 -80
  559. package/fp16/third-party/half.hpp +0 -2916
  560. package/fp16/third-party/npy-halffloat.h +0 -328
  561. package/simsimd/.git-blame-ignore-revs +0 -2
  562. package/simsimd/CONTRIBUTING.md +0 -321
  563. package/simsimd/Cargo.toml +0 -49
  564. package/simsimd/MANIFEST.in +0 -4
  565. package/simsimd/Package.swift +0 -28
  566. package/simsimd/README.md +0 -1493
  567. package/simsimd/binding.gyp +0 -35
  568. package/simsimd/build.rs +0 -70
  569. package/simsimd/c/lib.c +0 -374
  570. package/simsimd/include/module.modulemap +0 -4
  571. package/simsimd/include/simsimd/binary.h +0 -486
  572. package/simsimd/include/simsimd/curved.h +0 -1541
  573. package/simsimd/include/simsimd/dot.h +0 -1853
  574. package/simsimd/include/simsimd/elementwise.h +0 -2465
  575. package/simsimd/include/simsimd/geospatial.h +0 -43
  576. package/simsimd/include/simsimd/mesh.h +0 -69
  577. package/simsimd/include/simsimd/probability.h +0 -606
  578. package/simsimd/include/simsimd/simsimd.h +0 -2567
  579. package/simsimd/include/simsimd/sparse.h +0 -1384
  580. package/simsimd/include/simsimd/spatial.h +0 -2335
  581. package/simsimd/include/simsimd/types.h +0 -666
  582. package/simsimd/javascript/fallback.ts +0 -233
  583. package/simsimd/javascript/lib.c +0 -125
  584. package/simsimd/javascript/node-gyp-build.d.ts +0 -1
  585. package/simsimd/javascript/simsimd.ts +0 -179
  586. package/simsimd/javascript/tsconfig-cjs.json +0 -8
  587. package/simsimd/package-lock.json +0 -1761
  588. package/simsimd/package.json +0 -61
  589. package/simsimd/rust/lib.rs +0 -1821
  590. package/simsimd/scripts/bench.cxx +0 -1170
  591. package/simsimd/scripts/bench.ipynb +0 -187
  592. package/simsimd/scripts/bench.js +0 -127
  593. package/simsimd/scripts/bench.rs +0 -876
  594. package/simsimd/scripts/bench_vectors.py +0 -734
  595. package/simsimd/scripts/bench_vectors_live.py +0 -213
  596. package/simsimd/scripts/test.c +0 -187
  597. package/simsimd/scripts/test.mjs +0 -220
  598. package/simsimd/scripts/test.py +0 -1505
  599. package/simsimd/swift/SimSIMD.swift +0 -149
  600. package/simsimd/swift/Test.swift +0 -128
  601. /package/{simsimd → numkong}/CODE_OF_CONDUCT.md +0 -0
  602. /package/{simsimd → numkong}/LICENSE +0 -0
  603. /package/{simsimd → numkong}/javascript/dist-package-cjs.json +0 -0
  604. /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/simsimd">Vectors</a> & 🔜 <a href="https://github.com/ashvardanian/stringzilla">Texts</a>
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
  &nbsp;&nbsp;&nbsp;
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
  &nbsp;&nbsp;&nbsp;
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>
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/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>
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/usearch/sqlite">SQLite</a>
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 `f16` & `i8` - [half-precision & quarter-precision support](#memory-efficiency-downcasting-and-quantization).
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--ai--multi-modal-semantic-search) and [Joins](#joins-one-to-one-one-to-many-and-many-to-many-mappings).
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/usearch/blob/main/include/usearch/index.hpp
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 [SimSIMD](https://github.com/ashvardanian/simsimd).
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)__:
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/usearch/python#user-defined-metrics-and-jit-in-python):
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, it's recommended to use half-precision floating-point numbers on modern hardware.
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
- ![USearch uint40_t support](https://github.com/unum-cloud/usearch/blob/main/assets/usearch-neighbor-types.png?raw=true)
273
+ ![USearch uint40_t support](https://github.com/unum-cloud/USearch/blob/main/assets/usearch-neighbor-types.png?raw=true)
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] LanternDB: [C++](https://github.com/lanterndata/lantern), [Rust](https://github.com/lanterndata/lantern_extras), [docs](https://lantern.dev/blog/hnsw-index-creation).
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{Vardanian_USearch_2023,
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/usearch},
555
- version = {2.21.4},
556
- year = {2023},
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", "simsimd/c/lib.c"],
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
- "dependencies": ["<!(node -p \"require('node-addon-api').gyp\")"],
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=<!(echo ${USEARCH_USE_OPENMP:-0})",
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/usearch/releases).
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 SimSIMD, bringing over 100 SIMD-accelerated distance kernels for x86 and ARM architectures.
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
- simsimd_distance_t callback(void const* a, void const* b, void* state) {
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
- simsimd_f16_t dataset[dataset_count][dimensions];
187
- simsimd_f16_t queries[queries_count][dimensions];
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(simsimd_f16_t),
194
- &queries[0][0], queries_count, dimensions * sizeof(simsimd_f16_t),
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 usearch_scalar_f16_k: return scalar_kind_t::f16_k;
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::f16_k: return usearch_scalar_f16_k;
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::f16_k: return index->add(key, (f16_t const*)vector);
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::f16_k: return index->get(key, (f16_t*)vector, count);
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::f16_k:
114
- return index->filtered_search((f16_t const*)vector, n, std::forward<predicate_at>(predicate));
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
- int (*filter)(usearch_key_t key, void* filter_state), void* filter_state, //
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
- static exact_search_t search;
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, //