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
@@ -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
+ }