usearch 2.21.3 → 2.25.0

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