usearch 2.21.3 → 2.25.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (602) hide show
  1. package/README.md +24 -24
  2. package/binding.gyp +15 -37
  3. package/c/CMakeLists.txt +4 -5
  4. package/c/README.md +7 -7
  5. package/c/lib.cpp +32 -14
  6. package/c/test.c +83 -1
  7. package/c/usearch.h +24 -3
  8. package/cpp/CMakeLists.txt +4 -0
  9. package/cpp/README.md +5 -5
  10. package/cpp/bench.cpp +97 -116
  11. package/cpp/test.cpp +117 -20
  12. package/include/usearch/index.hpp +235 -52
  13. package/include/usearch/index_dense.hpp +105 -40
  14. package/include/usearch/index_plugins.hpp +1387 -204
  15. package/javascript/dist/cjs/usearch.d.ts +8 -3
  16. package/javascript/dist/cjs/usearch.js +12 -4
  17. package/javascript/dist/esm/usearch.d.ts +8 -3
  18. package/javascript/dist/esm/usearch.js +12 -4
  19. package/javascript/lib.cpp +17 -0
  20. package/javascript/usearch.ts +14 -6
  21. package/numkong/.clang-tidy +30 -0
  22. package/{simsimd → numkong}/.cmake-format.py +18 -0
  23. package/numkong/.editorconfig +12 -0
  24. package/numkong/.git-blame-ignore-revs +123 -0
  25. package/numkong/.mailmap +15 -0
  26. package/numkong/.spi.yml +11 -0
  27. package/numkong/.swift-format +14 -0
  28. package/numkong/CITATION.cff +81 -0
  29. package/numkong/CONTRIBUTING.md +500 -0
  30. package/numkong/Cargo.toml +54 -0
  31. package/numkong/MANIFEST.in +8 -0
  32. package/numkong/Package.swift +84 -0
  33. package/numkong/README.md +569 -0
  34. package/numkong/bench/README.md +217 -0
  35. package/numkong/bench/bench-browser.html +323 -0
  36. package/numkong/bench/bench.cpp +344 -0
  37. package/numkong/bench/bench.hpp +816 -0
  38. package/numkong/bench/bench.js +148 -0
  39. package/numkong/bench/bench.mjs +616 -0
  40. package/numkong/bench/bench_attention.cpp +113 -0
  41. package/numkong/bench/bench_cast.cpp +264 -0
  42. package/numkong/bench/bench_cross_amx.cpp +62 -0
  43. package/numkong/bench/bench_cross_arm.cpp +245 -0
  44. package/numkong/bench/bench_cross_blas.cpp +309 -0
  45. package/numkong/bench/bench_cross_loongarch.cpp +106 -0
  46. package/numkong/bench/bench_cross_power.cpp +84 -0
  47. package/numkong/bench/bench_cross_rvv.cpp +121 -0
  48. package/numkong/bench/bench_cross_serial.cpp +151 -0
  49. package/numkong/bench/bench_cross_sme.cpp +163 -0
  50. package/numkong/bench/bench_cross_wasm.cpp +142 -0
  51. package/numkong/bench/bench_cross_x86.cpp +455 -0
  52. package/numkong/bench/bench_curved.cpp +210 -0
  53. package/numkong/bench/bench_dot.cpp +315 -0
  54. package/numkong/bench/bench_each.cpp +503 -0
  55. package/numkong/bench/bench_geospatial.cpp +112 -0
  56. package/numkong/bench/bench_maxsim.cpp +154 -0
  57. package/numkong/bench/bench_mesh.cpp +148 -0
  58. package/numkong/bench/bench_probability.cpp +60 -0
  59. package/numkong/bench/bench_reduce.cpp +371 -0
  60. package/numkong/bench/bench_set.cpp +73 -0
  61. package/numkong/bench/bench_sparse.cpp +198 -0
  62. package/numkong/bench/bench_spatial.cpp +347 -0
  63. package/numkong/bench/bench_trigonometry.cpp +137 -0
  64. package/numkong/bench/swift/Bench.swift +506 -0
  65. package/numkong/binding.gyp +169 -0
  66. package/numkong/build.rs +484 -0
  67. package/numkong/c/dispatch.h +512 -0
  68. package/numkong/c/dispatch_bf16.c +447 -0
  69. package/numkong/c/dispatch_bf16c.c +52 -0
  70. package/numkong/c/dispatch_e2m3.c +296 -0
  71. package/numkong/c/dispatch_e3m2.c +284 -0
  72. package/numkong/c/dispatch_e4m3.c +318 -0
  73. package/numkong/c/dispatch_e5m2.c +316 -0
  74. package/numkong/c/dispatch_f16.c +452 -0
  75. package/numkong/c/dispatch_f16c.c +58 -0
  76. package/numkong/c/dispatch_f32.c +434 -0
  77. package/numkong/c/dispatch_f32c.c +99 -0
  78. package/numkong/c/dispatch_f64.c +348 -0
  79. package/numkong/c/dispatch_f64c.c +98 -0
  80. package/numkong/c/dispatch_i16.c +96 -0
  81. package/numkong/c/dispatch_i32.c +89 -0
  82. package/numkong/c/dispatch_i4.c +153 -0
  83. package/numkong/c/dispatch_i64.c +86 -0
  84. package/numkong/c/dispatch_i8.c +348 -0
  85. package/numkong/c/dispatch_other.c +348 -0
  86. package/numkong/c/dispatch_u1.c +193 -0
  87. package/numkong/c/dispatch_u16.c +124 -0
  88. package/numkong/c/dispatch_u32.c +118 -0
  89. package/numkong/c/dispatch_u4.c +153 -0
  90. package/numkong/c/dispatch_u64.c +102 -0
  91. package/numkong/c/dispatch_u8.c +364 -0
  92. package/numkong/c/numkong.c +940 -0
  93. package/numkong/cmake/nk_arm_isa_probes.cmake +61 -0
  94. package/numkong/cmake/nk_isa_probe.cmake +90 -0
  95. package/numkong/cmake/nk_loongarch_isa_probes.cmake +15 -0
  96. package/numkong/cmake/nk_math_lib.cmake +46 -0
  97. package/numkong/cmake/nk_power_isa_probes.cmake +15 -0
  98. package/numkong/cmake/nk_riscv_isa_probes.cmake +19 -0
  99. package/numkong/cmake/nk_x86_isa_probes.cmake +35 -0
  100. package/numkong/cmake/toolchain-aarch64-gnu.cmake +86 -0
  101. package/numkong/cmake/toolchain-android-arm64.cmake +25 -0
  102. package/numkong/cmake/toolchain-android-armv7.cmake +25 -0
  103. package/numkong/cmake/toolchain-loongarch64-gnu.cmake +68 -0
  104. package/numkong/cmake/toolchain-ppc64le-gnu.cmake +74 -0
  105. package/numkong/cmake/toolchain-riscv64-gnu.cmake +107 -0
  106. package/numkong/cmake/toolchain-riscv64-llvm.cmake +114 -0
  107. package/numkong/cmake/toolchain-wasi.cmake +77 -0
  108. package/numkong/cmake/toolchain-wasm.cmake +70 -0
  109. package/numkong/cmake/toolchain-wasm64.cmake +62 -0
  110. package/numkong/cmake/toolchain-x86_64-llvm.cmake +47 -0
  111. package/numkong/include/README.md +643 -0
  112. package/numkong/include/module.modulemap +129 -0
  113. package/numkong/include/numkong/attention/sapphireamx.h +1363 -0
  114. package/numkong/include/numkong/attention/sme.h +2075 -0
  115. package/numkong/include/numkong/attention.h +49 -0
  116. package/numkong/include/numkong/capabilities.h +930 -0
  117. package/numkong/include/numkong/cast/README.md +262 -0
  118. package/numkong/include/numkong/cast/diamond.h +64 -0
  119. package/numkong/include/numkong/cast/haswell.h +823 -0
  120. package/numkong/include/numkong/cast/icelake.h +475 -0
  121. package/numkong/include/numkong/cast/loongsonasx.h +252 -0
  122. package/numkong/include/numkong/cast/neon.h +1174 -0
  123. package/numkong/include/numkong/cast/powervsx.h +449 -0
  124. package/numkong/include/numkong/cast/rvv.h +970 -0
  125. package/numkong/include/numkong/cast/sapphire.h +262 -0
  126. package/numkong/include/numkong/cast/serial.h +2336 -0
  127. package/numkong/include/numkong/cast/skylake.h +915 -0
  128. package/numkong/include/numkong/cast/v128relaxed.h +537 -0
  129. package/numkong/include/numkong/cast.h +254 -0
  130. package/numkong/include/numkong/cast.hpp +44 -0
  131. package/numkong/include/numkong/curved/README.md +223 -0
  132. package/numkong/include/numkong/curved/genoa.h +182 -0
  133. package/numkong/include/numkong/curved/haswell.h +276 -0
  134. package/numkong/include/numkong/curved/neon.h +329 -0
  135. package/numkong/include/numkong/curved/neonbfdot.h +211 -0
  136. package/numkong/include/numkong/curved/rvv.h +305 -0
  137. package/numkong/include/numkong/curved/serial.h +207 -0
  138. package/numkong/include/numkong/curved/skylake.h +457 -0
  139. package/numkong/include/numkong/curved/smef64.h +530 -0
  140. package/numkong/include/numkong/curved.h +513 -0
  141. package/numkong/include/numkong/curved.hpp +144 -0
  142. package/numkong/include/numkong/dot/README.md +442 -0
  143. package/numkong/include/numkong/dot/alder.h +563 -0
  144. package/numkong/include/numkong/dot/diamond.h +158 -0
  145. package/numkong/include/numkong/dot/genoa.h +289 -0
  146. package/numkong/include/numkong/dot/haswell.h +1723 -0
  147. package/numkong/include/numkong/dot/icelake.h +997 -0
  148. package/numkong/include/numkong/dot/loongsonasx.h +671 -0
  149. package/numkong/include/numkong/dot/neon.h +869 -0
  150. package/numkong/include/numkong/dot/neonbfdot.h +243 -0
  151. package/numkong/include/numkong/dot/neonfhm.h +358 -0
  152. package/numkong/include/numkong/dot/neonfp8.h +323 -0
  153. package/numkong/include/numkong/dot/neonsdot.h +622 -0
  154. package/numkong/include/numkong/dot/powervsx.h +752 -0
  155. package/numkong/include/numkong/dot/rvv.h +722 -0
  156. package/numkong/include/numkong/dot/rvvbb.h +72 -0
  157. package/numkong/include/numkong/dot/rvvbf16.h +123 -0
  158. package/numkong/include/numkong/dot/rvvhalf.h +129 -0
  159. package/numkong/include/numkong/dot/sapphire.h +141 -0
  160. package/numkong/include/numkong/dot/serial.h +874 -0
  161. package/numkong/include/numkong/dot/sierra.h +405 -0
  162. package/numkong/include/numkong/dot/skylake.h +1116 -0
  163. package/numkong/include/numkong/dot/sve.h +420 -0
  164. package/numkong/include/numkong/dot/svebfdot.h +75 -0
  165. package/numkong/include/numkong/dot/svehalf.h +168 -0
  166. package/numkong/include/numkong/dot/svesdot.h +90 -0
  167. package/numkong/include/numkong/dot/v128relaxed.h +1293 -0
  168. package/numkong/include/numkong/dot.h +1136 -0
  169. package/numkong/include/numkong/dot.hpp +94 -0
  170. package/numkong/include/numkong/dots/README.md +496 -0
  171. package/numkong/include/numkong/dots/alder.h +117 -0
  172. package/numkong/include/numkong/dots/diamond.h +86 -0
  173. package/numkong/include/numkong/dots/genoa.h +100 -0
  174. package/numkong/include/numkong/dots/graniteamx.h +733 -0
  175. package/numkong/include/numkong/dots/haswell.h +310 -0
  176. package/numkong/include/numkong/dots/icelake.h +180 -0
  177. package/numkong/include/numkong/dots/loongsonasx.h +176 -0
  178. package/numkong/include/numkong/dots/neon.h +123 -0
  179. package/numkong/include/numkong/dots/neonbfdot.h +59 -0
  180. package/numkong/include/numkong/dots/neonfhm.h +96 -0
  181. package/numkong/include/numkong/dots/neonfp8.h +99 -0
  182. package/numkong/include/numkong/dots/neonsdot.h +144 -0
  183. package/numkong/include/numkong/dots/powervsx.h +194 -0
  184. package/numkong/include/numkong/dots/rvv.h +2593 -0
  185. package/numkong/include/numkong/dots/sapphireamx.h +4017 -0
  186. package/numkong/include/numkong/dots/serial.h +2867 -0
  187. package/numkong/include/numkong/dots/sierra.h +100 -0
  188. package/numkong/include/numkong/dots/skylake.h +207 -0
  189. package/numkong/include/numkong/dots/sme.h +5041 -0
  190. package/numkong/include/numkong/dots/smebi32.h +477 -0
  191. package/numkong/include/numkong/dots/smef64.h +1328 -0
  192. package/numkong/include/numkong/dots/smehalf.h +47 -0
  193. package/numkong/include/numkong/dots/v128relaxed.h +317 -0
  194. package/numkong/include/numkong/dots.h +3110 -0
  195. package/numkong/include/numkong/dots.hpp +641 -0
  196. package/numkong/include/numkong/each/README.md +465 -0
  197. package/numkong/include/numkong/each/haswell.h +1658 -0
  198. package/numkong/include/numkong/each/icelake.h +272 -0
  199. package/numkong/include/numkong/each/neon.h +1138 -0
  200. package/numkong/include/numkong/each/neonbfdot.h +211 -0
  201. package/numkong/include/numkong/each/neonhalf.h +318 -0
  202. package/numkong/include/numkong/each/rvv.h +1121 -0
  203. package/numkong/include/numkong/each/sapphire.h +343 -0
  204. package/numkong/include/numkong/each/serial.h +282 -0
  205. package/numkong/include/numkong/each/skylake.h +1562 -0
  206. package/numkong/include/numkong/each/v128relaxed.h +562 -0
  207. package/numkong/include/numkong/each.h +2232 -0
  208. package/numkong/include/numkong/each.hpp +434 -0
  209. package/numkong/include/numkong/geospatial/README.md +147 -0
  210. package/numkong/include/numkong/geospatial/haswell.h +633 -0
  211. package/numkong/include/numkong/geospatial/neon.h +615 -0
  212. package/numkong/include/numkong/geospatial/rvv.h +701 -0
  213. package/numkong/include/numkong/geospatial/serial.h +309 -0
  214. package/numkong/include/numkong/geospatial/skylake.h +613 -0
  215. package/numkong/include/numkong/geospatial/v128relaxed.h +652 -0
  216. package/numkong/include/numkong/geospatial.h +453 -0
  217. package/numkong/include/numkong/geospatial.hpp +235 -0
  218. package/numkong/include/numkong/matrix.hpp +336 -0
  219. package/numkong/include/numkong/maxsim/README.md +187 -0
  220. package/numkong/include/numkong/maxsim/alder.h +511 -0
  221. package/numkong/include/numkong/maxsim/genoa.h +115 -0
  222. package/numkong/include/numkong/maxsim/haswell.h +553 -0
  223. package/numkong/include/numkong/maxsim/icelake.h +480 -0
  224. package/numkong/include/numkong/maxsim/neonsdot.h +394 -0
  225. package/numkong/include/numkong/maxsim/sapphireamx.h +877 -0
  226. package/numkong/include/numkong/maxsim/serial.h +490 -0
  227. package/numkong/include/numkong/maxsim/sme.h +993 -0
  228. package/numkong/include/numkong/maxsim/v128relaxed.h +280 -0
  229. package/numkong/include/numkong/maxsim.h +571 -0
  230. package/numkong/include/numkong/maxsim.hpp +133 -0
  231. package/numkong/include/numkong/mesh/README.md +219 -0
  232. package/numkong/include/numkong/mesh/haswell.h +2013 -0
  233. package/numkong/include/numkong/mesh/neon.h +1821 -0
  234. package/numkong/include/numkong/mesh/neonbfdot.h +771 -0
  235. package/numkong/include/numkong/mesh/rvv.h +936 -0
  236. package/numkong/include/numkong/mesh/serial.h +721 -0
  237. package/numkong/include/numkong/mesh/skylake.h +2344 -0
  238. package/numkong/include/numkong/mesh/v128relaxed.h +1081 -0
  239. package/numkong/include/numkong/mesh.h +666 -0
  240. package/numkong/include/numkong/mesh.hpp +701 -0
  241. package/numkong/include/numkong/numkong.h +78 -0
  242. package/numkong/include/numkong/numkong.hpp +58 -0
  243. package/numkong/include/numkong/probability/README.md +177 -0
  244. package/numkong/include/numkong/probability/haswell.h +267 -0
  245. package/numkong/include/numkong/probability/neon.h +255 -0
  246. package/numkong/include/numkong/probability/rvv.h +414 -0
  247. package/numkong/include/numkong/probability/serial.h +181 -0
  248. package/numkong/include/numkong/probability/skylake.h +324 -0
  249. package/numkong/include/numkong/probability.h +380 -0
  250. package/numkong/include/numkong/probability.hpp +120 -0
  251. package/numkong/include/numkong/random.h +50 -0
  252. package/numkong/include/numkong/random.hpp +285 -0
  253. package/numkong/include/numkong/reduce/README.md +552 -0
  254. package/numkong/include/numkong/reduce/alder.h +636 -0
  255. package/numkong/include/numkong/reduce/genoa.h +201 -0
  256. package/numkong/include/numkong/reduce/haswell.h +3785 -0
  257. package/numkong/include/numkong/reduce/icelake.h +549 -0
  258. package/numkong/include/numkong/reduce/neon.h +3980 -0
  259. package/numkong/include/numkong/reduce/neonbfdot.h +142 -0
  260. package/numkong/include/numkong/reduce/neonfhm.h +293 -0
  261. package/numkong/include/numkong/reduce/neonsdot.h +357 -0
  262. package/numkong/include/numkong/reduce/rvv.h +3533 -0
  263. package/numkong/include/numkong/reduce/serial.h +753 -0
  264. package/numkong/include/numkong/reduce/sierra.h +338 -0
  265. package/numkong/include/numkong/reduce/skylake.h +3794 -0
  266. package/numkong/include/numkong/reduce/sve.h +52 -0
  267. package/numkong/include/numkong/reduce/v128relaxed.h +2302 -0
  268. package/numkong/include/numkong/reduce.h +1582 -0
  269. package/numkong/include/numkong/reduce.hpp +778 -0
  270. package/numkong/include/numkong/scalar/README.md +89 -0
  271. package/numkong/include/numkong/scalar/haswell.h +122 -0
  272. package/numkong/include/numkong/scalar/loongsonasx.h +74 -0
  273. package/numkong/include/numkong/scalar/neon.h +122 -0
  274. package/numkong/include/numkong/scalar/neonhalf.h +70 -0
  275. package/numkong/include/numkong/scalar/powervsx.h +96 -0
  276. package/numkong/include/numkong/scalar/rvv.h +211 -0
  277. package/numkong/include/numkong/scalar/sapphire.h +74 -0
  278. package/numkong/include/numkong/scalar/serial.h +332 -0
  279. package/numkong/include/numkong/scalar/v128relaxed.h +56 -0
  280. package/numkong/include/numkong/scalar.h +696 -0
  281. package/numkong/include/numkong/set/README.md +179 -0
  282. package/numkong/include/numkong/set/haswell.h +334 -0
  283. package/numkong/include/numkong/set/icelake.h +485 -0
  284. package/numkong/include/numkong/set/loongsonasx.h +181 -0
  285. package/numkong/include/numkong/set/neon.h +363 -0
  286. package/numkong/include/numkong/set/powervsx.h +326 -0
  287. package/numkong/include/numkong/set/rvv.h +226 -0
  288. package/numkong/include/numkong/set/rvvbb.h +117 -0
  289. package/numkong/include/numkong/set/serial.h +174 -0
  290. package/numkong/include/numkong/set/sve.h +187 -0
  291. package/numkong/include/numkong/set/v128relaxed.h +240 -0
  292. package/numkong/include/numkong/set.h +471 -0
  293. package/numkong/include/numkong/set.hpp +114 -0
  294. package/numkong/include/numkong/sets/README.md +149 -0
  295. package/numkong/include/numkong/sets/haswell.h +63 -0
  296. package/numkong/include/numkong/sets/icelake.h +66 -0
  297. package/numkong/include/numkong/sets/loongsonasx.h +52 -0
  298. package/numkong/include/numkong/sets/neon.h +61 -0
  299. package/numkong/include/numkong/sets/powervsx.h +65 -0
  300. package/numkong/include/numkong/sets/serial.h +43 -0
  301. package/numkong/include/numkong/sets/smebi32.h +1135 -0
  302. package/numkong/include/numkong/sets/v128relaxed.h +58 -0
  303. package/numkong/include/numkong/sets.h +382 -0
  304. package/numkong/include/numkong/sparse/README.md +156 -0
  305. package/numkong/include/numkong/sparse/icelake.h +463 -0
  306. package/numkong/include/numkong/sparse/neon.h +288 -0
  307. package/numkong/include/numkong/sparse/serial.h +117 -0
  308. package/numkong/include/numkong/sparse/sve2.h +504 -0
  309. package/numkong/include/numkong/sparse/turin.h +322 -0
  310. package/numkong/include/numkong/sparse.h +363 -0
  311. package/numkong/include/numkong/sparse.hpp +113 -0
  312. package/numkong/include/numkong/spatial/README.md +439 -0
  313. package/numkong/include/numkong/spatial/alder.h +604 -0
  314. package/numkong/include/numkong/spatial/diamond.h +240 -0
  315. package/numkong/include/numkong/spatial/genoa.h +222 -0
  316. package/numkong/include/numkong/spatial/haswell.h +979 -0
  317. package/numkong/include/numkong/spatial/icelake.h +1067 -0
  318. package/numkong/include/numkong/spatial/loongsonasx.h +483 -0
  319. package/numkong/include/numkong/spatial/neon.h +846 -0
  320. package/numkong/include/numkong/spatial/neonbfdot.h +164 -0
  321. package/numkong/include/numkong/spatial/neonfp8.h +258 -0
  322. package/numkong/include/numkong/spatial/neonsdot.h +429 -0
  323. package/numkong/include/numkong/spatial/powervsx.h +738 -0
  324. package/numkong/include/numkong/spatial/rvv.h +991 -0
  325. package/numkong/include/numkong/spatial/rvvbf16.h +128 -0
  326. package/numkong/include/numkong/spatial/rvvhalf.h +120 -0
  327. package/numkong/include/numkong/spatial/serial.h +347 -0
  328. package/numkong/include/numkong/spatial/sierra.h +516 -0
  329. package/numkong/include/numkong/spatial/skylake.h +605 -0
  330. package/numkong/include/numkong/spatial/sve.h +246 -0
  331. package/numkong/include/numkong/spatial/svebfdot.h +125 -0
  332. package/numkong/include/numkong/spatial/svehalf.h +136 -0
  333. package/numkong/include/numkong/spatial/svesdot.h +143 -0
  334. package/numkong/include/numkong/spatial/v128relaxed.h +969 -0
  335. package/numkong/include/numkong/spatial.h +1681 -0
  336. package/numkong/include/numkong/spatial.hpp +183 -0
  337. package/numkong/include/numkong/spatials/README.md +580 -0
  338. package/numkong/include/numkong/spatials/alder.h +94 -0
  339. package/numkong/include/numkong/spatials/diamond.h +82 -0
  340. package/numkong/include/numkong/spatials/genoa.h +94 -0
  341. package/numkong/include/numkong/spatials/graniteamx.h +173 -0
  342. package/numkong/include/numkong/spatials/haswell.h +219 -0
  343. package/numkong/include/numkong/spatials/icelake.h +113 -0
  344. package/numkong/include/numkong/spatials/loongsonasx.h +153 -0
  345. package/numkong/include/numkong/spatials/neon.h +109 -0
  346. package/numkong/include/numkong/spatials/neonbfdot.h +60 -0
  347. package/numkong/include/numkong/spatials/neonfhm.h +92 -0
  348. package/numkong/include/numkong/spatials/neonfp8.h +111 -0
  349. package/numkong/include/numkong/spatials/neonsdot.h +143 -0
  350. package/numkong/include/numkong/spatials/powervsx.h +153 -0
  351. package/numkong/include/numkong/spatials/rvv.h +1976 -0
  352. package/numkong/include/numkong/spatials/sapphireamx.h +1149 -0
  353. package/numkong/include/numkong/spatials/serial.h +248 -0
  354. package/numkong/include/numkong/spatials/sierra.h +96 -0
  355. package/numkong/include/numkong/spatials/skylake.h +184 -0
  356. package/numkong/include/numkong/spatials/sme.h +1927 -0
  357. package/numkong/include/numkong/spatials/smef64.h +483 -0
  358. package/numkong/include/numkong/spatials/v128relaxed.h +240 -0
  359. package/numkong/include/numkong/spatials.h +3374 -0
  360. package/numkong/include/numkong/spatials.hpp +509 -0
  361. package/numkong/include/numkong/tensor.hpp +1981 -0
  362. package/numkong/include/numkong/trigonometry/README.md +184 -0
  363. package/numkong/include/numkong/trigonometry/haswell.h +653 -0
  364. package/numkong/include/numkong/trigonometry/neon.h +638 -0
  365. package/numkong/include/numkong/trigonometry/rvv.h +700 -0
  366. package/numkong/include/numkong/trigonometry/serial.h +703 -0
  367. package/numkong/include/numkong/trigonometry/skylake.h +725 -0
  368. package/numkong/include/numkong/trigonometry/v128relaxed.h +667 -0
  369. package/numkong/include/numkong/trigonometry.h +467 -0
  370. package/numkong/include/numkong/trigonometry.hpp +166 -0
  371. package/numkong/include/numkong/types.h +1695 -0
  372. package/numkong/include/numkong/types.hpp +6027 -0
  373. package/numkong/include/numkong/vector.hpp +766 -0
  374. package/numkong/javascript/@numkong-darwin-arm64/package.json +26 -0
  375. package/numkong/javascript/@numkong-darwin-x64/package.json +26 -0
  376. package/numkong/javascript/@numkong-linux-arm64/package.json +25 -0
  377. package/numkong/javascript/@numkong-linux-x64/package.json +25 -0
  378. package/numkong/javascript/@numkong-win32-arm64/package.json +25 -0
  379. package/numkong/javascript/@numkong-win32-x64/package.json +25 -0
  380. package/numkong/javascript/README.md +254 -0
  381. package/numkong/javascript/node-gyp-build.d.ts +4 -0
  382. package/numkong/javascript/numkong-browser.ts +40 -0
  383. package/numkong/javascript/numkong-wasm.ts +750 -0
  384. package/numkong/javascript/numkong.c +712 -0
  385. package/numkong/javascript/numkong.ts +613 -0
  386. package/{simsimd → numkong}/javascript/tsconfig-base.json +6 -3
  387. package/numkong/javascript/tsconfig-cjs.json +13 -0
  388. package/{simsimd → numkong}/javascript/tsconfig-esm.json +1 -1
  389. package/numkong/javascript/types.ts +784 -0
  390. package/numkong/numkong.gypi +104 -0
  391. package/numkong/package.json +108 -0
  392. package/numkong/probes/arm_neon.c +8 -0
  393. package/numkong/probes/arm_neon_bfdot.c +9 -0
  394. package/numkong/probes/arm_neon_fhm.c +9 -0
  395. package/numkong/probes/arm_neon_half.c +8 -0
  396. package/numkong/probes/arm_neon_sdot.c +9 -0
  397. package/numkong/probes/arm_neonfp8.c +9 -0
  398. package/numkong/probes/arm_sme.c +16 -0
  399. package/numkong/probes/arm_sme2.c +16 -0
  400. package/numkong/probes/arm_sme2p1.c +16 -0
  401. package/numkong/probes/arm_sme_bf16.c +16 -0
  402. package/numkong/probes/arm_sme_bi32.c +16 -0
  403. package/numkong/probes/arm_sme_f64.c +16 -0
  404. package/numkong/probes/arm_sme_fa64.c +14 -0
  405. package/numkong/probes/arm_sme_half.c +16 -0
  406. package/numkong/probes/arm_sme_lut2.c +15 -0
  407. package/numkong/probes/arm_sve.c +18 -0
  408. package/numkong/probes/arm_sve2.c +20 -0
  409. package/numkong/probes/arm_sve2p1.c +18 -0
  410. package/numkong/probes/arm_sve_bfdot.c +20 -0
  411. package/numkong/probes/arm_sve_half.c +18 -0
  412. package/numkong/probes/arm_sve_sdot.c +21 -0
  413. package/numkong/probes/loongarch_lasx.c +12 -0
  414. package/numkong/probes/power_vsx.c +12 -0
  415. package/numkong/probes/probe.js +127 -0
  416. package/numkong/probes/riscv_rvv.c +14 -0
  417. package/numkong/probes/riscv_rvv_bb.c +15 -0
  418. package/numkong/probes/riscv_rvv_bf16.c +17 -0
  419. package/numkong/probes/riscv_rvv_half.c +14 -0
  420. package/numkong/probes/wasm_v128relaxed.c +11 -0
  421. package/numkong/probes/x86_alder.c +17 -0
  422. package/numkong/probes/x86_diamond.c +17 -0
  423. package/numkong/probes/x86_genoa.c +17 -0
  424. package/numkong/probes/x86_graniteamx.c +19 -0
  425. package/numkong/probes/x86_haswell.c +11 -0
  426. package/numkong/probes/x86_icelake.c +17 -0
  427. package/numkong/probes/x86_sapphire.c +16 -0
  428. package/numkong/probes/x86_sapphireamx.c +18 -0
  429. package/numkong/probes/x86_sierra.c +17 -0
  430. package/numkong/probes/x86_skylake.c +15 -0
  431. package/numkong/probes/x86_turin.c +17 -0
  432. package/numkong/rust/README.md +698 -0
  433. package/numkong/rust/capabilities.rs +96 -0
  434. package/numkong/rust/cast.rs +314 -0
  435. package/numkong/rust/curved.rs +391 -0
  436. package/numkong/rust/each.rs +2721 -0
  437. package/numkong/rust/geospatial.rs +343 -0
  438. package/numkong/rust/matrix.rs +5424 -0
  439. package/numkong/rust/maxsim.rs +540 -0
  440. package/numkong/rust/mesh.rs +837 -0
  441. package/numkong/rust/numkong.rs +409 -0
  442. package/numkong/rust/probability.rs +272 -0
  443. package/numkong/rust/reduce.rs +1249 -0
  444. package/numkong/rust/set.rs +194 -0
  445. package/numkong/rust/sparse.rs +513 -0
  446. package/numkong/rust/spatial.rs +1815 -0
  447. package/numkong/rust/tensor.rs +7565 -0
  448. package/numkong/rust/types.rs +3666 -0
  449. package/numkong/rust/vector.rs +1899 -0
  450. package/numkong/rustfmt.toml +2 -0
  451. package/numkong/swift/Matrix.swift +1388 -0
  452. package/numkong/swift/MaxSim.swift +151 -0
  453. package/numkong/swift/NumKong.swift +283 -0
  454. package/numkong/swift/Numerics.swift +329 -0
  455. package/numkong/swift/README.md +433 -0
  456. package/numkong/swift/Scalar.swift +741 -0
  457. package/numkong/swift/Tensor.swift +209 -0
  458. package/numkong/test/README.md +315 -0
  459. package/numkong/test/playwright.config.ts +16 -0
  460. package/numkong/test/swift/Test.swift +534 -0
  461. package/numkong/test/test-browser-bundle-runner.mjs +36 -0
  462. package/numkong/test/test-browser-bundle.html +188 -0
  463. package/numkong/test/test-browser-runner.mjs +43 -0
  464. package/numkong/test/test-browser.html +305 -0
  465. package/numkong/test/test-dtypes.mjs +453 -0
  466. package/numkong/test/test-wasm.mjs +267 -0
  467. package/numkong/test/test.cpp +442 -0
  468. package/numkong/test/test.hpp +580 -0
  469. package/numkong/test/test.mjs +363 -0
  470. package/numkong/test/test_base.py +1041 -0
  471. package/numkong/test/test_cast.cpp +242 -0
  472. package/numkong/test/test_cross.hpp +551 -0
  473. package/numkong/test/test_cross.py +467 -0
  474. package/numkong/test/test_cross_amx.cpp +50 -0
  475. package/numkong/test/test_cross_arm.cpp +225 -0
  476. package/numkong/test/test_cross_blas.cpp +354 -0
  477. package/numkong/test/test_cross_loongarch.cpp +90 -0
  478. package/numkong/test/test_cross_power.cpp +73 -0
  479. package/numkong/test/test_cross_rvv.cpp +109 -0
  480. package/numkong/test/test_cross_serial.cpp +181 -0
  481. package/numkong/test/test_cross_sme.cpp +148 -0
  482. package/numkong/test/test_cross_wasm.cpp +141 -0
  483. package/numkong/test/test_cross_x86.cpp +442 -0
  484. package/numkong/test/test_curved.cpp +182 -0
  485. package/numkong/test/test_curved.py +207 -0
  486. package/numkong/test/test_dot.cpp +353 -0
  487. package/numkong/test/test_dot.py +296 -0
  488. package/numkong/test/test_each.cpp +437 -0
  489. package/numkong/test/test_each.py +756 -0
  490. package/numkong/test/test_geospatial.cpp +155 -0
  491. package/numkong/test/test_geospatial.py +241 -0
  492. package/numkong/test/test_maxsim.cpp +138 -0
  493. package/numkong/test/test_maxsim.py +209 -0
  494. package/numkong/test/test_mesh.cpp +203 -0
  495. package/numkong/test/test_mesh.py +394 -0
  496. package/numkong/test/test_probability.cpp +136 -0
  497. package/numkong/test/test_probability.py +166 -0
  498. package/numkong/test/test_reduce.cpp +563 -0
  499. package/numkong/test/test_reduce.py +781 -0
  500. package/numkong/test/test_set.cpp +151 -0
  501. package/numkong/test/test_set.py +120 -0
  502. package/numkong/test/test_similarities.py +579 -0
  503. package/numkong/test/test_sparse.cpp +121 -0
  504. package/numkong/test/test_sparse.py +118 -0
  505. package/numkong/test/test_spatial.cpp +518 -0
  506. package/numkong/test/test_spatial.py +269 -0
  507. package/numkong/test/test_tensor.cpp +884 -0
  508. package/numkong/test/test_tensor.py +1417 -0
  509. package/numkong/test/test_trigonometry.cpp +156 -0
  510. package/numkong/test/test_trigonometry.py +180 -0
  511. package/package.json +7 -8
  512. package/prebuilds/darwin-arm64+x64/usearch.node +0 -0
  513. package/prebuilds/linux-arm64/usearch.node +0 -0
  514. package/prebuilds/linux-x64/usearch.node +0 -0
  515. package/fp16/CMakeLists.txt +0 -176
  516. package/fp16/LICENSE +0 -11
  517. package/fp16/README.md +0 -20
  518. package/fp16/bench/alt-element.cc +0 -89
  519. package/fp16/bench/from-alt-array.cc +0 -175
  520. package/fp16/bench/from-ieee-array.cc +0 -399
  521. package/fp16/bench/ieee-element.cc +0 -272
  522. package/fp16/bench/to-alt-array.cc +0 -91
  523. package/fp16/bench/to-ieee-array.cc +0 -303
  524. package/fp16/cmake/DownloadGoogleBenchmark.cmake +0 -15
  525. package/fp16/cmake/DownloadGoogleTest.cmake +0 -15
  526. package/fp16/cmake/DownloadPSimd.cmake +0 -15
  527. package/fp16/configure.py +0 -65
  528. package/fp16/confu.yaml +0 -8
  529. package/fp16/include/fp16/__init__.py +0 -0
  530. package/fp16/include/fp16/avx.py +0 -50
  531. package/fp16/include/fp16/avx2.py +0 -53
  532. package/fp16/include/fp16/bitcasts.h +0 -92
  533. package/fp16/include/fp16/fp16.h +0 -451
  534. package/fp16/include/fp16/psimd.h +0 -131
  535. package/fp16/include/fp16.h +0 -11
  536. package/fp16/jni/Android.mk +0 -6
  537. package/fp16/jni/Application.mk +0 -4
  538. package/fp16/test/alt-from-fp32-value.cc +0 -498
  539. package/fp16/test/alt-to-fp32-bits.cc +0 -263
  540. package/fp16/test/alt-to-fp32-psimd.cc +0 -145
  541. package/fp16/test/alt-to-fp32-value.cc +0 -348
  542. package/fp16/test/alt-to-fp32x2-psimd.cc +0 -245
  543. package/fp16/test/bitcasts.cc +0 -56
  544. package/fp16/test/ieee-from-fp32-value.cc +0 -523
  545. package/fp16/test/ieee-to-fp32-bits.cc +0 -333
  546. package/fp16/test/ieee-to-fp32-psimd.cc +0 -312
  547. package/fp16/test/ieee-to-fp32-value.cc +0 -420
  548. package/fp16/test/ieee-to-fp32x2-psimd.cc +0 -541
  549. package/fp16/test/peachpy/alt-xmm-to-fp32-xmm-avx.cc +0 -96
  550. package/fp16/test/peachpy/alt-xmm-to-fp32-ymm-avx2.cc +0 -96
  551. package/fp16/test/peachpy/stubs.py +0 -38
  552. package/fp16/test/tables.cc +0 -530
  553. package/fp16/test/tables.h +0 -13
  554. package/fp16/third-party/THHalf.h +0 -92
  555. package/fp16/third-party/eigen-half.h +0 -170
  556. package/fp16/third-party/float16-compressor.h +0 -80
  557. package/fp16/third-party/half.hpp +0 -2916
  558. package/fp16/third-party/npy-halffloat.h +0 -328
  559. package/simsimd/.git-blame-ignore-revs +0 -2
  560. package/simsimd/CONTRIBUTING.md +0 -321
  561. package/simsimd/Cargo.toml +0 -49
  562. package/simsimd/MANIFEST.in +0 -4
  563. package/simsimd/Package.swift +0 -28
  564. package/simsimd/README.md +0 -1493
  565. package/simsimd/binding.gyp +0 -35
  566. package/simsimd/build.rs +0 -70
  567. package/simsimd/c/lib.c +0 -374
  568. package/simsimd/include/module.modulemap +0 -4
  569. package/simsimd/include/simsimd/binary.h +0 -486
  570. package/simsimd/include/simsimd/curved.h +0 -1541
  571. package/simsimd/include/simsimd/dot.h +0 -1853
  572. package/simsimd/include/simsimd/elementwise.h +0 -2465
  573. package/simsimd/include/simsimd/geospatial.h +0 -43
  574. package/simsimd/include/simsimd/mesh.h +0 -69
  575. package/simsimd/include/simsimd/probability.h +0 -606
  576. package/simsimd/include/simsimd/simsimd.h +0 -2567
  577. package/simsimd/include/simsimd/sparse.h +0 -1384
  578. package/simsimd/include/simsimd/spatial.h +0 -2335
  579. package/simsimd/include/simsimd/types.h +0 -666
  580. package/simsimd/javascript/fallback.ts +0 -233
  581. package/simsimd/javascript/lib.c +0 -125
  582. package/simsimd/javascript/node-gyp-build.d.ts +0 -1
  583. package/simsimd/javascript/simsimd.ts +0 -179
  584. package/simsimd/javascript/tsconfig-cjs.json +0 -8
  585. package/simsimd/package-lock.json +0 -1761
  586. package/simsimd/package.json +0 -61
  587. package/simsimd/rust/lib.rs +0 -1821
  588. package/simsimd/scripts/bench.cxx +0 -1170
  589. package/simsimd/scripts/bench.ipynb +0 -187
  590. package/simsimd/scripts/bench.js +0 -127
  591. package/simsimd/scripts/bench.rs +0 -876
  592. package/simsimd/scripts/bench_vectors.py +0 -734
  593. package/simsimd/scripts/bench_vectors_live.py +0 -213
  594. package/simsimd/scripts/test.c +0 -187
  595. package/simsimd/scripts/test.mjs +0 -220
  596. package/simsimd/scripts/test.py +0 -1505
  597. package/simsimd/swift/SimSIMD.swift +0 -149
  598. package/simsimd/swift/Test.swift +0 -128
  599. /package/{simsimd → numkong}/CODE_OF_CONDUCT.md +0 -0
  600. /package/{simsimd → numkong}/LICENSE +0 -0
  601. /package/{simsimd → numkong}/javascript/dist-package-cjs.json +0 -0
  602. /package/{simsimd → numkong}/javascript/dist-package-esm.json +0 -0
