usearch 2.21.4 → 2.25.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (604) hide show
  1. package/README.md +65 -69
  2. package/binding.gyp +15 -37
  3. package/c/CMakeLists.txt +4 -5
  4. package/c/README.md +8 -8
  5. package/c/lib.cpp +32 -14
  6. package/c/test.c +124 -1
  7. package/c/usearch.h +24 -3
  8. package/cpp/CMakeLists.txt +4 -0
  9. package/cpp/README.md +5 -5
  10. package/cpp/bench.cpp +97 -116
  11. package/cpp/test.cpp +117 -20
  12. package/include/usearch/index.hpp +224 -48
  13. package/include/usearch/index_dense.hpp +105 -40
  14. package/include/usearch/index_plugins.hpp +1387 -204
  15. package/javascript/README.md +1 -1
  16. package/javascript/dist/cjs/usearch.d.ts +8 -3
  17. package/javascript/dist/cjs/usearch.js +12 -4
  18. package/javascript/dist/esm/usearch.d.ts +8 -3
  19. package/javascript/dist/esm/usearch.js +12 -4
  20. package/javascript/lib.cpp +17 -0
  21. package/javascript/usearch.test.js +117 -94
  22. package/javascript/usearch.ts +14 -6
  23. package/numkong/.clang-tidy +30 -0
  24. package/{simsimd → numkong}/.cmake-format.py +18 -0
  25. package/numkong/.editorconfig +12 -0
  26. package/numkong/.git-blame-ignore-revs +123 -0
  27. package/numkong/.mailmap +15 -0
  28. package/numkong/.spi.yml +11 -0
  29. package/numkong/.swift-format +14 -0
  30. package/numkong/CITATION.cff +81 -0
  31. package/numkong/CONTRIBUTING.md +500 -0
  32. package/numkong/Cargo.toml +54 -0
  33. package/numkong/MANIFEST.in +8 -0
  34. package/numkong/Package.swift +84 -0
  35. package/numkong/README.md +569 -0
  36. package/numkong/bench/README.md +217 -0
  37. package/numkong/bench/bench-browser.html +323 -0
  38. package/numkong/bench/bench.cpp +344 -0
  39. package/numkong/bench/bench.hpp +816 -0
  40. package/numkong/bench/bench.js +148 -0
  41. package/numkong/bench/bench.mjs +616 -0
  42. package/numkong/bench/bench_attention.cpp +113 -0
  43. package/numkong/bench/bench_cast.cpp +264 -0
  44. package/numkong/bench/bench_cross_amx.cpp +62 -0
  45. package/numkong/bench/bench_cross_arm.cpp +245 -0
  46. package/numkong/bench/bench_cross_blas.cpp +309 -0
  47. package/numkong/bench/bench_cross_loongarch.cpp +106 -0
  48. package/numkong/bench/bench_cross_power.cpp +84 -0
  49. package/numkong/bench/bench_cross_rvv.cpp +121 -0
  50. package/numkong/bench/bench_cross_serial.cpp +151 -0
  51. package/numkong/bench/bench_cross_sme.cpp +163 -0
  52. package/numkong/bench/bench_cross_wasm.cpp +142 -0
  53. package/numkong/bench/bench_cross_x86.cpp +455 -0
  54. package/numkong/bench/bench_curved.cpp +210 -0
  55. package/numkong/bench/bench_dot.cpp +315 -0
  56. package/numkong/bench/bench_each.cpp +503 -0
  57. package/numkong/bench/bench_geospatial.cpp +112 -0
  58. package/numkong/bench/bench_maxsim.cpp +154 -0
  59. package/numkong/bench/bench_mesh.cpp +148 -0
  60. package/numkong/bench/bench_probability.cpp +60 -0
  61. package/numkong/bench/bench_reduce.cpp +371 -0
  62. package/numkong/bench/bench_set.cpp +73 -0
  63. package/numkong/bench/bench_sparse.cpp +198 -0
  64. package/numkong/bench/bench_spatial.cpp +347 -0
  65. package/numkong/bench/bench_trigonometry.cpp +137 -0
  66. package/numkong/bench/swift/Bench.swift +506 -0
  67. package/numkong/binding.gyp +169 -0
  68. package/numkong/build.rs +484 -0
  69. package/numkong/c/dispatch.h +512 -0
  70. package/numkong/c/dispatch_bf16.c +447 -0
  71. package/numkong/c/dispatch_bf16c.c +52 -0
  72. package/numkong/c/dispatch_e2m3.c +296 -0
  73. package/numkong/c/dispatch_e3m2.c +284 -0
  74. package/numkong/c/dispatch_e4m3.c +318 -0
  75. package/numkong/c/dispatch_e5m2.c +316 -0
  76. package/numkong/c/dispatch_f16.c +452 -0
  77. package/numkong/c/dispatch_f16c.c +58 -0
  78. package/numkong/c/dispatch_f32.c +434 -0
  79. package/numkong/c/dispatch_f32c.c +99 -0
  80. package/numkong/c/dispatch_f64.c +348 -0
  81. package/numkong/c/dispatch_f64c.c +98 -0
  82. package/numkong/c/dispatch_i16.c +96 -0
  83. package/numkong/c/dispatch_i32.c +89 -0
  84. package/numkong/c/dispatch_i4.c +153 -0
  85. package/numkong/c/dispatch_i64.c +86 -0
  86. package/numkong/c/dispatch_i8.c +348 -0
  87. package/numkong/c/dispatch_other.c +348 -0
  88. package/numkong/c/dispatch_u1.c +193 -0
  89. package/numkong/c/dispatch_u16.c +124 -0
  90. package/numkong/c/dispatch_u32.c +118 -0
  91. package/numkong/c/dispatch_u4.c +153 -0
  92. package/numkong/c/dispatch_u64.c +102 -0
  93. package/numkong/c/dispatch_u8.c +364 -0
  94. package/numkong/c/numkong.c +940 -0
  95. package/numkong/cmake/nk_arm_isa_probes.cmake +61 -0
  96. package/numkong/cmake/nk_isa_probe.cmake +90 -0
  97. package/numkong/cmake/nk_loongarch_isa_probes.cmake +15 -0
  98. package/numkong/cmake/nk_math_lib.cmake +46 -0
  99. package/numkong/cmake/nk_power_isa_probes.cmake +15 -0
  100. package/numkong/cmake/nk_riscv_isa_probes.cmake +19 -0
  101. package/numkong/cmake/nk_x86_isa_probes.cmake +35 -0
  102. package/numkong/cmake/toolchain-aarch64-gnu.cmake +86 -0
  103. package/numkong/cmake/toolchain-android-arm64.cmake +25 -0
  104. package/numkong/cmake/toolchain-android-armv7.cmake +25 -0
  105. package/numkong/cmake/toolchain-loongarch64-gnu.cmake +68 -0
  106. package/numkong/cmake/toolchain-ppc64le-gnu.cmake +74 -0
  107. package/numkong/cmake/toolchain-riscv64-gnu.cmake +107 -0
  108. package/numkong/cmake/toolchain-riscv64-llvm.cmake +114 -0
  109. package/numkong/cmake/toolchain-wasi.cmake +77 -0
  110. package/numkong/cmake/toolchain-wasm.cmake +70 -0
  111. package/numkong/cmake/toolchain-wasm64.cmake +62 -0
  112. package/numkong/cmake/toolchain-x86_64-llvm.cmake +47 -0
  113. package/numkong/include/README.md +643 -0
  114. package/numkong/include/module.modulemap +129 -0
  115. package/numkong/include/numkong/attention/sapphireamx.h +1363 -0
  116. package/numkong/include/numkong/attention/sme.h +2075 -0
  117. package/numkong/include/numkong/attention.h +49 -0
  118. package/numkong/include/numkong/capabilities.h +930 -0
  119. package/numkong/include/numkong/cast/README.md +262 -0
  120. package/numkong/include/numkong/cast/diamond.h +64 -0
  121. package/numkong/include/numkong/cast/haswell.h +823 -0
  122. package/numkong/include/numkong/cast/icelake.h +475 -0
  123. package/numkong/include/numkong/cast/loongsonasx.h +252 -0
  124. package/numkong/include/numkong/cast/neon.h +1174 -0
  125. package/numkong/include/numkong/cast/powervsx.h +449 -0
  126. package/numkong/include/numkong/cast/rvv.h +970 -0
  127. package/numkong/include/numkong/cast/sapphire.h +262 -0
  128. package/numkong/include/numkong/cast/serial.h +2336 -0
  129. package/numkong/include/numkong/cast/skylake.h +915 -0
  130. package/numkong/include/numkong/cast/v128relaxed.h +537 -0
  131. package/numkong/include/numkong/cast.h +254 -0
  132. package/numkong/include/numkong/cast.hpp +44 -0
  133. package/numkong/include/numkong/curved/README.md +223 -0
  134. package/numkong/include/numkong/curved/genoa.h +182 -0
  135. package/numkong/include/numkong/curved/haswell.h +276 -0
  136. package/numkong/include/numkong/curved/neon.h +329 -0
  137. package/numkong/include/numkong/curved/neonbfdot.h +211 -0
  138. package/numkong/include/numkong/curved/rvv.h +305 -0
  139. package/numkong/include/numkong/curved/serial.h +207 -0
  140. package/numkong/include/numkong/curved/skylake.h +457 -0
  141. package/numkong/include/numkong/curved/smef64.h +530 -0
  142. package/numkong/include/numkong/curved.h +513 -0
  143. package/numkong/include/numkong/curved.hpp +144 -0
  144. package/numkong/include/numkong/dot/README.md +442 -0
  145. package/numkong/include/numkong/dot/alder.h +563 -0
  146. package/numkong/include/numkong/dot/diamond.h +158 -0
  147. package/numkong/include/numkong/dot/genoa.h +289 -0
  148. package/numkong/include/numkong/dot/haswell.h +1723 -0
  149. package/numkong/include/numkong/dot/icelake.h +997 -0
  150. package/numkong/include/numkong/dot/loongsonasx.h +671 -0
  151. package/numkong/include/numkong/dot/neon.h +869 -0
  152. package/numkong/include/numkong/dot/neonbfdot.h +243 -0
  153. package/numkong/include/numkong/dot/neonfhm.h +358 -0
  154. package/numkong/include/numkong/dot/neonfp8.h +323 -0
  155. package/numkong/include/numkong/dot/neonsdot.h +622 -0
  156. package/numkong/include/numkong/dot/powervsx.h +752 -0
  157. package/numkong/include/numkong/dot/rvv.h +722 -0
  158. package/numkong/include/numkong/dot/rvvbb.h +72 -0
  159. package/numkong/include/numkong/dot/rvvbf16.h +123 -0
  160. package/numkong/include/numkong/dot/rvvhalf.h +129 -0
  161. package/numkong/include/numkong/dot/sapphire.h +141 -0
  162. package/numkong/include/numkong/dot/serial.h +874 -0
  163. package/numkong/include/numkong/dot/sierra.h +405 -0
  164. package/numkong/include/numkong/dot/skylake.h +1116 -0
  165. package/numkong/include/numkong/dot/sve.h +420 -0
  166. package/numkong/include/numkong/dot/svebfdot.h +75 -0
  167. package/numkong/include/numkong/dot/svehalf.h +168 -0
  168. package/numkong/include/numkong/dot/svesdot.h +90 -0
  169. package/numkong/include/numkong/dot/v128relaxed.h +1293 -0
  170. package/numkong/include/numkong/dot.h +1136 -0
  171. package/numkong/include/numkong/dot.hpp +94 -0
  172. package/numkong/include/numkong/dots/README.md +496 -0
  173. package/numkong/include/numkong/dots/alder.h +117 -0
  174. package/numkong/include/numkong/dots/diamond.h +86 -0
  175. package/numkong/include/numkong/dots/genoa.h +100 -0
  176. package/numkong/include/numkong/dots/graniteamx.h +733 -0
  177. package/numkong/include/numkong/dots/haswell.h +310 -0
  178. package/numkong/include/numkong/dots/icelake.h +180 -0
  179. package/numkong/include/numkong/dots/loongsonasx.h +176 -0
  180. package/numkong/include/numkong/dots/neon.h +123 -0
  181. package/numkong/include/numkong/dots/neonbfdot.h +59 -0
  182. package/numkong/include/numkong/dots/neonfhm.h +96 -0
  183. package/numkong/include/numkong/dots/neonfp8.h +99 -0
  184. package/numkong/include/numkong/dots/neonsdot.h +144 -0
  185. package/numkong/include/numkong/dots/powervsx.h +194 -0
  186. package/numkong/include/numkong/dots/rvv.h +2593 -0
  187. package/numkong/include/numkong/dots/sapphireamx.h +4017 -0
  188. package/numkong/include/numkong/dots/serial.h +2867 -0
  189. package/numkong/include/numkong/dots/sierra.h +100 -0
  190. package/numkong/include/numkong/dots/skylake.h +207 -0
  191. package/numkong/include/numkong/dots/sme.h +5041 -0
  192. package/numkong/include/numkong/dots/smebi32.h +477 -0
  193. package/numkong/include/numkong/dots/smef64.h +1328 -0
  194. package/numkong/include/numkong/dots/smehalf.h +47 -0
  195. package/numkong/include/numkong/dots/v128relaxed.h +317 -0
  196. package/numkong/include/numkong/dots.h +3110 -0
  197. package/numkong/include/numkong/dots.hpp +641 -0
  198. package/numkong/include/numkong/each/README.md +465 -0
  199. package/numkong/include/numkong/each/haswell.h +1658 -0
  200. package/numkong/include/numkong/each/icelake.h +272 -0
  201. package/numkong/include/numkong/each/neon.h +1138 -0
  202. package/numkong/include/numkong/each/neonbfdot.h +211 -0
  203. package/numkong/include/numkong/each/neonhalf.h +318 -0
  204. package/numkong/include/numkong/each/rvv.h +1121 -0
  205. package/numkong/include/numkong/each/sapphire.h +343 -0
  206. package/numkong/include/numkong/each/serial.h +282 -0
  207. package/numkong/include/numkong/each/skylake.h +1562 -0
  208. package/numkong/include/numkong/each/v128relaxed.h +562 -0
  209. package/numkong/include/numkong/each.h +2232 -0
  210. package/numkong/include/numkong/each.hpp +434 -0
  211. package/numkong/include/numkong/geospatial/README.md +147 -0
  212. package/numkong/include/numkong/geospatial/haswell.h +633 -0
  213. package/numkong/include/numkong/geospatial/neon.h +615 -0
  214. package/numkong/include/numkong/geospatial/rvv.h +701 -0
  215. package/numkong/include/numkong/geospatial/serial.h +309 -0
  216. package/numkong/include/numkong/geospatial/skylake.h +613 -0
  217. package/numkong/include/numkong/geospatial/v128relaxed.h +652 -0
  218. package/numkong/include/numkong/geospatial.h +453 -0
  219. package/numkong/include/numkong/geospatial.hpp +235 -0
  220. package/numkong/include/numkong/matrix.hpp +336 -0
  221. package/numkong/include/numkong/maxsim/README.md +187 -0
  222. package/numkong/include/numkong/maxsim/alder.h +511 -0
  223. package/numkong/include/numkong/maxsim/genoa.h +115 -0
  224. package/numkong/include/numkong/maxsim/haswell.h +553 -0
  225. package/numkong/include/numkong/maxsim/icelake.h +480 -0
  226. package/numkong/include/numkong/maxsim/neonsdot.h +394 -0
  227. package/numkong/include/numkong/maxsim/sapphireamx.h +877 -0
  228. package/numkong/include/numkong/maxsim/serial.h +490 -0
  229. package/numkong/include/numkong/maxsim/sme.h +993 -0
  230. package/numkong/include/numkong/maxsim/v128relaxed.h +280 -0
  231. package/numkong/include/numkong/maxsim.h +571 -0
  232. package/numkong/include/numkong/maxsim.hpp +133 -0
  233. package/numkong/include/numkong/mesh/README.md +219 -0
  234. package/numkong/include/numkong/mesh/haswell.h +2013 -0
  235. package/numkong/include/numkong/mesh/neon.h +1821 -0
  236. package/numkong/include/numkong/mesh/neonbfdot.h +771 -0
  237. package/numkong/include/numkong/mesh/rvv.h +936 -0
  238. package/numkong/include/numkong/mesh/serial.h +721 -0
  239. package/numkong/include/numkong/mesh/skylake.h +2344 -0
  240. package/numkong/include/numkong/mesh/v128relaxed.h +1081 -0
  241. package/numkong/include/numkong/mesh.h +666 -0
  242. package/numkong/include/numkong/mesh.hpp +701 -0
  243. package/numkong/include/numkong/numkong.h +78 -0
  244. package/numkong/include/numkong/numkong.hpp +58 -0
  245. package/numkong/include/numkong/probability/README.md +177 -0
  246. package/numkong/include/numkong/probability/haswell.h +267 -0
  247. package/numkong/include/numkong/probability/neon.h +255 -0
  248. package/numkong/include/numkong/probability/rvv.h +414 -0
  249. package/numkong/include/numkong/probability/serial.h +181 -0
  250. package/numkong/include/numkong/probability/skylake.h +324 -0
  251. package/numkong/include/numkong/probability.h +380 -0
  252. package/numkong/include/numkong/probability.hpp +120 -0
  253. package/numkong/include/numkong/random.h +50 -0
  254. package/numkong/include/numkong/random.hpp +285 -0
  255. package/numkong/include/numkong/reduce/README.md +552 -0
  256. package/numkong/include/numkong/reduce/alder.h +636 -0
  257. package/numkong/include/numkong/reduce/genoa.h +201 -0
  258. package/numkong/include/numkong/reduce/haswell.h +3785 -0
  259. package/numkong/include/numkong/reduce/icelake.h +549 -0
  260. package/numkong/include/numkong/reduce/neon.h +3980 -0
  261. package/numkong/include/numkong/reduce/neonbfdot.h +142 -0
  262. package/numkong/include/numkong/reduce/neonfhm.h +293 -0
  263. package/numkong/include/numkong/reduce/neonsdot.h +357 -0
  264. package/numkong/include/numkong/reduce/rvv.h +3533 -0
  265. package/numkong/include/numkong/reduce/serial.h +753 -0
  266. package/numkong/include/numkong/reduce/sierra.h +338 -0
  267. package/numkong/include/numkong/reduce/skylake.h +3794 -0
  268. package/numkong/include/numkong/reduce/sve.h +52 -0
  269. package/numkong/include/numkong/reduce/v128relaxed.h +2302 -0
  270. package/numkong/include/numkong/reduce.h +1582 -0
  271. package/numkong/include/numkong/reduce.hpp +778 -0
  272. package/numkong/include/numkong/scalar/README.md +89 -0
  273. package/numkong/include/numkong/scalar/haswell.h +122 -0
  274. package/numkong/include/numkong/scalar/loongsonasx.h +74 -0
  275. package/numkong/include/numkong/scalar/neon.h +122 -0
  276. package/numkong/include/numkong/scalar/neonhalf.h +70 -0
  277. package/numkong/include/numkong/scalar/powervsx.h +96 -0
  278. package/numkong/include/numkong/scalar/rvv.h +211 -0
  279. package/numkong/include/numkong/scalar/sapphire.h +74 -0
  280. package/numkong/include/numkong/scalar/serial.h +332 -0
  281. package/numkong/include/numkong/scalar/v128relaxed.h +56 -0
  282. package/numkong/include/numkong/scalar.h +696 -0
  283. package/numkong/include/numkong/set/README.md +179 -0
  284. package/numkong/include/numkong/set/haswell.h +334 -0
  285. package/numkong/include/numkong/set/icelake.h +485 -0
  286. package/numkong/include/numkong/set/loongsonasx.h +181 -0
  287. package/numkong/include/numkong/set/neon.h +363 -0
  288. package/numkong/include/numkong/set/powervsx.h +326 -0
  289. package/numkong/include/numkong/set/rvv.h +226 -0
  290. package/numkong/include/numkong/set/rvvbb.h +117 -0
  291. package/numkong/include/numkong/set/serial.h +174 -0
  292. package/numkong/include/numkong/set/sve.h +187 -0
  293. package/numkong/include/numkong/set/v128relaxed.h +240 -0
  294. package/numkong/include/numkong/set.h +471 -0
  295. package/numkong/include/numkong/set.hpp +114 -0
  296. package/numkong/include/numkong/sets/README.md +149 -0
  297. package/numkong/include/numkong/sets/haswell.h +63 -0
  298. package/numkong/include/numkong/sets/icelake.h +66 -0
  299. package/numkong/include/numkong/sets/loongsonasx.h +52 -0
  300. package/numkong/include/numkong/sets/neon.h +61 -0
  301. package/numkong/include/numkong/sets/powervsx.h +65 -0
  302. package/numkong/include/numkong/sets/serial.h +43 -0
  303. package/numkong/include/numkong/sets/smebi32.h +1135 -0
  304. package/numkong/include/numkong/sets/v128relaxed.h +58 -0
  305. package/numkong/include/numkong/sets.h +382 -0
  306. package/numkong/include/numkong/sparse/README.md +156 -0
  307. package/numkong/include/numkong/sparse/icelake.h +463 -0
  308. package/numkong/include/numkong/sparse/neon.h +288 -0
  309. package/numkong/include/numkong/sparse/serial.h +117 -0
  310. package/numkong/include/numkong/sparse/sve2.h +504 -0
  311. package/numkong/include/numkong/sparse/turin.h +322 -0
  312. package/numkong/include/numkong/sparse.h +363 -0
  313. package/numkong/include/numkong/sparse.hpp +113 -0
  314. package/numkong/include/numkong/spatial/README.md +439 -0
  315. package/numkong/include/numkong/spatial/alder.h +604 -0
  316. package/numkong/include/numkong/spatial/diamond.h +240 -0
  317. package/numkong/include/numkong/spatial/genoa.h +222 -0
  318. package/numkong/include/numkong/spatial/haswell.h +979 -0
  319. package/numkong/include/numkong/spatial/icelake.h +1067 -0
  320. package/numkong/include/numkong/spatial/loongsonasx.h +483 -0
  321. package/numkong/include/numkong/spatial/neon.h +846 -0
  322. package/numkong/include/numkong/spatial/neonbfdot.h +164 -0
  323. package/numkong/include/numkong/spatial/neonfp8.h +258 -0
  324. package/numkong/include/numkong/spatial/neonsdot.h +429 -0
  325. package/numkong/include/numkong/spatial/powervsx.h +738 -0
  326. package/numkong/include/numkong/spatial/rvv.h +991 -0
  327. package/numkong/include/numkong/spatial/rvvbf16.h +128 -0
  328. package/numkong/include/numkong/spatial/rvvhalf.h +120 -0
  329. package/numkong/include/numkong/spatial/serial.h +347 -0
  330. package/numkong/include/numkong/spatial/sierra.h +516 -0
  331. package/numkong/include/numkong/spatial/skylake.h +605 -0
  332. package/numkong/include/numkong/spatial/sve.h +246 -0
  333. package/numkong/include/numkong/spatial/svebfdot.h +125 -0
  334. package/numkong/include/numkong/spatial/svehalf.h +136 -0
  335. package/numkong/include/numkong/spatial/svesdot.h +143 -0
  336. package/numkong/include/numkong/spatial/v128relaxed.h +969 -0
  337. package/numkong/include/numkong/spatial.h +1681 -0
  338. package/numkong/include/numkong/spatial.hpp +183 -0
  339. package/numkong/include/numkong/spatials/README.md +580 -0
  340. package/numkong/include/numkong/spatials/alder.h +94 -0
  341. package/numkong/include/numkong/spatials/diamond.h +82 -0
  342. package/numkong/include/numkong/spatials/genoa.h +94 -0
  343. package/numkong/include/numkong/spatials/graniteamx.h +173 -0
  344. package/numkong/include/numkong/spatials/haswell.h +219 -0
  345. package/numkong/include/numkong/spatials/icelake.h +113 -0
  346. package/numkong/include/numkong/spatials/loongsonasx.h +153 -0
  347. package/numkong/include/numkong/spatials/neon.h +109 -0
  348. package/numkong/include/numkong/spatials/neonbfdot.h +60 -0
  349. package/numkong/include/numkong/spatials/neonfhm.h +92 -0
  350. package/numkong/include/numkong/spatials/neonfp8.h +111 -0
  351. package/numkong/include/numkong/spatials/neonsdot.h +143 -0
  352. package/numkong/include/numkong/spatials/powervsx.h +153 -0
  353. package/numkong/include/numkong/spatials/rvv.h +1976 -0
  354. package/numkong/include/numkong/spatials/sapphireamx.h +1149 -0
  355. package/numkong/include/numkong/spatials/serial.h +248 -0
  356. package/numkong/include/numkong/spatials/sierra.h +96 -0
  357. package/numkong/include/numkong/spatials/skylake.h +184 -0
  358. package/numkong/include/numkong/spatials/sme.h +1927 -0
  359. package/numkong/include/numkong/spatials/smef64.h +483 -0
  360. package/numkong/include/numkong/spatials/v128relaxed.h +240 -0
  361. package/numkong/include/numkong/spatials.h +3374 -0
  362. package/numkong/include/numkong/spatials.hpp +509 -0
  363. package/numkong/include/numkong/tensor.hpp +1981 -0
  364. package/numkong/include/numkong/trigonometry/README.md +184 -0
  365. package/numkong/include/numkong/trigonometry/haswell.h +653 -0
  366. package/numkong/include/numkong/trigonometry/neon.h +638 -0
  367. package/numkong/include/numkong/trigonometry/rvv.h +700 -0
  368. package/numkong/include/numkong/trigonometry/serial.h +703 -0
  369. package/numkong/include/numkong/trigonometry/skylake.h +725 -0
  370. package/numkong/include/numkong/trigonometry/v128relaxed.h +667 -0
  371. package/numkong/include/numkong/trigonometry.h +467 -0
  372. package/numkong/include/numkong/trigonometry.hpp +166 -0
  373. package/numkong/include/numkong/types.h +1695 -0
  374. package/numkong/include/numkong/types.hpp +6027 -0
  375. package/numkong/include/numkong/vector.hpp +766 -0
  376. package/numkong/javascript/@numkong-darwin-arm64/package.json +26 -0
  377. package/numkong/javascript/@numkong-darwin-x64/package.json +26 -0
  378. package/numkong/javascript/@numkong-linux-arm64/package.json +25 -0
  379. package/numkong/javascript/@numkong-linux-x64/package.json +25 -0
  380. package/numkong/javascript/@numkong-win32-arm64/package.json +25 -0
  381. package/numkong/javascript/@numkong-win32-x64/package.json +25 -0
  382. package/numkong/javascript/README.md +254 -0
  383. package/numkong/javascript/node-gyp-build.d.ts +4 -0
  384. package/numkong/javascript/numkong-browser.ts +40 -0
  385. package/numkong/javascript/numkong-wasm.ts +750 -0
  386. package/numkong/javascript/numkong.c +712 -0
  387. package/numkong/javascript/numkong.ts +613 -0
  388. package/{simsimd → numkong}/javascript/tsconfig-base.json +6 -3
  389. package/numkong/javascript/tsconfig-cjs.json +13 -0
  390. package/{simsimd → numkong}/javascript/tsconfig-esm.json +1 -1
  391. package/numkong/javascript/types.ts +784 -0
  392. package/numkong/numkong.gypi +104 -0
  393. package/numkong/package.json +108 -0
  394. package/numkong/probes/arm_neon.c +8 -0
  395. package/numkong/probes/arm_neon_bfdot.c +9 -0
  396. package/numkong/probes/arm_neon_fhm.c +9 -0
  397. package/numkong/probes/arm_neon_half.c +8 -0
  398. package/numkong/probes/arm_neon_sdot.c +9 -0
  399. package/numkong/probes/arm_neonfp8.c +9 -0
  400. package/numkong/probes/arm_sme.c +16 -0
  401. package/numkong/probes/arm_sme2.c +16 -0
  402. package/numkong/probes/arm_sme2p1.c +16 -0
  403. package/numkong/probes/arm_sme_bf16.c +16 -0
  404. package/numkong/probes/arm_sme_bi32.c +16 -0
  405. package/numkong/probes/arm_sme_f64.c +16 -0
  406. package/numkong/probes/arm_sme_fa64.c +14 -0
  407. package/numkong/probes/arm_sme_half.c +16 -0
  408. package/numkong/probes/arm_sme_lut2.c +15 -0
  409. package/numkong/probes/arm_sve.c +18 -0
  410. package/numkong/probes/arm_sve2.c +20 -0
  411. package/numkong/probes/arm_sve2p1.c +18 -0
  412. package/numkong/probes/arm_sve_bfdot.c +20 -0
  413. package/numkong/probes/arm_sve_half.c +18 -0
  414. package/numkong/probes/arm_sve_sdot.c +21 -0
  415. package/numkong/probes/loongarch_lasx.c +12 -0
  416. package/numkong/probes/power_vsx.c +12 -0
  417. package/numkong/probes/probe.js +127 -0
  418. package/numkong/probes/riscv_rvv.c +14 -0
  419. package/numkong/probes/riscv_rvv_bb.c +15 -0
  420. package/numkong/probes/riscv_rvv_bf16.c +17 -0
  421. package/numkong/probes/riscv_rvv_half.c +14 -0
  422. package/numkong/probes/wasm_v128relaxed.c +11 -0
  423. package/numkong/probes/x86_alder.c +17 -0
  424. package/numkong/probes/x86_diamond.c +17 -0
  425. package/numkong/probes/x86_genoa.c +17 -0
  426. package/numkong/probes/x86_graniteamx.c +19 -0
  427. package/numkong/probes/x86_haswell.c +11 -0
  428. package/numkong/probes/x86_icelake.c +17 -0
  429. package/numkong/probes/x86_sapphire.c +16 -0
  430. package/numkong/probes/x86_sapphireamx.c +18 -0
  431. package/numkong/probes/x86_sierra.c +17 -0
  432. package/numkong/probes/x86_skylake.c +15 -0
  433. package/numkong/probes/x86_turin.c +17 -0
  434. package/numkong/rust/README.md +698 -0
  435. package/numkong/rust/capabilities.rs +96 -0
  436. package/numkong/rust/cast.rs +314 -0
  437. package/numkong/rust/curved.rs +391 -0
  438. package/numkong/rust/each.rs +2721 -0
  439. package/numkong/rust/geospatial.rs +343 -0
  440. package/numkong/rust/matrix.rs +5424 -0
  441. package/numkong/rust/maxsim.rs +540 -0
  442. package/numkong/rust/mesh.rs +837 -0
  443. package/numkong/rust/numkong.rs +409 -0
  444. package/numkong/rust/probability.rs +272 -0
  445. package/numkong/rust/reduce.rs +1249 -0
  446. package/numkong/rust/set.rs +194 -0
  447. package/numkong/rust/sparse.rs +513 -0
  448. package/numkong/rust/spatial.rs +1815 -0
  449. package/numkong/rust/tensor.rs +7565 -0
  450. package/numkong/rust/types.rs +3666 -0
  451. package/numkong/rust/vector.rs +1899 -0
  452. package/numkong/rustfmt.toml +2 -0
  453. package/numkong/swift/Matrix.swift +1388 -0
  454. package/numkong/swift/MaxSim.swift +151 -0
  455. package/numkong/swift/NumKong.swift +283 -0
  456. package/numkong/swift/Numerics.swift +329 -0
  457. package/numkong/swift/README.md +433 -0
  458. package/numkong/swift/Scalar.swift +741 -0
  459. package/numkong/swift/Tensor.swift +209 -0
  460. package/numkong/test/README.md +315 -0
  461. package/numkong/test/playwright.config.ts +16 -0
  462. package/numkong/test/swift/Test.swift +534 -0
  463. package/numkong/test/test-browser-bundle-runner.mjs +36 -0
  464. package/numkong/test/test-browser-bundle.html +188 -0
  465. package/numkong/test/test-browser-runner.mjs +43 -0
  466. package/numkong/test/test-browser.html +305 -0
  467. package/numkong/test/test-dtypes.mjs +453 -0
  468. package/numkong/test/test-wasm.mjs +267 -0
  469. package/numkong/test/test.cpp +442 -0
  470. package/numkong/test/test.hpp +580 -0
  471. package/numkong/test/test.mjs +363 -0
  472. package/numkong/test/test_base.py +1041 -0
  473. package/numkong/test/test_cast.cpp +242 -0
  474. package/numkong/test/test_cross.hpp +551 -0
  475. package/numkong/test/test_cross.py +467 -0
  476. package/numkong/test/test_cross_amx.cpp +50 -0
  477. package/numkong/test/test_cross_arm.cpp +225 -0
  478. package/numkong/test/test_cross_blas.cpp +354 -0
  479. package/numkong/test/test_cross_loongarch.cpp +90 -0
  480. package/numkong/test/test_cross_power.cpp +73 -0
  481. package/numkong/test/test_cross_rvv.cpp +109 -0
  482. package/numkong/test/test_cross_serial.cpp +181 -0
  483. package/numkong/test/test_cross_sme.cpp +148 -0
  484. package/numkong/test/test_cross_wasm.cpp +141 -0
  485. package/numkong/test/test_cross_x86.cpp +442 -0
  486. package/numkong/test/test_curved.cpp +182 -0
  487. package/numkong/test/test_curved.py +207 -0
  488. package/numkong/test/test_dot.cpp +353 -0
  489. package/numkong/test/test_dot.py +296 -0
  490. package/numkong/test/test_each.cpp +437 -0
  491. package/numkong/test/test_each.py +756 -0
  492. package/numkong/test/test_geospatial.cpp +155 -0
  493. package/numkong/test/test_geospatial.py +241 -0
  494. package/numkong/test/test_maxsim.cpp +138 -0
  495. package/numkong/test/test_maxsim.py +209 -0
  496. package/numkong/test/test_mesh.cpp +203 -0
  497. package/numkong/test/test_mesh.py +394 -0
  498. package/numkong/test/test_probability.cpp +136 -0
  499. package/numkong/test/test_probability.py +166 -0
  500. package/numkong/test/test_reduce.cpp +563 -0
  501. package/numkong/test/test_reduce.py +781 -0
  502. package/numkong/test/test_set.cpp +151 -0
  503. package/numkong/test/test_set.py +120 -0
  504. package/numkong/test/test_similarities.py +579 -0
  505. package/numkong/test/test_sparse.cpp +121 -0
  506. package/numkong/test/test_sparse.py +118 -0
  507. package/numkong/test/test_spatial.cpp +518 -0
  508. package/numkong/test/test_spatial.py +269 -0
  509. package/numkong/test/test_tensor.cpp +884 -0
  510. package/numkong/test/test_tensor.py +1417 -0
  511. package/numkong/test/test_trigonometry.cpp +156 -0
  512. package/numkong/test/test_trigonometry.py +180 -0
  513. package/package.json +7 -8
  514. package/prebuilds/darwin-arm64+x64/usearch.node +0 -0
  515. package/prebuilds/linux-arm64/usearch.node +0 -0
  516. package/prebuilds/linux-x64/usearch.node +0 -0
  517. package/fp16/CMakeLists.txt +0 -176
  518. package/fp16/LICENSE +0 -11
  519. package/fp16/README.md +0 -20
  520. package/fp16/bench/alt-element.cc +0 -89
  521. package/fp16/bench/from-alt-array.cc +0 -175
  522. package/fp16/bench/from-ieee-array.cc +0 -399
  523. package/fp16/bench/ieee-element.cc +0 -272
  524. package/fp16/bench/to-alt-array.cc +0 -91
  525. package/fp16/bench/to-ieee-array.cc +0 -303
  526. package/fp16/cmake/DownloadGoogleBenchmark.cmake +0 -15
  527. package/fp16/cmake/DownloadGoogleTest.cmake +0 -15
  528. package/fp16/cmake/DownloadPSimd.cmake +0 -15
  529. package/fp16/configure.py +0 -65
  530. package/fp16/confu.yaml +0 -8
  531. package/fp16/include/fp16/__init__.py +0 -0
  532. package/fp16/include/fp16/avx.py +0 -50
  533. package/fp16/include/fp16/avx2.py +0 -53
  534. package/fp16/include/fp16/bitcasts.h +0 -92
  535. package/fp16/include/fp16/fp16.h +0 -451
  536. package/fp16/include/fp16/psimd.h +0 -131
  537. package/fp16/include/fp16.h +0 -11
  538. package/fp16/jni/Android.mk +0 -6
  539. package/fp16/jni/Application.mk +0 -4
  540. package/fp16/test/alt-from-fp32-value.cc +0 -498
  541. package/fp16/test/alt-to-fp32-bits.cc +0 -263
  542. package/fp16/test/alt-to-fp32-psimd.cc +0 -145
  543. package/fp16/test/alt-to-fp32-value.cc +0 -348
  544. package/fp16/test/alt-to-fp32x2-psimd.cc +0 -245
  545. package/fp16/test/bitcasts.cc +0 -56
  546. package/fp16/test/ieee-from-fp32-value.cc +0 -523
  547. package/fp16/test/ieee-to-fp32-bits.cc +0 -333
  548. package/fp16/test/ieee-to-fp32-psimd.cc +0 -312
  549. package/fp16/test/ieee-to-fp32-value.cc +0 -420
  550. package/fp16/test/ieee-to-fp32x2-psimd.cc +0 -541
  551. package/fp16/test/peachpy/alt-xmm-to-fp32-xmm-avx.cc +0 -96
  552. package/fp16/test/peachpy/alt-xmm-to-fp32-ymm-avx2.cc +0 -96
  553. package/fp16/test/peachpy/stubs.py +0 -38
  554. package/fp16/test/tables.cc +0 -530
  555. package/fp16/test/tables.h +0 -13
  556. package/fp16/third-party/THHalf.h +0 -92
  557. package/fp16/third-party/eigen-half.h +0 -170
  558. package/fp16/third-party/float16-compressor.h +0 -80
  559. package/fp16/third-party/half.hpp +0 -2916
  560. package/fp16/third-party/npy-halffloat.h +0 -328
  561. package/simsimd/.git-blame-ignore-revs +0 -2
  562. package/simsimd/CONTRIBUTING.md +0 -321
  563. package/simsimd/Cargo.toml +0 -49
  564. package/simsimd/MANIFEST.in +0 -4
  565. package/simsimd/Package.swift +0 -28
  566. package/simsimd/README.md +0 -1493
  567. package/simsimd/binding.gyp +0 -35
  568. package/simsimd/build.rs +0 -70
  569. package/simsimd/c/lib.c +0 -374
  570. package/simsimd/include/module.modulemap +0 -4
  571. package/simsimd/include/simsimd/binary.h +0 -486
  572. package/simsimd/include/simsimd/curved.h +0 -1541
  573. package/simsimd/include/simsimd/dot.h +0 -1853
  574. package/simsimd/include/simsimd/elementwise.h +0 -2465
  575. package/simsimd/include/simsimd/geospatial.h +0 -43
  576. package/simsimd/include/simsimd/mesh.h +0 -69
  577. package/simsimd/include/simsimd/probability.h +0 -606
  578. package/simsimd/include/simsimd/simsimd.h +0 -2567
  579. package/simsimd/include/simsimd/sparse.h +0 -1384
  580. package/simsimd/include/simsimd/spatial.h +0 -2335
  581. package/simsimd/include/simsimd/types.h +0 -666
  582. package/simsimd/javascript/fallback.ts +0 -233
  583. package/simsimd/javascript/lib.c +0 -125
  584. package/simsimd/javascript/node-gyp-build.d.ts +0 -1
  585. package/simsimd/javascript/simsimd.ts +0 -179
  586. package/simsimd/javascript/tsconfig-cjs.json +0 -8
  587. package/simsimd/package-lock.json +0 -1761
  588. package/simsimd/package.json +0 -61
  589. package/simsimd/rust/lib.rs +0 -1821
  590. package/simsimd/scripts/bench.cxx +0 -1170
  591. package/simsimd/scripts/bench.ipynb +0 -187
  592. package/simsimd/scripts/bench.js +0 -127
  593. package/simsimd/scripts/bench.rs +0 -876
  594. package/simsimd/scripts/bench_vectors.py +0 -734
  595. package/simsimd/scripts/bench_vectors_live.py +0 -213
  596. package/simsimd/scripts/test.c +0 -187
  597. package/simsimd/scripts/test.mjs +0 -220
  598. package/simsimd/scripts/test.py +0 -1505
  599. package/simsimd/swift/SimSIMD.swift +0 -149
  600. package/simsimd/swift/Test.swift +0 -128
  601. /package/{simsimd → numkong}/CODE_OF_CONDUCT.md +0 -0
  602. /package/{simsimd → numkong}/LICENSE +0 -0
  603. /package/{simsimd → numkong}/javascript/dist-package-cjs.json +0 -0
  604. /package/{simsimd → numkong}/javascript/dist-package-esm.json +0 -0
