usearch 2.21.4 → 2.25.0

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