@@ -0,0 +1,741 @@
1
+ // Scalar.swift
2
+ // NumKong
3
+ //
4
+ // Created by Ash Vardanian on March 14, 2026.
5
+ //
6
+
7
+ import CNumKong
8
+
9
+ // MARK: - Spatial Protocols
10
+
11
+ /// A type that can compute SIMD-accelerated dot products with output type widening.
12
+ public protocol NumKongDot {
13
+ associatedtype DotOutput
14
+ static func dot<A, B>(_ a: A, _ b: B) -> DotOutput?
15
+ where A: Sequence, B: Sequence, A.Element == Self, B.Element == Self
16
+ }
17
+
18
+ /// A type that can compute SIMD-accelerated angular (cosine) distances.
19
+ public protocol NumKongAngular {
20
+ associatedtype AngularOutput
21
+ static func angular<A, B>(_ a: A, _ b: B) -> AngularOutput?
22
+ where A: Sequence, B: Sequence, A.Element == Self, B.Element == Self
23
+ }
24
+
25
+ /// A type that can compute SIMD-accelerated squared Euclidean distances.
26
+ public protocol NumKongSqEuclidean {
27
+ associatedtype SqEuclideanOutput
28
+ static func sqeuclidean<A, B>(_ a: A, _ b: B) -> SqEuclideanOutput?
29
+ where A: Sequence, B: Sequence, A.Element == Self, B.Element == Self
30
+ }
31
+
32
+ /// A type that can compute SIMD-accelerated Euclidean distances.
33
+ public protocol NumKongEuclidean {
34
+ associatedtype EuclideanOutput
35
+ static func euclidean<A, B>(_ a: A, _ b: B) -> EuclideanOutput?
36
+ where A: Sequence, B: Sequence, A.Element == Self, B.Element == Self
37
+ }
38
+
39
+ /// Convenience alias for types supporting all four spatial distance metrics.
40
+ public typealias NumKongSpatial = NumKongDot & NumKongAngular & NumKongEuclidean & NumKongSqEuclidean
41
+
42
+ // MARK: - Built-in Scalars
43
+
44
+ extension Float64: NumKongDot {
45
+ public typealias DotOutput = Float64
46
+
47
+ @inlinable @inline(__always)
48
+ public static func dot<A, B>(_ a: A, _ b: B) -> Float64?
49
+ where A: Sequence, B: Sequence, A.Element == Float64, B.Element == Float64 {
50
+ _nkWithDensePair(a, b) { ap, bp, n in
51
+ var result: Float64 = 0
52
+ nk_dot_f64(ap, bp, UInt64(n), &result)
53
+ return result
54
+ }
55
+ }
56
+ }
57
+
58
+ extension Float64: NumKongAngular {
59
+ public typealias AngularOutput = Float64
60
+
61
+ @inlinable @inline(__always)
62
+ public static func angular<A, B>(_ a: A, _ b: B) -> Float64?
63
+ where A: Sequence, B: Sequence, A.Element == Float64, B.Element == Float64 {
64
+ _nkWithDensePair(a, b) { ap, bp, n in
65
+ var result: Float64 = 0
66
+ nk_angular_f64(ap, bp, UInt64(n), &result)
67
+ return result
68
+ }
69
+ }
70
+ }
71
+
72
+ extension Float64: NumKongEuclidean {
73
+ public typealias EuclideanOutput = Float64
74
+
75
+ @inlinable @inline(__always)
76
+ public static func euclidean<A, B>(_ a: A, _ b: B) -> Float64?
77
+ where A: Sequence, B: Sequence, A.Element == Float64, B.Element == Float64 {
78
+ _nkWithDensePair(a, b) { ap, bp, n in
79
+ var result: Float64 = 0
80
+ nk_euclidean_f64(ap, bp, UInt64(n), &result)
81
+ return result
82
+ }
83
+ }
84
+ }
85
+
86
+ extension Float64: NumKongSqEuclidean {
87
+ public typealias SqEuclideanOutput = Float64
88
+
89
+ @inlinable @inline(__always)
90
+ public static func sqeuclidean<A, B>(_ a: A, _ b: B) -> Float64?
91
+ where A: Sequence, B: Sequence, A.Element == Float64, B.Element == Float64 {
92
+ _nkWithDensePair(a, b) { ap, bp, n in
93
+ var result: Float64 = 0
94
+ nk_sqeuclidean_f64(ap, bp, UInt64(n), &result)
95
+ return result
96
+ }
97
+ }
98
+ }
99
+
100
+ extension Float32: NumKongDot {
101
+ public typealias DotOutput = Float64
102
+
103
+ @inlinable @inline(__always)
104
+ public static func dot<A, B>(_ a: A, _ b: B) -> Float64?
105
+ where A: Sequence, B: Sequence, A.Element == Float32, B.Element == Float32 {
106
+ _nkWithDensePair(a, b) { ap, bp, n in
107
+ var result: Float64 = 0
108
+ nk_dot_f32(ap, bp, UInt64(n), &result)
109
+ return result
110
+ }
111
+ }
112
+ }
113
+
114
+ extension Float32: NumKongAngular {
115
+ public typealias AngularOutput = Float64
116
+
117
+ @inlinable @inline(__always)
118
+ public static func angular<A, B>(_ a: A, _ b: B) -> Float64?
119
+ where A: Sequence, B: Sequence, A.Element == Float32, B.Element == Float32 {
120
+ _nkWithDensePair(a, b) { ap, bp, n in
121
+ var result: Float64 = 0
122
+ nk_angular_f32(ap, bp, UInt64(n), &result)
123
+ return result
124
+ }
125
+ }
126
+ }
127
+
128
+ extension Float32: NumKongEuclidean {
129
+ public typealias EuclideanOutput = Float64
130
+
131
+ @inlinable @inline(__always)
132
+ public static func euclidean<A, B>(_ a: A, _ b: B) -> Float64?
133
+ where A: Sequence, B: Sequence, A.Element == Float32, B.Element == Float32 {
134
+ _nkWithDensePair(a, b) { ap, bp, n in
135
+ var result: Float64 = 0
136
+ nk_euclidean_f32(ap, bp, UInt64(n), &result)
137
+ return result
138
+ }
139
+ }
140
+ }
141
+
142
+ extension Float32: NumKongSqEuclidean {
143
+ public typealias SqEuclideanOutput = Float64
144
+
145
+ @inlinable @inline(__always)
146
+ public static func sqeuclidean<A, B>(_ a: A, _ b: B) -> Float64?
147
+ where A: Sequence, B: Sequence, A.Element == Float32, B.Element == Float32 {
148
+ _nkWithDensePair(a, b) { ap, bp, n in
149
+ var result: Float64 = 0
150
+ nk_sqeuclidean_f32(ap, bp, UInt64(n), &result)
151
+ return result
152
+ }
153
+ }
154
+ }
155
+
156
+ // Float16 is a type-level absence on x86_64 — the compiler rejects it before
157
+ // @available runtime checks apply, so we need a compile-time arch guard.
158
+ // See: https://github.com/unum-cloud/USearch/pull/739
159
+ #if !arch(x86_64)
160
+ @available(macOS 11.0, iOS 14.0, tvOS 14.0, watchOS 7.0, *)
161
+ extension Float16: NumKongDot {
162
+ public typealias DotOutput = Float32
163
+
164
+ @inlinable @inline(__always)
165
+ public static func dot<A, B>(_ a: A, _ b: B) -> Float32?
166
+ where A: Sequence, B: Sequence, A.Element == Float16, B.Element == Float16 {
167
+ _nkWithDensePair(a, b) { ap, bp, n in
168
+ let aPtr = UnsafeRawPointer(ap).assumingMemoryBound(to: nk_f16_t.self)
169
+ let bPtr = UnsafeRawPointer(bp).assumingMemoryBound(to: nk_f16_t.self)
170
+ var result: Float32 = 0
171
+ nk_dot_f16(aPtr, bPtr, UInt64(n), &result)
172
+ return result
173
+ }
174
+ }
175
+ }
176
+
177
+ @available(macOS 11.0, iOS 14.0, tvOS 14.0, watchOS 7.0, *)
178
+ extension Float16: NumKongAngular {
179
+ public typealias AngularOutput = Float32
180
+
181
+ @inlinable @inline(__always)
182
+ public static func angular<A, B>(_ a: A, _ b: B) -> Float32?
183
+ where A: Sequence, B: Sequence, A.Element == Float16, B.Element == Float16 {
184
+ _nkWithDensePair(a, b) { ap, bp, n in
185
+ let aPtr = UnsafeRawPointer(ap).assumingMemoryBound(to: nk_f16_t.self)
186
+ let bPtr = UnsafeRawPointer(bp).assumingMemoryBound(to: nk_f16_t.self)
187
+ var result: Float32 = 0
188
+ nk_angular_f16(aPtr, bPtr, UInt64(n), &result)
189
+ return result
190
+ }
191
+ }
192
+ }
193
+
194
+ @available(macOS 11.0, iOS 14.0, tvOS 14.0, watchOS 7.0, *)
195
+ extension Float16: NumKongEuclidean {
196
+ public typealias EuclideanOutput = Float32
197
+
198
+ @inlinable @inline(__always)
199
+ public static func euclidean<A, B>(_ a: A, _ b: B) -> Float32?
200
+ where A: Sequence, B: Sequence, A.Element == Float16, B.Element == Float16 {
201
+ _nkWithDensePair(a, b) { ap, bp, n in
202
+ let aPtr = UnsafeRawPointer(ap).assumingMemoryBound(to: nk_f16_t.self)
203
+ let bPtr = UnsafeRawPointer(bp).assumingMemoryBound(to: nk_f16_t.self)
204
+ var result: Float32 = 0
205
+ nk_euclidean_f16(aPtr, bPtr, UInt64(n), &result)
206
+ return result
207
+ }
208
+ }
209
+ }
210
+
211
+ @available(macOS 11.0, iOS 14.0, tvOS 14.0, watchOS 7.0, *)
212
+ extension Float16: NumKongSqEuclidean {
213
+ public typealias SqEuclideanOutput = Float32
214
+
215
+ @inlinable @inline(__always)
216
+ public static func sqeuclidean<A, B>(_ a: A, _ b: B) -> Float32?
217
+ where A: Sequence, B: Sequence, A.Element == Float16, B.Element == Float16 {
218
+ _nkWithDensePair(a, b) { ap, bp, n in
219
+ let aPtr = UnsafeRawPointer(ap).assumingMemoryBound(to: nk_f16_t.self)
220
+ let bPtr = UnsafeRawPointer(bp).assumingMemoryBound(to: nk_f16_t.self)
221
+ var result: Float32 = 0
222
+ nk_sqeuclidean_f16(aPtr, bPtr, UInt64(n), &result)
223
+ return result
224
+ }
225
+ }
226
+ }
227
+ #endif // !arch(x86_64)
228
+
229
+ extension Int8: NumKongDot {
230
+ public typealias DotOutput = Int32
231
+
232
+ @inlinable @inline(__always)
233
+ public static func dot<A, B>(_ a: A, _ b: B) -> Int32?
234
+ where A: Sequence, B: Sequence, A.Element == Int8, B.Element == Int8 {
235
+ _nkWithDensePair(a, b) { ap, bp, n in
236
+ var result: Int32 = 0
237
+ nk_dot_i8(ap, bp, UInt64(n), &result)
238
+ return result
239
+ }
240
+ }
241
+ }
242
+
243
+ extension Int8: NumKongAngular {
244
+ public typealias AngularOutput = Float32
245
+
246
+ @inlinable @inline(__always)
247
+ public static func angular<A, B>(_ a: A, _ b: B) -> Float32?
248
+ where A: Sequence, B: Sequence, A.Element == Int8, B.Element == Int8 {
249
+ _nkWithDensePair(a, b) { ap, bp, n in
250
+ var result: Float32 = 0
251
+ nk_angular_i8(ap, bp, UInt64(n), &result)
252
+ return result
253
+ }
254
+ }
255
+ }
256
+
257
+ extension Int8: NumKongEuclidean {
258
+ public typealias EuclideanOutput = Float32
259
+
260
+ @inlinable @inline(__always)
261
+ public static func euclidean<A, B>(_ a: A, _ b: B) -> Float32?
262
+ where A: Sequence, B: Sequence, A.Element == Int8, B.Element == Int8 {
263
+ _nkWithDensePair(a, b) { ap, bp, n in
264
+ var result: Float32 = 0
265
+ nk_euclidean_i8(ap, bp, UInt64(n), &result)
266
+ return result
267
+ }
268
+ }
269
+ }
270
+
271
+ extension Int8: NumKongSqEuclidean {
272
+ public typealias SqEuclideanOutput = UInt32
273
+
274
+ @inlinable @inline(__always)
275
+ public static func sqeuclidean<A, B>(_ a: A, _ b: B) -> UInt32?
276
+ where A: Sequence, B: Sequence, A.Element == Int8, B.Element == Int8 {
277
+ _nkWithDensePair(a, b) { ap, bp, n in
278
+ var result: UInt32 = 0
279
+ nk_sqeuclidean_i8(ap, bp, UInt64(n), &result)
280
+ return result
281
+ }
282
+ }
283
+ }
284
+
285
+ extension UInt8: NumKongDot {
286
+ public typealias DotOutput = UInt32
287
+
288
+ @inlinable @inline(__always)
289
+ public static func dot<A, B>(_ a: A, _ b: B) -> UInt32?
290
+ where A: Sequence, B: Sequence, A.Element == UInt8, B.Element == UInt8 {
291
+ _nkWithDensePair(a, b) { ap, bp, n in
292
+ var result: UInt32 = 0
293
+ nk_dot_u8(ap, bp, UInt64(n), &result)
294
+ return result
295
+ }
296
+ }
297
+ }
298
+
299
+ extension UInt8: NumKongAngular {
300
+ public typealias AngularOutput = Float32
301
+
302
+ @inlinable @inline(__always)
303
+ public static func angular<A, B>(_ a: A, _ b: B) -> Float32?
304
+ where A: Sequence, B: Sequence, A.Element == UInt8, B.Element == UInt8 {
305
+ _nkWithDensePair(a, b) { ap, bp, n in
306
+ var result: Float32 = 0
307
+ nk_angular_u8(ap, bp, UInt64(n), &result)
308
+ return result
309
+ }
310
+ }
311
+ }
312
+
313
+ extension UInt8: NumKongEuclidean {
314
+ public typealias EuclideanOutput = Float32
315
+
316
+ @inlinable @inline(__always)
317
+ public static func euclidean<A, B>(_ a: A, _ b: B) -> Float32?
318
+ where A: Sequence, B: Sequence, A.Element == UInt8, B.Element == UInt8 {
319
+ _nkWithDensePair(a, b) { ap, bp, n in
320
+ var result: Float32 = 0
321
+ nk_euclidean_u8(ap, bp, UInt64(n), &result)
322
+ return result
323
+ }
324
+ }
325
+ }
326
+
327
+ extension UInt8: NumKongSqEuclidean {
328
+ public typealias SqEuclideanOutput = UInt32
329
+
330
+ @inlinable @inline(__always)
331
+ public static func sqeuclidean<A, B>(_ a: A, _ b: B) -> UInt32?
332
+ where A: Sequence, B: Sequence, A.Element == UInt8, B.Element == UInt8 {
333
+ _nkWithDensePair(a, b) { ap, bp, n in
334
+ var result: UInt32 = 0
335
+ nk_sqeuclidean_u8(ap, bp, UInt64(n), &result)
336
+ return result
337
+ }
338
+ }
339
+ }
340
+
341
+ // MARK: - Minifloat Scalars
342
+
343
+ extension BFloat16: NumKongDot {
344
+ public typealias DotOutput = Float32
345
+
346
+ @inlinable @inline(__always)
347
+ public static func dot<A, B>(_ a: A, _ b: B) -> Float32?
348
+ where A: Sequence, B: Sequence, A.Element == BFloat16, B.Element == BFloat16 {
349
+ _nkWithDensePairRebound(a, b, to: nk_bf16_t.self) { ap, bp, n in
350
+ var result: Float32 = 0
351
+ nk_dot_bf16(ap, bp, UInt64(n), &result)
352
+ return result
353
+ }
354
+ }
355
+ }
356
+
357
+ extension BFloat16: NumKongAngular {
358
+ public typealias AngularOutput = Float32
359
+
360
+ @inlinable @inline(__always)
361
+ public static func angular<A, B>(_ a: A, _ b: B) -> Float32?
362
+ where A: Sequence, B: Sequence, A.Element == BFloat16, B.Element == BFloat16 {
363
+ _nkWithDensePairRebound(a, b, to: nk_bf16_t.self) { ap, bp, n in
364
+ var result: Float32 = 0
365
+ nk_angular_bf16(ap, bp, UInt64(n), &result)
366
+ return result
367
+ }
368
+ }
369
+ }
370
+
371
+ extension BFloat16: NumKongEuclidean {
372
+ public typealias EuclideanOutput = Float32
373
+
374
+ @inlinable @inline(__always)
375
+ public static func euclidean<A, B>(_ a: A, _ b: B) -> Float32?
376
+ where A: Sequence, B: Sequence, A.Element == BFloat16, B.Element == BFloat16 {
377
+ _nkWithDensePairRebound(a, b, to: nk_bf16_t.self) { ap, bp, n in
378
+ var result: Float32 = 0
379
+ nk_euclidean_bf16(ap, bp, UInt64(n), &result)
380
+ return result
381
+ }
382
+ }
383
+ }
384
+
385
+ extension BFloat16: NumKongSqEuclidean {
386
+ public typealias SqEuclideanOutput = Float32
387
+
388
+ @inlinable @inline(__always)
389
+ public static func sqeuclidean<A, B>(_ a: A, _ b: B) -> Float32?
390
+ where A: Sequence, B: Sequence, A.Element == BFloat16, B.Element == BFloat16 {
391
+ _nkWithDensePairRebound(a, b, to: nk_bf16_t.self) { ap, bp, n in
392
+ var result: Float32 = 0
393
+ nk_sqeuclidean_bf16(ap, bp, UInt64(n), &result)
394
+ return result
395
+ }
396
+ }
397
+ }
398
+
399
+ extension E4M3: NumKongDot {
400
+ public typealias DotOutput = Float32
401
+
402
+ @inlinable @inline(__always)
403
+ public static func dot<A, B>(_ a: A, _ b: B) -> Float32?
404
+ where A: Sequence, B: Sequence, A.Element == E4M3, B.Element == E4M3 {
405
+ _nkWithDensePairRebound(a, b, to: nk_e4m3_t.self) { ap, bp, n in
406
+ var result: Float32 = 0
407
+ nk_dot_e4m3(ap, bp, UInt64(n), &result)
408
+ return result
409
+ }
410
+ }
411
+ }
412
+
413
+ extension E4M3: NumKongAngular {
414
+ public typealias AngularOutput = Float32
415
+
416
+ @inlinable @inline(__always)
417
+ public static func angular<A, B>(_ a: A, _ b: B) -> Float32?
418
+ where A: Sequence, B: Sequence, A.Element == E4M3, B.Element == E4M3 {
419
+ _nkWithDensePairRebound(a, b, to: nk_e4m3_t.self) { ap, bp, n in
420
+ var result: Float32 = 0
421
+ nk_angular_e4m3(ap, bp, UInt64(n), &result)
422
+ return result
423
+ }
424
+ }
425
+ }
426
+
427
+ extension E4M3: NumKongEuclidean {
428
+ public typealias EuclideanOutput = Float32
429
+
430
+ @inlinable @inline(__always)
431
+ public static func euclidean<A, B>(_ a: A, _ b: B) -> Float32?
432
+ where A: Sequence, B: Sequence, A.Element == E4M3, B.Element == E4M3 {
433
+ _nkWithDensePairRebound(a, b, to: nk_e4m3_t.self) { ap, bp, n in
434
+ var result: Float32 = 0
435
+ nk_euclidean_e4m3(ap, bp, UInt64(n), &result)
436
+ return result
437
+ }
438
+ }
439
+ }
440
+
441
+ extension E4M3: NumKongSqEuclidean {
442
+ public typealias SqEuclideanOutput = Float32
443
+
444
+ @inlinable @inline(__always)
445
+ public static func sqeuclidean<A, B>(_ a: A, _ b: B) -> Float32?
446
+ where A: Sequence, B: Sequence, A.Element == E4M3, B.Element == E4M3 {
447
+ _nkWithDensePairRebound(a, b, to: nk_e4m3_t.self) { ap, bp, n in
448
+ var result: Float32 = 0
449
+ nk_sqeuclidean_e4m3(ap, bp, UInt64(n), &result)
450
+ return result
451
+ }
452
+ }
453
+ }
454
+
455
+ extension E5M2: NumKongDot {
456
+ public typealias DotOutput = Float32
457
+
458
+ @inlinable @inline(__always)
459
+ public static func dot<A, B>(_ a: A, _ b: B) -> Float32?
460
+ where A: Sequence, B: Sequence, A.Element == E5M2, B.Element == E5M2 {
461
+ _nkWithDensePairRebound(a, b, to: nk_e5m2_t.self) { ap, bp, n in
462
+ var result: Float32 = 0
463
+ nk_dot_e5m2(ap, bp, UInt64(n), &result)
464
+ return result
465
+ }
466
+ }
467
+ }
468
+
469
+ extension E5M2: NumKongAngular {
470
+ public typealias AngularOutput = Float32
471
+
472
+ @inlinable @inline(__always)
473
+ public static func angular<A, B>(_ a: A, _ b: B) -> Float32?
474
+ where A: Sequence, B: Sequence, A.Element == E5M2, B.Element == E5M2 {
475
+ _nkWithDensePairRebound(a, b, to: nk_e5m2_t.self) { ap, bp, n in
476
+ var result: Float32 = 0
477
+ nk_angular_e5m2(ap, bp, UInt64(n), &result)
478
+ return result
479
+ }
480
+ }
481
+ }
482
+
483
+ extension E5M2: NumKongEuclidean {
484
+ public typealias EuclideanOutput = Float32
485
+
486
+ @inlinable @inline(__always)
487
+ public static func euclidean<A, B>(_ a: A, _ b: B) -> Float32?
488
+ where A: Sequence, B: Sequence, A.Element == E5M2, B.Element == E5M2 {
489
+ _nkWithDensePairRebound(a, b, to: nk_e5m2_t.self) { ap, bp, n in
490
+ var result: Float32 = 0
491
+ nk_euclidean_e5m2(ap, bp, UInt64(n), &result)
492
+ return result
493
+ }
494
+ }
495
+ }
496
+
497
+ extension E5M2: NumKongSqEuclidean {
498
+ public typealias SqEuclideanOutput = Float32
499
+
500
+ @inlinable @inline(__always)
501
+ public static func sqeuclidean<A, B>(_ a: A, _ b: B) -> Float32?
502
+ where A: Sequence, B: Sequence, A.Element == E5M2, B.Element == E5M2 {
503
+ _nkWithDensePairRebound(a, b, to: nk_e5m2_t.self) { ap, bp, n in
504
+ var result: Float32 = 0
505
+ nk_sqeuclidean_e5m2(ap, bp, UInt64(n), &result)
506
+ return result
507
+ }
508
+ }
509
+ }
510
+
511
+ extension E2M3: NumKongDot {
512
+ public typealias DotOutput = Float32
513
+
514
+ @inlinable @inline(__always)
515
+ public static func dot<A, B>(_ a: A, _ b: B) -> Float32?
516
+ where A: Sequence, B: Sequence, A.Element == E2M3, B.Element == E2M3 {
517
+ _nkWithDensePairRebound(a, b, to: nk_e2m3_t.self) { ap, bp, n in
518
+ var result: Float32 = 0
519
+ nk_dot_e2m3(ap, bp, UInt64(n), &result)
520
+ return result
521
+ }
522
+ }
523
+ }
524
+
525
+ extension E2M3: NumKongAngular {
526
+ public typealias AngularOutput = Float32
527
+
528
+ @inlinable @inline(__always)
529
+ public static func angular<A, B>(_ a: A, _ b: B) -> Float32?
530
+ where A: Sequence, B: Sequence, A.Element == E2M3, B.Element == E2M3 {
531
+ _nkWithDensePairRebound(a, b, to: nk_e2m3_t.self) { ap, bp, n in
532
+ var result: Float32 = 0
533
+ nk_angular_e2m3(ap, bp, UInt64(n), &result)
534
+ return result
535
+ }
536
+ }
537
+ }
538
+
539
+ extension E2M3: NumKongEuclidean {
540
+ public typealias EuclideanOutput = Float32
541
+
542
+ @inlinable @inline(__always)
543
+ public static func euclidean<A, B>(_ a: A, _ b: B) -> Float32?
544
+ where A: Sequence, B: Sequence, A.Element == E2M3, B.Element == E2M3 {
545
+ _nkWithDensePairRebound(a, b, to: nk_e2m3_t.self) { ap, bp, n in
546
+ var result: Float32 = 0
547
+ nk_euclidean_e2m3(ap, bp, UInt64(n), &result)
548
+ return result
549
+ }
550
+ }
551
+ }
552
+
553
+ extension E2M3: NumKongSqEuclidean {
554
+ public typealias SqEuclideanOutput = Float32
555
+
556
+ @inlinable @inline(__always)
557
+ public static func sqeuclidean<A, B>(_ a: A, _ b: B) -> Float32?
558
+ where A: Sequence, B: Sequence, A.Element == E2M3, B.Element == E2M3 {
559
+ _nkWithDensePairRebound(a, b, to: nk_e2m3_t.self) { ap, bp, n in
560
+ var result: Float32 = 0
561
+ nk_sqeuclidean_e2m3(ap, bp, UInt64(n), &result)
562
+ return result
563
+ }
564
+ }
565
+ }
566
+
567
+ extension E3M2: NumKongDot {
568
+ public typealias DotOutput = Float32
569
+
570
+ @inlinable @inline(__always)
571
+ public static func dot<A, B>(_ a: A, _ b: B) -> Float32?
572
+ where A: Sequence, B: Sequence, A.Element == E3M2, B.Element == E3M2 {
573
+ _nkWithDensePairRebound(a, b, to: nk_e3m2_t.self) { ap, bp, n in
574
+ var result: Float32 = 0
575
+ nk_dot_e3m2(ap, bp, UInt64(n), &result)
576
+ return result
577
+ }
578
+ }
579
+ }
580
+
581
+ extension E3M2: NumKongAngular {
582
+ public typealias AngularOutput = Float32
583
+
584
+ @inlinable @inline(__always)
585
+ public static func angular<A, B>(_ a: A, _ b: B) -> Float32?
586
+ where A: Sequence, B: Sequence, A.Element == E3M2, B.Element == E3M2 {
587
+ _nkWithDensePairRebound(a, b, to: nk_e3m2_t.self) { ap, bp, n in
588
+ var result: Float32 = 0
589
+ nk_angular_e3m2(ap, bp, UInt64(n), &result)
590
+ return result
591
+ }
592
+ }
593
+ }
594
+
595
+ extension E3M2: NumKongEuclidean {
596
+ public typealias EuclideanOutput = Float32
597
+
598
+ @inlinable @inline(__always)
599
+ public static func euclidean<A, B>(_ a: A, _ b: B) -> Float32?
600
+ where A: Sequence, B: Sequence, A.Element == E3M2, B.Element == E3M2 {
601
+ _nkWithDensePairRebound(a, b, to: nk_e3m2_t.self) { ap, bp, n in
602
+ var result: Float32 = 0
603
+ nk_euclidean_e3m2(ap, bp, UInt64(n), &result)
604
+ return result
605
+ }
606
+ }
607
+ }
608
+
609
+ extension E3M2: NumKongSqEuclidean {
610
+ public typealias SqEuclideanOutput = Float32
611
+
612
+ @inlinable @inline(__always)
613
+ public static func sqeuclidean<A, B>(_ a: A, _ b: B) -> Float32?
614
+ where A: Sequence, B: Sequence, A.Element == E3M2, B.Element == E3M2 {
615
+ _nkWithDensePairRebound(a, b, to: nk_e3m2_t.self) { ap, bp, n in
616
+ var result: Float32 = 0
617
+ nk_sqeuclidean_e3m2(ap, bp, UInt64(n), &result)
618
+ return result
619
+ }
620
+ }
621
+ }
622
+
623
+ // MARK: - U1x8 Dot
624
+
625
+ extension U1x8: NumKongDot {
626
+ public typealias DotOutput = UInt32
627
+
628
+ @inlinable @inline(__always)
629
+ public static func dot<A, B>(_ a: A, _ b: B) -> UInt32?
630
+ where A: Sequence, B: Sequence, A.Element == U1x8, B.Element == U1x8 {
631
+ _nkWithDensePair(a, b) { ap, bp, n in
632
+ let aPtr = UnsafeRawPointer(ap).assumingMemoryBound(to: nk_u1x8_t.self)
633
+ let bPtr = UnsafeRawPointer(bp).assumingMemoryBound(to: nk_u1x8_t.self)
634
+ var result: UInt32 = 0
635
+ nk_dot_u1(aPtr, bPtr, UInt64(n * 8), &result)
636
+ return result
637
+ }
638
+ }
639
+ }
640
+
641
+ // MARK: - Set Protocols
642
+
643
+ /// A type that can compute SIMD-accelerated Hamming distances over bit sets.
644
+ public protocol NumKongHamming {
645
+ associatedtype HammingOutput
646
+ static func hamming<A, B>(_ a: A, _ b: B) -> HammingOutput?
647
+ where A: Sequence, B: Sequence, A.Element == Self, B.Element == Self
648
+ }
649
+
650
+ /// A type that can compute SIMD-accelerated Jaccard distances over bit sets.
651
+ public protocol NumKongJaccard {
652
+ associatedtype JaccardOutput
653
+ static func jaccard<A, B>(_ a: A, _ b: B) -> JaccardOutput?
654
+ where A: Sequence, B: Sequence, A.Element == Self, B.Element == Self
655
+ }
656
+
657
+ // MARK: - U1x8 Sets
658
+
659
+ extension U1x8: NumKongHamming {
660
+ @inlinable @inline(__always)
661
+ public static func hamming<A, B>(_ a: A, _ b: B) -> UInt32?
662
+ where A: Sequence, B: Sequence, A.Element == U1x8, B.Element == U1x8 {
663
+ _nkWithDensePair(a, b) { ap, bp, n in
664
+ let aPtr = UnsafeRawPointer(ap).assumingMemoryBound(to: nk_u1x8_t.self)
665
+ let bPtr = UnsafeRawPointer(bp).assumingMemoryBound(to: nk_u1x8_t.self)
666
+ var result: UInt32 = 0
667
+ nk_hamming_u1(aPtr, bPtr, UInt64(n * 8), &result)
668
+ return result
669
+ }
670
+ }
671
+ }
672
+
673
+ extension U1x8: NumKongJaccard {
674
+ @inlinable @inline(__always)
675
+ public static func jaccard<A, B>(_ a: A, _ b: B) -> Float32?
676
+ where A: Sequence, B: Sequence, A.Element == U1x8, B.Element == U1x8 {
677
+ _nkWithDensePair(a, b) { ap, bp, n in
678
+ let aPtr = UnsafeRawPointer(ap).assumingMemoryBound(to: nk_u1x8_t.self)
679
+ let bPtr = UnsafeRawPointer(bp).assumingMemoryBound(to: nk_u1x8_t.self)
680
+ var result: Float32 = 0
681
+ nk_jaccard_u1(aPtr, bPtr, UInt64(n * 8), &result)
682
+ return result
683
+ }
684
+ }
685
+ }
686
+
687
+ // MARK: - Collection Extensions
688
+
689
+ extension RandomAccessCollection where Element: NumKongDot {
690
+ /// Computes the SIMD-accelerated dot product with another sequence.
691
+ @inlinable @inline(__always)
692
+ public func dot<B>(_ b: B) -> Element.DotOutput?
693
+ where B: Sequence, B.Element == Element {
694
+ Element.dot(self, b)
695
+ }
696
+ }
697
+
698
+ extension RandomAccessCollection where Element: NumKongAngular {
699
+ /// Computes the SIMD-accelerated angular (cosine) distance to another sequence.
700
+ @inlinable @inline(__always)
701
+ public func angular<B>(_ b: B) -> Element.AngularOutput?
702
+ where B: Sequence, B.Element == Element {
703
+ Element.angular(self, b)
704
+ }
705
+ }
706
+
707
+ extension RandomAccessCollection where Element: NumKongEuclidean {
708
+ /// Computes the SIMD-accelerated Euclidean distance to another sequence.
709
+ @inlinable @inline(__always)
710
+ public func euclidean<B>(_ b: B) -> Element.EuclideanOutput?
711
+ where B: Sequence, B.Element == Element {
712
+ Element.euclidean(self, b)
713
+ }
714
+ }
715
+
716
+ extension RandomAccessCollection where Element: NumKongSqEuclidean {
717
+ /// Computes the SIMD-accelerated squared Euclidean distance to another sequence.
718
+ @inlinable @inline(__always)
719
+ public func sqeuclidean<B>(_ b: B) -> Element.SqEuclideanOutput?
720
+ where B: Sequence, B.Element == Element {
721
+ Element.sqeuclidean(self, b)
722
+ }
723
+ }
724
+
725
+ extension RandomAccessCollection where Element: NumKongHamming {
726
+ /// Computes the SIMD-accelerated Hamming distance to another sequence.
727
+ @inlinable @inline(__always)
728
+ public func hamming<B>(_ b: B) -> Element.HammingOutput?
729
+ where B: Sequence, B.Element == Element {
730
+ Element.hamming(self, b)
731
+ }
732
+ }
733
+
734
+ extension RandomAccessCollection where Element: NumKongJaccard {
735
+ /// Computes the SIMD-accelerated Jaccard distance to another sequence.
736
+ @inlinable @inline(__always)
737
+ public func jaccard<B>(_ b: B) -> Element.JaccardOutput?
738
+ where B: Sequence, B.Element == Element {
739
+ Element.jaccard(self, b)
740
+ }
741
+ }