@@ -48,7 +48,7 @@ Customize your index with additional configuration options:
48
48
  const index = new usearch.Index({
49
49
  dimensions: 128,
50
50
  metric: 'ip',
51
- quantization: 'f32',
51
+ quantization: 'f32', // or 'bf16', 'f16', 'e5m2', 'e4m3', 'e3m2', 'e2m3', 'u8', 'i8', 'b1'
52
52
  connectivity: 10,
53
53
  expansion_add: 5,
54
54
  expansion_search: 3,
@@ -1,4 +1,4 @@
1
- type Vector = Float32Array | Float64Array | Int8Array;
1
+ type Vector = Float32Array | Float64Array | Int8Array | Uint8Array;
2
2
  type Matrix = Vector[];
3
3
  type VectorOrMatrix = Vector | Matrix;
4
4
  /**
@@ -26,11 +26,16 @@ export declare enum MetricKind {
26
26
  */
27
27
  export declare enum ScalarKind {
28
28
  Unknown = "unknown",
29
- F32 = "f32",
30
29
  F64 = "f64",
31
- F16 = "f16",
30
+ F32 = "f32",
32
31
  BF16 = "bf16",
32
+ F16 = "f16",
33
+ E5M2 = "e5m2",
34
+ E4M3 = "e4m3",
35
+ E3M2 = "e3m2",
36
+ E2M3 = "e2m3",
33
37
  I8 = "i8",
38
+ U8 = "u8",
34
39
  B1 = "b1"
35
40
  }
36
41
  /**
@@ -82,11 +82,16 @@ var MetricKind;
82
82
  var ScalarKind;
83
83
  (function (ScalarKind) {
84
84
  ScalarKind["Unknown"] = "unknown";
85
- ScalarKind["F32"] = "f32";
86
85
  ScalarKind["F64"] = "f64";
87
- ScalarKind["F16"] = "f16";
86
+ ScalarKind["F32"] = "f32";
88
87
  ScalarKind["BF16"] = "bf16";
88
+ ScalarKind["F16"] = "f16";
89
+ ScalarKind["E5M2"] = "e5m2";
90
+ ScalarKind["E4M3"] = "e4m3";
91
+ ScalarKind["E3M2"] = "e3m2";
92
+ ScalarKind["E2M3"] = "e2m3";
89
93
  ScalarKind["I8"] = "i8";
94
+ ScalarKind["U8"] = "u8";
90
95
  ScalarKind["B1"] = "b1";
91
96
  })(ScalarKind || (exports.ScalarKind = ScalarKind = {}));
92
97
  /**
@@ -174,7 +179,8 @@ function normalizeKeys(keys) {
174
179
  function isVector(vectors) {
175
180
  return (vectors instanceof Float32Array ||
176
181
  vectors instanceof Float64Array ||
177
- vectors instanceof Int8Array);
182
+ vectors instanceof Int8Array ||
183
+ vectors instanceof Uint8Array);
178
184
  }
179
185
  function normalizeVectors(vectors, dimensions, targetType = Float32Array) {
180
186
  let flattenedVectors;
@@ -482,8 +488,10 @@ function exactSearch(dataset, queries, dimensions, count, metric, threads = 0) {
482
488
  targetType = Float64Array;
483
489
  else if (dataset instanceof Int8Array)
484
490
  targetType = Int8Array;
491
+ else if (dataset instanceof Uint8Array)
492
+ targetType = Uint8Array;
485
493
  else
486
- targetType = Float32Array; // default to Float32Array if dataset is not Float64Array or Int8Array
494
+ targetType = Float32Array; // default to Float32Array if dataset is not Float64Array, Int8Array, or Uint8Array
487
495
  dataset = normalizeVectors(dataset, dimensions, targetType);
488
496
  queries = normalizeVectors(queries, dimensions, targetType);
489
497
  const countInDataset = dataset.length / dimensions;
@@ -1,4 +1,4 @@
1
- type Vector = Float32Array | Float64Array | Int8Array;
1
+ type Vector = Float32Array | Float64Array | Int8Array | Uint8Array;
2
2
  type Matrix = Vector[];
3
3
  type VectorOrMatrix = Vector | Matrix;
4
4
  /**
@@ -26,11 +26,16 @@ export declare enum MetricKind {
26
26
  */
27
27
  export declare enum ScalarKind {
28
28
  Unknown = "unknown",
29
- F32 = "f32",
30
29
  F64 = "f64",
31
- F16 = "f16",
30
+ F32 = "f32",
32
31
  BF16 = "bf16",
32
+ F16 = "f16",
33
+ E5M2 = "e5m2",
34
+ E4M3 = "e4m3",
35
+ E3M2 = "e3m2",
36
+ E2M3 = "e2m3",
33
37
  I8 = "i8",
38
+ U8 = "u8",
34
39
  B1 = "b1"
35
40
  }
36
41
  /**
@@ -30,11 +30,16 @@ export var MetricKind;
30
30
  export var ScalarKind;
31
31
  (function (ScalarKind) {
32
32
  ScalarKind["Unknown"] = "unknown";
33
- ScalarKind["F32"] = "f32";
34
33
  ScalarKind["F64"] = "f64";
35
- ScalarKind["F16"] = "f16";
34
+ ScalarKind["F32"] = "f32";
36
35
  ScalarKind["BF16"] = "bf16";
36
+ ScalarKind["F16"] = "f16";
37
+ ScalarKind["E5M2"] = "e5m2";
38
+ ScalarKind["E4M3"] = "e4m3";
39
+ ScalarKind["E3M2"] = "e3m2";
40
+ ScalarKind["E2M3"] = "e2m3";
37
41
  ScalarKind["I8"] = "i8";
42
+ ScalarKind["U8"] = "u8";
38
43
  ScalarKind["B1"] = "b1";
39
44
  })(ScalarKind || (ScalarKind = {}));
40
45
  /**
@@ -126,7 +131,8 @@ function normalizeKeys(keys) {
126
131
  function isVector(vectors) {
127
132
  return (vectors instanceof Float32Array ||
128
133
  vectors instanceof Float64Array ||
129
- vectors instanceof Int8Array);
134
+ vectors instanceof Int8Array ||
135
+ vectors instanceof Uint8Array);
130
136
  }
131
137
  function normalizeVectors(vectors, dimensions, targetType = Float32Array) {
132
138
  let flattenedVectors;
@@ -432,8 +438,10 @@ export function exactSearch(dataset, queries, dimensions, count, metric, threads
432
438
  targetType = Float64Array;
433
439
  else if (dataset instanceof Int8Array)
434
440
  targetType = Int8Array;
441
+ else if (dataset instanceof Uint8Array)
442
+ targetType = Uint8Array;
435
443
  else
436
- targetType = Float32Array; // default to Float32Array if dataset is not Float64Array or Int8Array
444
+ targetType = Float32Array; // default to Float32Array if dataset is not Float64Array, Int8Array, or Uint8Array
437
445
  dataset = normalizeVectors(dataset, dimensions, targetType);
438
446
  queries = normalizeVectors(queries, dimensions, targetType);
439
447
  const countInDataset = dataset.length / dimensions;
@@ -432,7 +432,24 @@ Napi::Value exactSearch(Napi::CallbackInfo const& ctx) {
432
432
  return result_js;
433
433
  }
434
434
 
435
+ Napi::Value version(Napi::CallbackInfo const& info) {
436
+ static char buf[32];
437
+ std::snprintf(buf, sizeof(buf), "%d.%d.%d", USEARCH_VERSION_MAJOR, USEARCH_VERSION_MINOR, USEARCH_VERSION_PATCH);
438
+ return Napi::String::New(info.Env(), buf);
439
+ }
440
+
441
+ Napi::Value hardwareAccelerationCompiled(Napi::CallbackInfo const& info) {
442
+ return Napi::String::New(info.Env(), unum::usearch::hardware_acceleration_compiled());
443
+ }
444
+
445
+ Napi::Value hardwareAccelerationAvailable(Napi::CallbackInfo const& info) {
446
+ return Napi::String::New(info.Env(), unum::usearch::hardware_acceleration_available());
447
+ }
448
+
435
449
  Napi::Object InitAll(Napi::Env env, Napi::Object exports) {
450
+ exports.Set("version", Napi::Function::New(env, version));
451
+ exports.Set("hardwareAccelerationCompiled", Napi::Function::New(env, hardwareAccelerationCompiled));
452
+ exports.Set("hardwareAccelerationAvailable", Napi::Function::New(env, hardwareAccelerationAvailable));
436
453
  exports.Set("exactSearch", Napi::Function::New(env, exactSearch));
437
454
  return CompiledIndex::Init(env, exports);
438
455
  }
@@ -1,23 +1,23 @@
1
- const nodeTest = require('node:test');
1
+ const nodeTest = require("node:test");
2
2
  const realTest = nodeTest.test; // the original function
3
3
 
4
4
  function loggedTest(name, options, fn) {
5
5
  // The API has two call signatures:
6
6
  // test(name, fn)
7
7
  // test(name, options, fn)
8
- if (typeof options === 'function') {
8
+ if (typeof options === "function") {
9
9
  fn = options;
10
10
  options = undefined;
11
11
  }
12
12
 
13
13
  // Wrap the body so we can log before / after
14
14
  const wrapped = async (t) => {
15
- console.log('▶', name);
15
+ console.log("▶", name);
16
16
  try {
17
17
  await fn(t); // run the user’s test
18
- console.log('✓', name);
18
+ console.log("✓", name);
19
19
  } catch (err) {
20
- console.log('✖', name);
20
+ console.log("✖", name);
21
21
  throw err; // re-throw so the runner records the failure
22
22
  }
23
23
  };
@@ -30,43 +30,43 @@ function loggedTest(name, options, fn) {
30
30
  global.test = loggedTest;
31
31
  module.exports = loggedTest; // for completeness if this file is `require`d
32
32
 
33
- const assert = require('node:assert');
34
- const fs = require('node:fs');
35
- const os = require('node:os');
36
- const path = require('node:path');
37
- const usearch = require('./dist/cjs/usearch.js');
33
+ const assert = require("node:assert");
34
+ const fs = require("node:fs");
35
+ const os = require("node:os");
36
+ const path = require("node:path");
37
+ const usearch = require("./dist/cjs/usearch.js");
38
38
 
39
39
  function assertAlmostEqual(actual, expected, tolerance = 1e-6) {
40
40
  const lowerBound = expected - tolerance;
41
41
  const upperBound = expected + tolerance;
42
42
  assert(
43
43
  actual >= lowerBound && actual <= upperBound,
44
- `Expected ${actual} to be almost equal to ${expected}`
44
+ `Expected ${actual} to be almost equal to ${expected}`,
45
45
  );
46
46
  }
47
47
 
48
48
  const THREADS = 2;
49
49
 
50
- test('Single-entry operations', async (t) => {
51
- await t.test('index info', () => {
52
- const index = new usearch.Index(2, 'l2sq');
50
+ test("Single-entry operations", async (t) => {
51
+ await t.test("index info", () => {
52
+ const index = new usearch.Index(2, "l2sq");
53
53
 
54
- assert.equal(index.connectivity(), 16, 'connectivity should be 16');
55
- assert.equal(index.dimensions(), 2, 'dimensions should be 2');
56
- assert.equal(index.size(), 0, 'initial size should be 0');
54
+ assert.equal(index.connectivity(), 16, "connectivity should be 16");
55
+ assert.equal(index.dimensions(), 2, "dimensions should be 2");
56
+ assert.equal(index.size(), 0, "initial size should be 0");
57
57
  });
58
58
 
59
- await t.test('add', () => {
60
- const index = new usearch.Index(2, 'l2sq');
59
+ await t.test("add", () => {
60
+ const index = new usearch.Index(2, "l2sq");
61
61
 
62
62
  index.add(15n, new Float32Array([10, 20]));
63
63
  index.add(16n, new Float32Array([10, 25]));
64
64
 
65
- assert.equal(index.size(), 2, 'size after adding elements should be 2');
65
+ assert.equal(index.size(), 2, "size after adding elements should be 2");
66
66
  assert.equal(
67
67
  index.contains(15),
68
68
  true,
69
- 'entry must be present after insertion'
69
+ "entry must be present after insertion",
70
70
  );
71
71
 
72
72
  const results = index.search(new Float32Array([13, 14]), 2);
@@ -74,17 +74,17 @@ test('Single-entry operations', async (t) => {
74
74
  assert.deepEqual(
75
75
  results.keys,
76
76
  new BigUint64Array([15n, 16n]),
77
- 'keys should be 15 and 16'
77
+ "keys should be 15 and 16",
78
78
  );
79
79
  assert.deepEqual(
80
80
  results.distances,
81
81
  new Float32Array([45, 130]),
82
- 'distances should be 45 and 130'
82
+ "distances should be 45 and 130",
83
83
  );
84
84
  });
85
85
 
86
- await t.test('remove', () => {
87
- const index = new usearch.Index(2, 'l2sq');
86
+ await t.test("remove", () => {
87
+ const index = new usearch.Index(2, "l2sq");
88
88
 
89
89
  index.add(15n, new Float32Array([10, 20]));
90
90
  index.add(16n, new Float32Array([10, 25]));
@@ -93,11 +93,11 @@ test('Single-entry operations', async (t) => {
93
93
 
94
94
  assert.equal(index.remove(15n), 1);
95
95
 
96
- assert.equal(index.size(), 3, 'size after removing elements should be 3');
96
+ assert.equal(index.size(), 3, "size after removing elements should be 3");
97
97
  assert.equal(
98
98
  index.contains(15),
99
99
  false,
100
- 'entry must be absent after insertion'
100
+ "entry must be absent after insertion",
101
101
  );
102
102
 
103
103
  const results = index.search(new Float32Array([13, 14]), 2);
@@ -105,37 +105,37 @@ test('Single-entry operations', async (t) => {
105
105
  assert.deepEqual(
106
106
  results.keys,
107
107
  new BigUint64Array([16n, 25n]),
108
- 'keys should not include 15'
108
+ "keys should not include 15",
109
109
  );
110
110
  });
111
111
  });
112
112
 
113
- test('Batch operations', async (t) => {
114
- await t.test('add', () => {
115
- const indexBatch = new usearch.Index(2, 'l2sq');
113
+ test("Batch operations", async (t) => {
114
+ await t.test("add", () => {
115
+ const indexBatch = new usearch.Index(2, "l2sq");
116
116
 
117
117
  const keys = [15n, 16n];
118
118
  const vectors = [new Float32Array([10, 20]), new Float32Array([10, 25])];
119
119
 
120
120
  indexBatch.add(keys, vectors);
121
- assert.equal(indexBatch.size(), 2, 'size after adding batch should be 2');
121
+ assert.equal(indexBatch.size(), 2, "size after adding batch should be 2");
122
122
 
123
123
  const results = indexBatch.search(new Float32Array([13, 14]), 2);
124
124
 
125
125
  assert.deepEqual(
126
126
  results.keys,
127
127
  new BigUint64Array([15n, 16n]),
128
- 'keys should be 15 and 16'
128
+ "keys should be 15 and 16",
129
129
  );
130
130
  assert.deepEqual(
131
131
  results.distances,
132
132
  new Float32Array([45, 130]),
133
- 'distances should be 45 and 130'
133
+ "distances should be 45 and 130",
134
134
  );
135
135
  });
136
136
 
137
- await t.test('remove', () => {
138
- const indexBatch = new usearch.Index(2, 'l2sq');
137
+ await t.test("remove", () => {
138
+ const indexBatch = new usearch.Index(2, "l2sq");
139
139
 
140
140
  const keys = [15n, 16n, 25n, 26n];
141
141
  const vectors = [
@@ -147,53 +147,58 @@ test('Batch operations', async (t) => {
147
147
  indexBatch.add(keys, vectors);
148
148
 
149
149
  assert.deepEqual(indexBatch.remove([15n, 25n]), [1, 1]);
150
- assert.equal(indexBatch.size(), 2, 'size after removing batch should be 2');
150
+ assert.equal(indexBatch.size(), 2, "size after removing batch should be 2");
151
151
 
152
152
  const results = indexBatch.search(new Float32Array([13, 14]), 2);
153
153
 
154
154
  assert.deepEqual(
155
155
  results.keys,
156
156
  new BigUint64Array([16n, 26n]),
157
- 'keys should not include 15 and 25'
157
+ "keys should not include 15 and 25",
158
158
  );
159
159
  });
160
160
 
161
- await t.test('search', () => {
162
- const indexBatch = new usearch.Index(3, 'l2sq');
161
+ await t.test("search", () => {
162
+ const indexBatch = new usearch.Index(3, "l2sq");
163
163
 
164
164
  const keys = [15n, 16n];
165
- const vectors = [new Float32Array([10, 20, 30]), new Float32Array([10, 25, 35])];
165
+ const vectors = [
166
+ new Float32Array([10, 20, 30]),
167
+ new Float32Array([10, 25, 35]),
168
+ ];
166
169
 
167
170
  indexBatch.add(keys, vectors);
168
- assert.equal(indexBatch.size(), 2, 'size after adding batch should be 2');
171
+ assert.equal(indexBatch.size(), 2, "size after adding batch should be 2");
172
+
173
+ const results = indexBatch.search(
174
+ [new Float32Array([13, 14, 15]), new Float32Array([13, 14, 15])],
175
+ 2,
176
+ );
169
177
 
170
- const results = indexBatch.search([new Float32Array([13, 14, 15]), new Float32Array([13, 14, 15])], 2);
171
-
172
- assert.equal(results.k, 2, 'k should be 2');
178
+ assert.equal(results.k, 2, "k should be 2");
173
179
 
174
180
  assert.deepEqual(
175
181
  results.counts,
176
- new BigUint64Array([ 2n, 2n ]) ,
177
- 'counts should be 2 for both keys'
182
+ new BigUint64Array([2n, 2n]),
183
+ "counts should be 2 for both keys",
178
184
  );
179
185
 
180
186
  assert.deepEqual(
181
187
  results.keys,
182
188
  new BigUint64Array([15n, 16n, 15n, 16n]),
183
- 'keys should be 15 and 16'
189
+ "keys should be 15 and 16",
184
190
  );
185
191
  assert.deepEqual(
186
192
  results.distances,
187
- new Float32Array( [ 270, 530, 270, 530 ]),
188
- 'distances should be 270 and 530'
193
+ new Float32Array([270, 530, 270, 530]),
194
+ "distances should be 270 and 530",
189
195
  );
190
196
  });
191
-
192
197
  });
193
198
 
194
- test('Expected results', () => {
199
+ test("Expected results", () => {
195
200
  const index = new usearch.Index({
196
- metric: 'l2sq',
201
+ metric: "l2sq",
197
202
  connectivity: 16,
198
203
  dimensions: 3,
199
204
  });
@@ -205,9 +210,9 @@ test('Expected results', () => {
205
210
  assertAlmostEqual(results.distances[0], new Float32Array([0]));
206
211
  });
207
212
 
208
- test('Multithread search returns same results', () => {
213
+ test("Multithread search returns same results", () => {
209
214
  const index = new usearch.Index({
210
- metric: 'l2sq',
215
+ metric: "l2sq",
211
216
  connectivity: 16,
212
217
  dimensions: 3,
213
218
  });
@@ -218,14 +223,14 @@ test('Multithread search returns same results', () => {
218
223
  const results_2 = index.search(
219
224
  new Float32Array([0.2, 0.6, 0.4]),
220
225
  10,
221
- THREADS
226
+ THREADS,
222
227
  );
223
228
 
224
229
  assert.deepEqual(results_1.keys, results_2.keys);
225
230
  assertAlmostEqual(results_1.distances, results_2.distances);
226
231
  });
227
232
 
228
- test('Exact search', async (t) => {
233
+ test("Exact search", async (t) => {
229
234
  const dataset = [
230
235
  new Float32Array([0.2, 0.6, 0.4]),
231
236
  new Float32Array([0.6, 0.6, 0.4]),
@@ -233,16 +238,16 @@ test('Exact search', async (t) => {
233
238
  const queries = new Float32Array([0.2, 0.6, 0.4]);
234
239
  const dimensions = 3;
235
240
  const count = 2;
236
- const metric = 'l2sq';
241
+ const metric = "l2sq";
237
242
 
238
- await t.test('Single core search', () => {
243
+ await t.test("Single core search", () => {
239
244
  const result = usearch.exactSearch(
240
245
  dataset,
241
246
  queries,
242
247
  dimensions,
243
248
  count,
244
249
  metric,
245
- 1 // threads
250
+ 1, // threads
246
251
  );
247
252
 
248
253
  assert.deepEqual(result.keys, new BigUint64Array([0n, 1n]));
@@ -250,14 +255,14 @@ test('Exact search', async (t) => {
250
255
  assertAlmostEqual(new Float32Array([0.16]), result.distances[1]);
251
256
  });
252
257
 
253
- await t.test('Multithreaded search', () => {
258
+ await t.test("Multithreaded search", () => {
254
259
  const result = usearch.exactSearch(
255
260
  dataset,
256
261
  queries,
257
262
  dimensions,
258
263
  count,
259
264
  metric,
260
- THREADS // threads
265
+ THREADS, // threads
261
266
  );
262
267
 
263
268
  assert.deepEqual(result.keys, new BigUint64Array([0n, 1n]));
@@ -266,30 +271,30 @@ test('Exact search', async (t) => {
266
271
  });
267
272
  });
268
273
 
269
- test('Expected count()', async (t) => {
274
+ test("Expected count()", async (t) => {
270
275
  const index = new usearch.Index({
271
- metric: 'l2sq',
276
+ metric: "l2sq",
272
277
  connectivity: 16,
273
278
  dimensions: 3,
274
279
  });
275
280
  index.add(
276
281
  [42n, 43n],
277
- [new Float32Array([0.2, 0.6, 0.4]), new Float32Array([0.2, 0.6, 0.4])]
282
+ [new Float32Array([0.2, 0.6, 0.4]), new Float32Array([0.2, 0.6, 0.4])],
278
283
  );
279
284
 
280
- await t.test('Argument is a number', () => {
285
+ await t.test("Argument is a number", () => {
281
286
  assert.equal(1, index.count(43n));
282
287
  });
283
- await t.test('Argument is a number (does not exist)', () => {
288
+ await t.test("Argument is a number (does not exist)", () => {
284
289
  assert.equal(0, index.count(44n));
285
290
  });
286
- await t.test('Argument is an array', () => {
291
+ await t.test("Argument is an array", () => {
287
292
  assert.deepEqual([1, 1, 0], index.count([42n, 43n, 44n]));
288
293
  });
289
294
  });
290
295
 
291
- test('Operations with invalid values', () => {
292
- const indexBatch = new usearch.Index(2, 'l2sq');
296
+ test("Operations with invalid values", () => {
297
+ const indexBatch = new usearch.Index(2, "l2sq");
293
298
 
294
299
  const keys = [NaN, 16n];
295
300
  const vectors = [new Float32Array([10, 30]), new Float32Array([1, 5])];
@@ -301,10 +306,10 @@ test('Operations with invalid values', () => {
301
306
  assert.throws(() => indexBatch.search(NaN, 2));
302
307
  });
303
308
 
304
- test('Invalid operations', async (t) => {
305
- await t.test('Add the same keys', () => {
309
+ test("Invalid operations", async (t) => {
310
+ await t.test("Add the same keys", () => {
306
311
  const index = new usearch.Index({
307
- metric: 'l2sq',
312
+ metric: "l2sq",
308
313
  connectivity: 16,
309
314
  dimensions: 3,
310
315
  });
@@ -312,9 +317,9 @@ test('Invalid operations', async (t) => {
312
317
  assert.throws(() => index.add(42n, new Float32Array([0.2, 0.6, 0.4])));
313
318
  });
314
319
 
315
- await t.test('Batch add containing the same key', () => {
320
+ await t.test("Batch add containing the same key", () => {
316
321
  const index = new usearch.Index({
317
- metric: 'l2sq',
322
+ metric: "l2sq",
318
323
  connectivity: 16,
319
324
  dimensions: 3,
320
325
  });
@@ -326,18 +331,18 @@ test('Invalid operations', async (t) => {
326
331
  [0.1, 0.6, 0.4],
327
332
  [0.2, 0.6, 0.4],
328
333
  [0.3, 0.6, 0.4],
329
- ]
334
+ ],
330
335
  );
331
336
  });
332
337
  });
333
338
  });
334
339
 
335
- test('Serialization', async (t) => {
336
- const indexPath = path.join(os.tmpdir(), 'usearch.test.index');
340
+ test("Serialization", async (t) => {
341
+ const indexPath = path.join(os.tmpdir(), "usearch.test.index");
337
342
 
338
343
  t.beforeEach(() => {
339
344
  const index = new usearch.Index({
340
- metric: 'l2sq',
345
+ metric: "l2sq",
341
346
  connectivity: 16,
342
347
  dimensions: 3,
343
348
  });
@@ -349,9 +354,9 @@ test('Serialization', async (t) => {
349
354
  fs.unlinkSync(indexPath);
350
355
  });
351
356
 
352
- await t.test('load', () => {
357
+ await t.test("load", () => {
353
358
  const index = new usearch.Index({
354
- metric: 'l2sq',
359
+ metric: "l2sq",
355
360
  connectivity: 16,
356
361
  dimensions: 3,
357
362
  });
@@ -359,7 +364,7 @@ test('Serialization', async (t) => {
359
364
  const results = index.search(
360
365
  new Float32Array([0.2, 0.6, 0.4]),
361
366
  10,
362
- THREADS
367
+ THREADS,
363
368
  );
364
369
 
365
370
  assert.equal(index.size(), 1);
@@ -371,11 +376,11 @@ test('Serialization', async (t) => {
371
376
  // The following error in afterEach().
372
377
  // `error: "EBUSY: resource busy or locked, unlink`
373
378
  await t.test(
374
- 'view: Read data',
375
- { skip: process.platform === 'win32' },
379
+ "view: Read data",
380
+ { skip: process.platform === "win32" },
376
381
  () => {
377
382
  const index = new usearch.Index({
378
- metric: 'l2sq',
383
+ metric: "l2sq",
379
384
  connectivity: 16,
380
385
  dimensions: 3,
381
386
  });
@@ -385,15 +390,15 @@ test('Serialization', async (t) => {
385
390
  assert.equal(index.size(), 1);
386
391
  assert.deepEqual(results.keys, new BigUint64Array([42n]));
387
392
  assertAlmostEqual(results.distances[0], new Float32Array([0]));
388
- }
393
+ },
389
394
  );
390
395
 
391
396
  await t.test(
392
- 'view: Invalid operations: add',
393
- { skip: process.platform === 'win32' },
397
+ "view: Invalid operations: add",
398
+ { skip: process.platform === "win32" },
394
399
  () => {
395
400
  const index = new usearch.Index({
396
- metric: 'l2sq',
401
+ metric: "l2sq",
397
402
  connectivity: 16,
398
403
  dimensions: 3,
399
404
  });
@@ -401,15 +406,15 @@ test('Serialization', async (t) => {
401
406
 
402
407
  // Can't add to an immutable index
403
408
  assert.throws(() => index.add(43n, new Float32Array([0.2, 0.6, 0.4])));
404
- }
409
+ },
405
410
  );
406
411
 
407
412
  await t.test(
408
- 'view: Invalid operations: remove',
409
- { skip: process.platform === 'win32' },
413
+ "view: Invalid operations: remove",
414
+ { skip: process.platform === "win32" },
410
415
  () => {
411
416
  const index = new usearch.Index({
412
- metric: 'l2sq',
417
+ metric: "l2sq",
413
418
  connectivity: 16,
414
419
  dimensions: 3,
415
420
  });
@@ -417,6 +422,24 @@ test('Serialization', async (t) => {
417
422
 
418
423
  // Can't remove from an immutable index
419
424
  assert.throws(() => index.remove(42n));
420
- }
425
+ },
421
426
  );
422
427
  });
428
+
429
+ test("Mini-float quantization types", async (t) => {
430
+ for (const quantization of ["e5m2", "e4m3", "e3m2", "e2m3"]) {
431
+ await t.test(`add and search with ${quantization}`, () => {
432
+ const index = new usearch.Index({
433
+ metric: "cos",
434
+ dimensions: 64,
435
+ quantization: quantization,
436
+ });
437
+ const vector = new Float32Array(64);
438
+ for (let i = 0; i < 64; i++) vector[i] = i * 0.1;
439
+ index.add(1n, vector);
440
+
441
+ const results = index.search(vector, 1);
442
+ assert.equal(results.keys[0], 1n);
443
+ });
444
+ }
445
+ });