usearch 2.21.4 → 2.25.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (602) hide show
  1. package/README.md +24 -24
  2. package/binding.gyp +15 -37
  3. package/c/CMakeLists.txt +4 -5
  4. package/c/README.md +7 -7
  5. package/c/lib.cpp +32 -14
  6. package/c/test.c +83 -1
  7. package/c/usearch.h +24 -3
  8. package/cpp/CMakeLists.txt +4 -0
  9. package/cpp/README.md +5 -5
  10. package/cpp/bench.cpp +97 -116
  11. package/cpp/test.cpp +117 -20
  12. package/include/usearch/index.hpp +224 -48
  13. package/include/usearch/index_dense.hpp +105 -40
  14. package/include/usearch/index_plugins.hpp +1387 -204
  15. package/javascript/dist/cjs/usearch.d.ts +8 -3
  16. package/javascript/dist/cjs/usearch.js +12 -4
  17. package/javascript/dist/esm/usearch.d.ts +8 -3
  18. package/javascript/dist/esm/usearch.js +12 -4
  19. package/javascript/lib.cpp +17 -0
  20. package/javascript/usearch.ts +14 -6
  21. package/numkong/.clang-tidy +30 -0
  22. package/{simsimd → numkong}/.cmake-format.py +18 -0
  23. package/numkong/.editorconfig +12 -0
  24. package/numkong/.git-blame-ignore-revs +123 -0
  25. package/numkong/.mailmap +15 -0
  26. package/numkong/.spi.yml +11 -0
  27. package/numkong/.swift-format +14 -0
  28. package/numkong/CITATION.cff +81 -0
  29. package/numkong/CONTRIBUTING.md +500 -0
  30. package/numkong/Cargo.toml +54 -0
  31. package/numkong/MANIFEST.in +8 -0
  32. package/numkong/Package.swift +84 -0
  33. package/numkong/README.md +569 -0
  34. package/numkong/bench/README.md +217 -0
  35. package/numkong/bench/bench-browser.html +323 -0
  36. package/numkong/bench/bench.cpp +344 -0
  37. package/numkong/bench/bench.hpp +816 -0
  38. package/numkong/bench/bench.js +148 -0
  39. package/numkong/bench/bench.mjs +616 -0
  40. package/numkong/bench/bench_attention.cpp +113 -0
  41. package/numkong/bench/bench_cast.cpp +264 -0
  42. package/numkong/bench/bench_cross_amx.cpp +62 -0
  43. package/numkong/bench/bench_cross_arm.cpp +245 -0
  44. package/numkong/bench/bench_cross_blas.cpp +309 -0
  45. package/numkong/bench/bench_cross_loongarch.cpp +106 -0
  46. package/numkong/bench/bench_cross_power.cpp +84 -0
  47. package/numkong/bench/bench_cross_rvv.cpp +121 -0
  48. package/numkong/bench/bench_cross_serial.cpp +151 -0
  49. package/numkong/bench/bench_cross_sme.cpp +163 -0
  50. package/numkong/bench/bench_cross_wasm.cpp +142 -0
  51. package/numkong/bench/bench_cross_x86.cpp +455 -0
  52. package/numkong/bench/bench_curved.cpp +210 -0
  53. package/numkong/bench/bench_dot.cpp +315 -0
  54. package/numkong/bench/bench_each.cpp +503 -0
  55. package/numkong/bench/bench_geospatial.cpp +112 -0
  56. package/numkong/bench/bench_maxsim.cpp +154 -0
  57. package/numkong/bench/bench_mesh.cpp +148 -0
  58. package/numkong/bench/bench_probability.cpp +60 -0
  59. package/numkong/bench/bench_reduce.cpp +371 -0
  60. package/numkong/bench/bench_set.cpp +73 -0
  61. package/numkong/bench/bench_sparse.cpp +198 -0
  62. package/numkong/bench/bench_spatial.cpp +347 -0
  63. package/numkong/bench/bench_trigonometry.cpp +137 -0
  64. package/numkong/bench/swift/Bench.swift +506 -0
  65. package/numkong/binding.gyp +169 -0
  66. package/numkong/build.rs +484 -0
  67. package/numkong/c/dispatch.h +512 -0
  68. package/numkong/c/dispatch_bf16.c +447 -0
  69. package/numkong/c/dispatch_bf16c.c +52 -0
  70. package/numkong/c/dispatch_e2m3.c +296 -0
  71. package/numkong/c/dispatch_e3m2.c +284 -0
  72. package/numkong/c/dispatch_e4m3.c +318 -0
  73. package/numkong/c/dispatch_e5m2.c +316 -0
  74. package/numkong/c/dispatch_f16.c +452 -0
  75. package/numkong/c/dispatch_f16c.c +58 -0
  76. package/numkong/c/dispatch_f32.c +434 -0
  77. package/numkong/c/dispatch_f32c.c +99 -0
  78. package/numkong/c/dispatch_f64.c +348 -0
  79. package/numkong/c/dispatch_f64c.c +98 -0
  80. package/numkong/c/dispatch_i16.c +96 -0
  81. package/numkong/c/dispatch_i32.c +89 -0
  82. package/numkong/c/dispatch_i4.c +153 -0
  83. package/numkong/c/dispatch_i64.c +86 -0
  84. package/numkong/c/dispatch_i8.c +348 -0
  85. package/numkong/c/dispatch_other.c +348 -0
  86. package/numkong/c/dispatch_u1.c +193 -0
  87. package/numkong/c/dispatch_u16.c +124 -0
  88. package/numkong/c/dispatch_u32.c +118 -0
  89. package/numkong/c/dispatch_u4.c +153 -0
  90. package/numkong/c/dispatch_u64.c +102 -0
  91. package/numkong/c/dispatch_u8.c +364 -0
  92. package/numkong/c/numkong.c +940 -0
  93. package/numkong/cmake/nk_arm_isa_probes.cmake +61 -0
  94. package/numkong/cmake/nk_isa_probe.cmake +90 -0
  95. package/numkong/cmake/nk_loongarch_isa_probes.cmake +15 -0
  96. package/numkong/cmake/nk_math_lib.cmake +46 -0
  97. package/numkong/cmake/nk_power_isa_probes.cmake +15 -0
  98. package/numkong/cmake/nk_riscv_isa_probes.cmake +19 -0
  99. package/numkong/cmake/nk_x86_isa_probes.cmake +35 -0
  100. package/numkong/cmake/toolchain-aarch64-gnu.cmake +86 -0
  101. package/numkong/cmake/toolchain-android-arm64.cmake +25 -0
  102. package/numkong/cmake/toolchain-android-armv7.cmake +25 -0
  103. package/numkong/cmake/toolchain-loongarch64-gnu.cmake +68 -0
  104. package/numkong/cmake/toolchain-ppc64le-gnu.cmake +74 -0
  105. package/numkong/cmake/toolchain-riscv64-gnu.cmake +107 -0
  106. package/numkong/cmake/toolchain-riscv64-llvm.cmake +114 -0
  107. package/numkong/cmake/toolchain-wasi.cmake +77 -0
  108. package/numkong/cmake/toolchain-wasm.cmake +70 -0
  109. package/numkong/cmake/toolchain-wasm64.cmake +62 -0
  110. package/numkong/cmake/toolchain-x86_64-llvm.cmake +47 -0
  111. package/numkong/include/README.md +643 -0
  112. package/numkong/include/module.modulemap +129 -0
  113. package/numkong/include/numkong/attention/sapphireamx.h +1363 -0
  114. package/numkong/include/numkong/attention/sme.h +2075 -0
  115. package/numkong/include/numkong/attention.h +49 -0
  116. package/numkong/include/numkong/capabilities.h +930 -0
  117. package/numkong/include/numkong/cast/README.md +262 -0
  118. package/numkong/include/numkong/cast/diamond.h +64 -0
  119. package/numkong/include/numkong/cast/haswell.h +823 -0
  120. package/numkong/include/numkong/cast/icelake.h +475 -0
  121. package/numkong/include/numkong/cast/loongsonasx.h +252 -0
  122. package/numkong/include/numkong/cast/neon.h +1174 -0
  123. package/numkong/include/numkong/cast/powervsx.h +449 -0
  124. package/numkong/include/numkong/cast/rvv.h +970 -0
  125. package/numkong/include/numkong/cast/sapphire.h +262 -0
  126. package/numkong/include/numkong/cast/serial.h +2336 -0
  127. package/numkong/include/numkong/cast/skylake.h +915 -0
  128. package/numkong/include/numkong/cast/v128relaxed.h +537 -0
  129. package/numkong/include/numkong/cast.h +254 -0
  130. package/numkong/include/numkong/cast.hpp +44 -0
  131. package/numkong/include/numkong/curved/README.md +223 -0
  132. package/numkong/include/numkong/curved/genoa.h +182 -0
  133. package/numkong/include/numkong/curved/haswell.h +276 -0
  134. package/numkong/include/numkong/curved/neon.h +329 -0
  135. package/numkong/include/numkong/curved/neonbfdot.h +211 -0
  136. package/numkong/include/numkong/curved/rvv.h +305 -0
  137. package/numkong/include/numkong/curved/serial.h +207 -0
  138. package/numkong/include/numkong/curved/skylake.h +457 -0
  139. package/numkong/include/numkong/curved/smef64.h +530 -0
  140. package/numkong/include/numkong/curved.h +513 -0
  141. package/numkong/include/numkong/curved.hpp +144 -0
  142. package/numkong/include/numkong/dot/README.md +442 -0
  143. package/numkong/include/numkong/dot/alder.h +563 -0
  144. package/numkong/include/numkong/dot/diamond.h +158 -0
  145. package/numkong/include/numkong/dot/genoa.h +289 -0
  146. package/numkong/include/numkong/dot/haswell.h +1723 -0
  147. package/numkong/include/numkong/dot/icelake.h +997 -0
  148. package/numkong/include/numkong/dot/loongsonasx.h +671 -0
  149. package/numkong/include/numkong/dot/neon.h +869 -0
  150. package/numkong/include/numkong/dot/neonbfdot.h +243 -0
  151. package/numkong/include/numkong/dot/neonfhm.h +358 -0
  152. package/numkong/include/numkong/dot/neonfp8.h +323 -0
  153. package/numkong/include/numkong/dot/neonsdot.h +622 -0
  154. package/numkong/include/numkong/dot/powervsx.h +752 -0
  155. package/numkong/include/numkong/dot/rvv.h +722 -0
  156. package/numkong/include/numkong/dot/rvvbb.h +72 -0
  157. package/numkong/include/numkong/dot/rvvbf16.h +123 -0
  158. package/numkong/include/numkong/dot/rvvhalf.h +129 -0
  159. package/numkong/include/numkong/dot/sapphire.h +141 -0
  160. package/numkong/include/numkong/dot/serial.h +874 -0
  161. package/numkong/include/numkong/dot/sierra.h +405 -0
  162. package/numkong/include/numkong/dot/skylake.h +1116 -0
  163. package/numkong/include/numkong/dot/sve.h +420 -0
  164. package/numkong/include/numkong/dot/svebfdot.h +75 -0
  165. package/numkong/include/numkong/dot/svehalf.h +168 -0
  166. package/numkong/include/numkong/dot/svesdot.h +90 -0
  167. package/numkong/include/numkong/dot/v128relaxed.h +1293 -0
  168. package/numkong/include/numkong/dot.h +1136 -0
  169. package/numkong/include/numkong/dot.hpp +94 -0
  170. package/numkong/include/numkong/dots/README.md +496 -0
  171. package/numkong/include/numkong/dots/alder.h +117 -0
  172. package/numkong/include/numkong/dots/diamond.h +86 -0
  173. package/numkong/include/numkong/dots/genoa.h +100 -0
  174. package/numkong/include/numkong/dots/graniteamx.h +733 -0
  175. package/numkong/include/numkong/dots/haswell.h +310 -0
  176. package/numkong/include/numkong/dots/icelake.h +180 -0
  177. package/numkong/include/numkong/dots/loongsonasx.h +176 -0
  178. package/numkong/include/numkong/dots/neon.h +123 -0
  179. package/numkong/include/numkong/dots/neonbfdot.h +59 -0
  180. package/numkong/include/numkong/dots/neonfhm.h +96 -0
  181. package/numkong/include/numkong/dots/neonfp8.h +99 -0
  182. package/numkong/include/numkong/dots/neonsdot.h +144 -0
  183. package/numkong/include/numkong/dots/powervsx.h +194 -0
  184. package/numkong/include/numkong/dots/rvv.h +2593 -0
  185. package/numkong/include/numkong/dots/sapphireamx.h +4017 -0
  186. package/numkong/include/numkong/dots/serial.h +2867 -0
  187. package/numkong/include/numkong/dots/sierra.h +100 -0
  188. package/numkong/include/numkong/dots/skylake.h +207 -0
  189. package/numkong/include/numkong/dots/sme.h +5041 -0
  190. package/numkong/include/numkong/dots/smebi32.h +477 -0
  191. package/numkong/include/numkong/dots/smef64.h +1328 -0
  192. package/numkong/include/numkong/dots/smehalf.h +47 -0
  193. package/numkong/include/numkong/dots/v128relaxed.h +317 -0
  194. package/numkong/include/numkong/dots.h +3110 -0
  195. package/numkong/include/numkong/dots.hpp +641 -0
  196. package/numkong/include/numkong/each/README.md +465 -0
  197. package/numkong/include/numkong/each/haswell.h +1658 -0
  198. package/numkong/include/numkong/each/icelake.h +272 -0
  199. package/numkong/include/numkong/each/neon.h +1138 -0
  200. package/numkong/include/numkong/each/neonbfdot.h +211 -0
  201. package/numkong/include/numkong/each/neonhalf.h +318 -0
  202. package/numkong/include/numkong/each/rvv.h +1121 -0
  203. package/numkong/include/numkong/each/sapphire.h +343 -0
  204. package/numkong/include/numkong/each/serial.h +282 -0
  205. package/numkong/include/numkong/each/skylake.h +1562 -0
  206. package/numkong/include/numkong/each/v128relaxed.h +562 -0
  207. package/numkong/include/numkong/each.h +2232 -0
  208. package/numkong/include/numkong/each.hpp +434 -0
  209. package/numkong/include/numkong/geospatial/README.md +147 -0
  210. package/numkong/include/numkong/geospatial/haswell.h +633 -0
  211. package/numkong/include/numkong/geospatial/neon.h +615 -0
  212. package/numkong/include/numkong/geospatial/rvv.h +701 -0
  213. package/numkong/include/numkong/geospatial/serial.h +309 -0
  214. package/numkong/include/numkong/geospatial/skylake.h +613 -0
  215. package/numkong/include/numkong/geospatial/v128relaxed.h +652 -0
  216. package/numkong/include/numkong/geospatial.h +453 -0
  217. package/numkong/include/numkong/geospatial.hpp +235 -0
  218. package/numkong/include/numkong/matrix.hpp +336 -0
  219. package/numkong/include/numkong/maxsim/README.md +187 -0
  220. package/numkong/include/numkong/maxsim/alder.h +511 -0
  221. package/numkong/include/numkong/maxsim/genoa.h +115 -0
  222. package/numkong/include/numkong/maxsim/haswell.h +553 -0
  223. package/numkong/include/numkong/maxsim/icelake.h +480 -0
  224. package/numkong/include/numkong/maxsim/neonsdot.h +394 -0
  225. package/numkong/include/numkong/maxsim/sapphireamx.h +877 -0
  226. package/numkong/include/numkong/maxsim/serial.h +490 -0
  227. package/numkong/include/numkong/maxsim/sme.h +993 -0
  228. package/numkong/include/numkong/maxsim/v128relaxed.h +280 -0
  229. package/numkong/include/numkong/maxsim.h +571 -0
  230. package/numkong/include/numkong/maxsim.hpp +133 -0
  231. package/numkong/include/numkong/mesh/README.md +219 -0
  232. package/numkong/include/numkong/mesh/haswell.h +2013 -0
  233. package/numkong/include/numkong/mesh/neon.h +1821 -0
  234. package/numkong/include/numkong/mesh/neonbfdot.h +771 -0
  235. package/numkong/include/numkong/mesh/rvv.h +936 -0
  236. package/numkong/include/numkong/mesh/serial.h +721 -0
  237. package/numkong/include/numkong/mesh/skylake.h +2344 -0
  238. package/numkong/include/numkong/mesh/v128relaxed.h +1081 -0
  239. package/numkong/include/numkong/mesh.h +666 -0
  240. package/numkong/include/numkong/mesh.hpp +701 -0
  241. package/numkong/include/numkong/numkong.h +78 -0
  242. package/numkong/include/numkong/numkong.hpp +58 -0
  243. package/numkong/include/numkong/probability/README.md +177 -0
  244. package/numkong/include/numkong/probability/haswell.h +267 -0
  245. package/numkong/include/numkong/probability/neon.h +255 -0
  246. package/numkong/include/numkong/probability/rvv.h +414 -0
  247. package/numkong/include/numkong/probability/serial.h +181 -0
  248. package/numkong/include/numkong/probability/skylake.h +324 -0
  249. package/numkong/include/numkong/probability.h +380 -0
  250. package/numkong/include/numkong/probability.hpp +120 -0
  251. package/numkong/include/numkong/random.h +50 -0
  252. package/numkong/include/numkong/random.hpp +285 -0
  253. package/numkong/include/numkong/reduce/README.md +552 -0
  254. package/numkong/include/numkong/reduce/alder.h +636 -0
  255. package/numkong/include/numkong/reduce/genoa.h +201 -0
  256. package/numkong/include/numkong/reduce/haswell.h +3785 -0
  257. package/numkong/include/numkong/reduce/icelake.h +549 -0
  258. package/numkong/include/numkong/reduce/neon.h +3980 -0
  259. package/numkong/include/numkong/reduce/neonbfdot.h +142 -0
  260. package/numkong/include/numkong/reduce/neonfhm.h +293 -0
  261. package/numkong/include/numkong/reduce/neonsdot.h +357 -0
  262. package/numkong/include/numkong/reduce/rvv.h +3533 -0
  263. package/numkong/include/numkong/reduce/serial.h +753 -0
  264. package/numkong/include/numkong/reduce/sierra.h +338 -0
  265. package/numkong/include/numkong/reduce/skylake.h +3794 -0
  266. package/numkong/include/numkong/reduce/sve.h +52 -0
  267. package/numkong/include/numkong/reduce/v128relaxed.h +2302 -0
  268. package/numkong/include/numkong/reduce.h +1582 -0
  269. package/numkong/include/numkong/reduce.hpp +778 -0
  270. package/numkong/include/numkong/scalar/README.md +89 -0
  271. package/numkong/include/numkong/scalar/haswell.h +122 -0
  272. package/numkong/include/numkong/scalar/loongsonasx.h +74 -0
  273. package/numkong/include/numkong/scalar/neon.h +122 -0
  274. package/numkong/include/numkong/scalar/neonhalf.h +70 -0
  275. package/numkong/include/numkong/scalar/powervsx.h +96 -0
  276. package/numkong/include/numkong/scalar/rvv.h +211 -0
  277. package/numkong/include/numkong/scalar/sapphire.h +74 -0
  278. package/numkong/include/numkong/scalar/serial.h +332 -0
  279. package/numkong/include/numkong/scalar/v128relaxed.h +56 -0
  280. package/numkong/include/numkong/scalar.h +696 -0
  281. package/numkong/include/numkong/set/README.md +179 -0
  282. package/numkong/include/numkong/set/haswell.h +334 -0
  283. package/numkong/include/numkong/set/icelake.h +485 -0
  284. package/numkong/include/numkong/set/loongsonasx.h +181 -0
  285. package/numkong/include/numkong/set/neon.h +363 -0
  286. package/numkong/include/numkong/set/powervsx.h +326 -0
  287. package/numkong/include/numkong/set/rvv.h +226 -0
  288. package/numkong/include/numkong/set/rvvbb.h +117 -0
  289. package/numkong/include/numkong/set/serial.h +174 -0
  290. package/numkong/include/numkong/set/sve.h +187 -0
  291. package/numkong/include/numkong/set/v128relaxed.h +240 -0
  292. package/numkong/include/numkong/set.h +471 -0
  293. package/numkong/include/numkong/set.hpp +114 -0
  294. package/numkong/include/numkong/sets/README.md +149 -0
  295. package/numkong/include/numkong/sets/haswell.h +63 -0
  296. package/numkong/include/numkong/sets/icelake.h +66 -0
  297. package/numkong/include/numkong/sets/loongsonasx.h +52 -0
  298. package/numkong/include/numkong/sets/neon.h +61 -0
  299. package/numkong/include/numkong/sets/powervsx.h +65 -0
  300. package/numkong/include/numkong/sets/serial.h +43 -0
  301. package/numkong/include/numkong/sets/smebi32.h +1135 -0
  302. package/numkong/include/numkong/sets/v128relaxed.h +58 -0
  303. package/numkong/include/numkong/sets.h +382 -0
  304. package/numkong/include/numkong/sparse/README.md +156 -0
  305. package/numkong/include/numkong/sparse/icelake.h +463 -0
  306. package/numkong/include/numkong/sparse/neon.h +288 -0
  307. package/numkong/include/numkong/sparse/serial.h +117 -0
  308. package/numkong/include/numkong/sparse/sve2.h +504 -0
  309. package/numkong/include/numkong/sparse/turin.h +322 -0
  310. package/numkong/include/numkong/sparse.h +363 -0
  311. package/numkong/include/numkong/sparse.hpp +113 -0
  312. package/numkong/include/numkong/spatial/README.md +439 -0
  313. package/numkong/include/numkong/spatial/alder.h +604 -0
  314. package/numkong/include/numkong/spatial/diamond.h +240 -0
  315. package/numkong/include/numkong/spatial/genoa.h +222 -0
  316. package/numkong/include/numkong/spatial/haswell.h +979 -0
  317. package/numkong/include/numkong/spatial/icelake.h +1067 -0
  318. package/numkong/include/numkong/spatial/loongsonasx.h +483 -0
  319. package/numkong/include/numkong/spatial/neon.h +846 -0
  320. package/numkong/include/numkong/spatial/neonbfdot.h +164 -0
  321. package/numkong/include/numkong/spatial/neonfp8.h +258 -0
  322. package/numkong/include/numkong/spatial/neonsdot.h +429 -0
  323. package/numkong/include/numkong/spatial/powervsx.h +738 -0
  324. package/numkong/include/numkong/spatial/rvv.h +991 -0
  325. package/numkong/include/numkong/spatial/rvvbf16.h +128 -0
  326. package/numkong/include/numkong/spatial/rvvhalf.h +120 -0
  327. package/numkong/include/numkong/spatial/serial.h +347 -0
  328. package/numkong/include/numkong/spatial/sierra.h +516 -0
  329. package/numkong/include/numkong/spatial/skylake.h +605 -0
  330. package/numkong/include/numkong/spatial/sve.h +246 -0
  331. package/numkong/include/numkong/spatial/svebfdot.h +125 -0
  332. package/numkong/include/numkong/spatial/svehalf.h +136 -0
  333. package/numkong/include/numkong/spatial/svesdot.h +143 -0
  334. package/numkong/include/numkong/spatial/v128relaxed.h +969 -0
  335. package/numkong/include/numkong/spatial.h +1681 -0
  336. package/numkong/include/numkong/spatial.hpp +183 -0
  337. package/numkong/include/numkong/spatials/README.md +580 -0
  338. package/numkong/include/numkong/spatials/alder.h +94 -0
  339. package/numkong/include/numkong/spatials/diamond.h +82 -0
  340. package/numkong/include/numkong/spatials/genoa.h +94 -0
  341. package/numkong/include/numkong/spatials/graniteamx.h +173 -0
  342. package/numkong/include/numkong/spatials/haswell.h +219 -0
  343. package/numkong/include/numkong/spatials/icelake.h +113 -0
  344. package/numkong/include/numkong/spatials/loongsonasx.h +153 -0
  345. package/numkong/include/numkong/spatials/neon.h +109 -0
  346. package/numkong/include/numkong/spatials/neonbfdot.h +60 -0
  347. package/numkong/include/numkong/spatials/neonfhm.h +92 -0
  348. package/numkong/include/numkong/spatials/neonfp8.h +111 -0
  349. package/numkong/include/numkong/spatials/neonsdot.h +143 -0
  350. package/numkong/include/numkong/spatials/powervsx.h +153 -0
  351. package/numkong/include/numkong/spatials/rvv.h +1976 -0
  352. package/numkong/include/numkong/spatials/sapphireamx.h +1149 -0
  353. package/numkong/include/numkong/spatials/serial.h +248 -0
  354. package/numkong/include/numkong/spatials/sierra.h +96 -0
  355. package/numkong/include/numkong/spatials/skylake.h +184 -0
  356. package/numkong/include/numkong/spatials/sme.h +1927 -0
  357. package/numkong/include/numkong/spatials/smef64.h +483 -0
  358. package/numkong/include/numkong/spatials/v128relaxed.h +240 -0
  359. package/numkong/include/numkong/spatials.h +3374 -0
  360. package/numkong/include/numkong/spatials.hpp +509 -0
  361. package/numkong/include/numkong/tensor.hpp +1981 -0
  362. package/numkong/include/numkong/trigonometry/README.md +184 -0
  363. package/numkong/include/numkong/trigonometry/haswell.h +653 -0
  364. package/numkong/include/numkong/trigonometry/neon.h +638 -0
  365. package/numkong/include/numkong/trigonometry/rvv.h +700 -0
  366. package/numkong/include/numkong/trigonometry/serial.h +703 -0
  367. package/numkong/include/numkong/trigonometry/skylake.h +725 -0
  368. package/numkong/include/numkong/trigonometry/v128relaxed.h +667 -0
  369. package/numkong/include/numkong/trigonometry.h +467 -0
  370. package/numkong/include/numkong/trigonometry.hpp +166 -0
  371. package/numkong/include/numkong/types.h +1695 -0
  372. package/numkong/include/numkong/types.hpp +6027 -0
  373. package/numkong/include/numkong/vector.hpp +766 -0
  374. package/numkong/javascript/@numkong-darwin-arm64/package.json +26 -0
  375. package/numkong/javascript/@numkong-darwin-x64/package.json +26 -0
  376. package/numkong/javascript/@numkong-linux-arm64/package.json +25 -0
  377. package/numkong/javascript/@numkong-linux-x64/package.json +25 -0
  378. package/numkong/javascript/@numkong-win32-arm64/package.json +25 -0
  379. package/numkong/javascript/@numkong-win32-x64/package.json +25 -0
  380. package/numkong/javascript/README.md +254 -0
  381. package/numkong/javascript/node-gyp-build.d.ts +4 -0
  382. package/numkong/javascript/numkong-browser.ts +40 -0
  383. package/numkong/javascript/numkong-wasm.ts +750 -0
  384. package/numkong/javascript/numkong.c +712 -0
  385. package/numkong/javascript/numkong.ts +613 -0
  386. package/{simsimd → numkong}/javascript/tsconfig-base.json +6 -3
  387. package/numkong/javascript/tsconfig-cjs.json +13 -0
  388. package/{simsimd → numkong}/javascript/tsconfig-esm.json +1 -1
  389. package/numkong/javascript/types.ts +784 -0
  390. package/numkong/numkong.gypi +104 -0
  391. package/numkong/package.json +108 -0
  392. package/numkong/probes/arm_neon.c +8 -0
  393. package/numkong/probes/arm_neon_bfdot.c +9 -0
  394. package/numkong/probes/arm_neon_fhm.c +9 -0
  395. package/numkong/probes/arm_neon_half.c +8 -0
  396. package/numkong/probes/arm_neon_sdot.c +9 -0
  397. package/numkong/probes/arm_neonfp8.c +9 -0
  398. package/numkong/probes/arm_sme.c +16 -0
  399. package/numkong/probes/arm_sme2.c +16 -0
  400. package/numkong/probes/arm_sme2p1.c +16 -0
  401. package/numkong/probes/arm_sme_bf16.c +16 -0
  402. package/numkong/probes/arm_sme_bi32.c +16 -0
  403. package/numkong/probes/arm_sme_f64.c +16 -0
  404. package/numkong/probes/arm_sme_fa64.c +14 -0
  405. package/numkong/probes/arm_sme_half.c +16 -0
  406. package/numkong/probes/arm_sme_lut2.c +15 -0
  407. package/numkong/probes/arm_sve.c +18 -0
  408. package/numkong/probes/arm_sve2.c +20 -0
  409. package/numkong/probes/arm_sve2p1.c +18 -0
  410. package/numkong/probes/arm_sve_bfdot.c +20 -0
  411. package/numkong/probes/arm_sve_half.c +18 -0
  412. package/numkong/probes/arm_sve_sdot.c +21 -0
  413. package/numkong/probes/loongarch_lasx.c +12 -0
  414. package/numkong/probes/power_vsx.c +12 -0
  415. package/numkong/probes/probe.js +127 -0
  416. package/numkong/probes/riscv_rvv.c +14 -0
  417. package/numkong/probes/riscv_rvv_bb.c +15 -0
  418. package/numkong/probes/riscv_rvv_bf16.c +17 -0
  419. package/numkong/probes/riscv_rvv_half.c +14 -0
  420. package/numkong/probes/wasm_v128relaxed.c +11 -0
  421. package/numkong/probes/x86_alder.c +17 -0
  422. package/numkong/probes/x86_diamond.c +17 -0
  423. package/numkong/probes/x86_genoa.c +17 -0
  424. package/numkong/probes/x86_graniteamx.c +19 -0
  425. package/numkong/probes/x86_haswell.c +11 -0
  426. package/numkong/probes/x86_icelake.c +17 -0
  427. package/numkong/probes/x86_sapphire.c +16 -0
  428. package/numkong/probes/x86_sapphireamx.c +18 -0
  429. package/numkong/probes/x86_sierra.c +17 -0
  430. package/numkong/probes/x86_skylake.c +15 -0
  431. package/numkong/probes/x86_turin.c +17 -0
  432. package/numkong/rust/README.md +698 -0
  433. package/numkong/rust/capabilities.rs +96 -0
  434. package/numkong/rust/cast.rs +314 -0
  435. package/numkong/rust/curved.rs +391 -0
  436. package/numkong/rust/each.rs +2721 -0
  437. package/numkong/rust/geospatial.rs +343 -0
  438. package/numkong/rust/matrix.rs +5424 -0
  439. package/numkong/rust/maxsim.rs +540 -0
  440. package/numkong/rust/mesh.rs +837 -0
  441. package/numkong/rust/numkong.rs +409 -0
  442. package/numkong/rust/probability.rs +272 -0
  443. package/numkong/rust/reduce.rs +1249 -0
  444. package/numkong/rust/set.rs +194 -0
  445. package/numkong/rust/sparse.rs +513 -0
  446. package/numkong/rust/spatial.rs +1815 -0
  447. package/numkong/rust/tensor.rs +7565 -0
  448. package/numkong/rust/types.rs +3666 -0
  449. package/numkong/rust/vector.rs +1899 -0
  450. package/numkong/rustfmt.toml +2 -0
  451. package/numkong/swift/Matrix.swift +1388 -0
  452. package/numkong/swift/MaxSim.swift +151 -0
  453. package/numkong/swift/NumKong.swift +283 -0
  454. package/numkong/swift/Numerics.swift +329 -0
  455. package/numkong/swift/README.md +433 -0
  456. package/numkong/swift/Scalar.swift +741 -0
  457. package/numkong/swift/Tensor.swift +209 -0
  458. package/numkong/test/README.md +315 -0
  459. package/numkong/test/playwright.config.ts +16 -0
  460. package/numkong/test/swift/Test.swift +534 -0
  461. package/numkong/test/test-browser-bundle-runner.mjs +36 -0
  462. package/numkong/test/test-browser-bundle.html +188 -0
  463. package/numkong/test/test-browser-runner.mjs +43 -0
  464. package/numkong/test/test-browser.html +305 -0
  465. package/numkong/test/test-dtypes.mjs +453 -0
  466. package/numkong/test/test-wasm.mjs +267 -0
  467. package/numkong/test/test.cpp +442 -0
  468. package/numkong/test/test.hpp +580 -0
  469. package/numkong/test/test.mjs +363 -0
  470. package/numkong/test/test_base.py +1041 -0
  471. package/numkong/test/test_cast.cpp +242 -0
  472. package/numkong/test/test_cross.hpp +551 -0
  473. package/numkong/test/test_cross.py +467 -0
  474. package/numkong/test/test_cross_amx.cpp +50 -0
  475. package/numkong/test/test_cross_arm.cpp +225 -0
  476. package/numkong/test/test_cross_blas.cpp +354 -0
  477. package/numkong/test/test_cross_loongarch.cpp +90 -0
  478. package/numkong/test/test_cross_power.cpp +73 -0
  479. package/numkong/test/test_cross_rvv.cpp +109 -0
  480. package/numkong/test/test_cross_serial.cpp +181 -0
  481. package/numkong/test/test_cross_sme.cpp +148 -0
  482. package/numkong/test/test_cross_wasm.cpp +141 -0
  483. package/numkong/test/test_cross_x86.cpp +442 -0
  484. package/numkong/test/test_curved.cpp +182 -0
  485. package/numkong/test/test_curved.py +207 -0
  486. package/numkong/test/test_dot.cpp +353 -0
  487. package/numkong/test/test_dot.py +296 -0
  488. package/numkong/test/test_each.cpp +437 -0
  489. package/numkong/test/test_each.py +756 -0
  490. package/numkong/test/test_geospatial.cpp +155 -0
  491. package/numkong/test/test_geospatial.py +241 -0
  492. package/numkong/test/test_maxsim.cpp +138 -0
  493. package/numkong/test/test_maxsim.py +209 -0
  494. package/numkong/test/test_mesh.cpp +203 -0
  495. package/numkong/test/test_mesh.py +394 -0
  496. package/numkong/test/test_probability.cpp +136 -0
  497. package/numkong/test/test_probability.py +166 -0
  498. package/numkong/test/test_reduce.cpp +563 -0
  499. package/numkong/test/test_reduce.py +781 -0
  500. package/numkong/test/test_set.cpp +151 -0
  501. package/numkong/test/test_set.py +120 -0
  502. package/numkong/test/test_similarities.py +579 -0
  503. package/numkong/test/test_sparse.cpp +121 -0
  504. package/numkong/test/test_sparse.py +118 -0
  505. package/numkong/test/test_spatial.cpp +518 -0
  506. package/numkong/test/test_spatial.py +269 -0
  507. package/numkong/test/test_tensor.cpp +884 -0
  508. package/numkong/test/test_tensor.py +1417 -0
  509. package/numkong/test/test_trigonometry.cpp +156 -0
  510. package/numkong/test/test_trigonometry.py +180 -0
  511. package/package.json +7 -8
  512. package/prebuilds/darwin-arm64+x64/usearch.node +0 -0
  513. package/prebuilds/linux-arm64/usearch.node +0 -0
  514. package/prebuilds/linux-x64/usearch.node +0 -0
  515. package/fp16/CMakeLists.txt +0 -176
  516. package/fp16/LICENSE +0 -11
  517. package/fp16/README.md +0 -20
  518. package/fp16/bench/alt-element.cc +0 -89
  519. package/fp16/bench/from-alt-array.cc +0 -175
  520. package/fp16/bench/from-ieee-array.cc +0 -399
  521. package/fp16/bench/ieee-element.cc +0 -272
  522. package/fp16/bench/to-alt-array.cc +0 -91
  523. package/fp16/bench/to-ieee-array.cc +0 -303
  524. package/fp16/cmake/DownloadGoogleBenchmark.cmake +0 -15
  525. package/fp16/cmake/DownloadGoogleTest.cmake +0 -15
  526. package/fp16/cmake/DownloadPSimd.cmake +0 -15
  527. package/fp16/configure.py +0 -65
  528. package/fp16/confu.yaml +0 -8
  529. package/fp16/include/fp16/__init__.py +0 -0
  530. package/fp16/include/fp16/avx.py +0 -50
  531. package/fp16/include/fp16/avx2.py +0 -53
  532. package/fp16/include/fp16/bitcasts.h +0 -92
  533. package/fp16/include/fp16/fp16.h +0 -451
  534. package/fp16/include/fp16/psimd.h +0 -131
  535. package/fp16/include/fp16.h +0 -11
  536. package/fp16/jni/Android.mk +0 -6
  537. package/fp16/jni/Application.mk +0 -4
  538. package/fp16/test/alt-from-fp32-value.cc +0 -498
  539. package/fp16/test/alt-to-fp32-bits.cc +0 -263
  540. package/fp16/test/alt-to-fp32-psimd.cc +0 -145
  541. package/fp16/test/alt-to-fp32-value.cc +0 -348
  542. package/fp16/test/alt-to-fp32x2-psimd.cc +0 -245
  543. package/fp16/test/bitcasts.cc +0 -56
  544. package/fp16/test/ieee-from-fp32-value.cc +0 -523
  545. package/fp16/test/ieee-to-fp32-bits.cc +0 -333
  546. package/fp16/test/ieee-to-fp32-psimd.cc +0 -312
  547. package/fp16/test/ieee-to-fp32-value.cc +0 -420
  548. package/fp16/test/ieee-to-fp32x2-psimd.cc +0 -541
  549. package/fp16/test/peachpy/alt-xmm-to-fp32-xmm-avx.cc +0 -96
  550. package/fp16/test/peachpy/alt-xmm-to-fp32-ymm-avx2.cc +0 -96
  551. package/fp16/test/peachpy/stubs.py +0 -38
  552. package/fp16/test/tables.cc +0 -530
  553. package/fp16/test/tables.h +0 -13
  554. package/fp16/third-party/THHalf.h +0 -92
  555. package/fp16/third-party/eigen-half.h +0 -170
  556. package/fp16/third-party/float16-compressor.h +0 -80
  557. package/fp16/third-party/half.hpp +0 -2916
  558. package/fp16/third-party/npy-halffloat.h +0 -328
  559. package/simsimd/.git-blame-ignore-revs +0 -2
  560. package/simsimd/CONTRIBUTING.md +0 -321
  561. package/simsimd/Cargo.toml +0 -49
  562. package/simsimd/MANIFEST.in +0 -4
  563. package/simsimd/Package.swift +0 -28
  564. package/simsimd/README.md +0 -1493
  565. package/simsimd/binding.gyp +0 -35
  566. package/simsimd/build.rs +0 -70
  567. package/simsimd/c/lib.c +0 -374
  568. package/simsimd/include/module.modulemap +0 -4
  569. package/simsimd/include/simsimd/binary.h +0 -486
  570. package/simsimd/include/simsimd/curved.h +0 -1541
  571. package/simsimd/include/simsimd/dot.h +0 -1853
  572. package/simsimd/include/simsimd/elementwise.h +0 -2465
  573. package/simsimd/include/simsimd/geospatial.h +0 -43
  574. package/simsimd/include/simsimd/mesh.h +0 -69
  575. package/simsimd/include/simsimd/probability.h +0 -606
  576. package/simsimd/include/simsimd/simsimd.h +0 -2567
  577. package/simsimd/include/simsimd/sparse.h +0 -1384
  578. package/simsimd/include/simsimd/spatial.h +0 -2335
  579. package/simsimd/include/simsimd/types.h +0 -666
  580. package/simsimd/javascript/fallback.ts +0 -233
  581. package/simsimd/javascript/lib.c +0 -125
  582. package/simsimd/javascript/node-gyp-build.d.ts +0 -1
  583. package/simsimd/javascript/simsimd.ts +0 -179
  584. package/simsimd/javascript/tsconfig-cjs.json +0 -8
  585. package/simsimd/package-lock.json +0 -1761
  586. package/simsimd/package.json +0 -61
  587. package/simsimd/rust/lib.rs +0 -1821
  588. package/simsimd/scripts/bench.cxx +0 -1170
  589. package/simsimd/scripts/bench.ipynb +0 -187
  590. package/simsimd/scripts/bench.js +0 -127
  591. package/simsimd/scripts/bench.rs +0 -876
  592. package/simsimd/scripts/bench_vectors.py +0 -734
  593. package/simsimd/scripts/bench_vectors_live.py +0 -213
  594. package/simsimd/scripts/test.c +0 -187
  595. package/simsimd/scripts/test.mjs +0 -220
  596. package/simsimd/scripts/test.py +0 -1505
  597. package/simsimd/swift/SimSIMD.swift +0 -149
  598. package/simsimd/swift/Test.swift +0 -128
  599. /package/{simsimd → numkong}/CODE_OF_CONDUCT.md +0 -0
  600. /package/{simsimd → numkong}/LICENSE +0 -0
  601. /package/{simsimd → numkong}/javascript/dist-package-cjs.json +0 -0
  602. /package/{simsimd → numkong}/javascript/dist-package-esm.json +0 -0
@@ -0,0 +1,506 @@
1
+ // Bench.swift
2
+ // NumKong
3
+ //
4
+ // XCTest performance benchmarks for NumKong.
5
+ // Run on-device (iPad, iPhone, Mac) via:
6
+ // xcodebuild test -scheme NumKong -destination 'platform=iOS,name=...' -only-testing Bench
7
+ // Or locally:
8
+ // swift test --filter Bench
9
+ //
10
+ // Environment variables (matching C++ nk_bench):
11
+ // NK_DENSE_DIMENSIONS — pairwise vector length (default 1536)
12
+ // NK_MATRIX_HEIGHT — GEMM M / dataset rows (default 1024)
13
+ // NK_MATRIX_WIDTH — GEMM N / query rows (default 128)
14
+ // NK_MATRIX_DEPTH — GEMM K / vector dims (default 1536)
15
+
16
+ #if canImport(Darwin)
17
+
18
+ import CNumKong
19
+ import NumKong
20
+ import XCTest
21
+
22
+ // MARK: - Configuration
23
+
24
+ private func env(_ key: String, default d: Int) -> Int {
25
+ if let v = ProcessInfo.processInfo.environment[key], let i = Int(v) { return i }
26
+ return d
27
+ }
28
+
29
+ private let denseDims = env("NK_DENSE_DIMENSIONS", default: 1536)
30
+ private let matrixHeight = env("NK_MATRIX_HEIGHT", default: 1024)
31
+ private let matrixWidth = env("NK_MATRIX_WIDTH", default: 128)
32
+ private let matrixDepth = env("NK_MATRIX_DEPTH", default: 1536)
33
+ private let pairwiseReps = 10_000
34
+
35
+ // MARK: - Random Generators
36
+
37
+ private func randomFloat64(_ n: Int) -> [Float64] {
38
+ (0..<n).map { _ in Float64.random(in: -1...1) }
39
+ }
40
+
41
+ private func randomFloat32(_ n: Int) -> [Float32] {
42
+ (0..<n).map { _ in Float32.random(in: -1...1) }
43
+ }
44
+
45
+ #if !arch(x86_64)
46
+ @available(macOS 11.0, iOS 14.0, tvOS 14.0, watchOS 7.0, *)
47
+ private func randomFloat16(_ n: Int) -> [Float16] {
48
+ (0..<n).map { _ in Float16.random(in: -1...1) }
49
+ }
50
+ #endif // !arch(x86_64)
51
+
52
+ private func randomInt8(_ n: Int) -> [Int8] {
53
+ (0..<n).map { _ in Int8.random(in: .min ... .max) }
54
+ }
55
+
56
+ private func randomUInt8(_ n: Int) -> [UInt8] {
57
+ (0..<n).map { _ in UInt8.random(in: .min ... .max) }
58
+ }
59
+
60
+ private func randomBFloat16(_ n: Int) -> [BFloat16] {
61
+ (0..<n).map { _ in BFloat16(float: Float32.random(in: -1...1)) }
62
+ }
63
+
64
+ private func randomE4M3(_ n: Int) -> [E4M3] {
65
+ (0..<n).map { _ in E4M3(float: Float32.random(in: -1...1)) }
66
+ }
67
+
68
+ private func randomE5M2(_ n: Int) -> [E5M2] {
69
+ (0..<n).map { _ in E5M2(float: Float32.random(in: -1...1)) }
70
+ }
71
+
72
+ private func randomE2M3(_ n: Int) -> [E2M3] {
73
+ (0..<n).map { _ in E2M3(float: Float32.random(in: -1...1)) }
74
+ }
75
+
76
+ private func randomE3M2(_ n: Int) -> [E3M2] {
77
+ (0..<n).map { _ in E3M2(float: Float32.random(in: -1...1)) }
78
+ }
79
+
80
+ private func randomU1x8(_ n: Int) -> [U1x8] {
81
+ (0..<n).map { _ in U1x8(UInt8.random(in: .min ... .max)) }
82
+ }
83
+
84
+ // MARK: - Capability Detection
85
+
86
+ private func capabilityNames(_ caps: nk_capability_t) -> String {
87
+ var names: [String] = []
88
+ if caps & 1 != 0 { names.append("serial") }
89
+ if caps & (1 << 1) != 0 { names.append("neon") }
90
+ if caps & (1 << 2) != 0 { names.append("haswell") }
91
+ if caps & (1 << 3) != 0 { names.append("skylake") }
92
+ if caps & (1 << 4) != 0 { names.append("neon_fp16") }
93
+ if caps & (1 << 5) != 0 { names.append("neon_sdot") }
94
+ if caps & (1 << 6) != 0 { names.append("neon_fhm") }
95
+ if caps & (1 << 7) != 0 { names.append("icelake") }
96
+ if caps & (1 << 8) != 0 { names.append("genoa") }
97
+ if caps & (1 << 9) != 0 { names.append("neon_bf16") }
98
+ if caps & (1 << 10) != 0 { names.append("sve") }
99
+ if caps & (1 << 11) != 0 { names.append("sve_fp16") }
100
+ if caps & (1 << 12) != 0 { names.append("sve_sdot") }
101
+ if caps & (1 << 17) != 0 { names.append("sapphire") }
102
+ if caps & (1 << 24) != 0 { names.append("sme") }
103
+ if caps & (1 << 25) != 0 { names.append("sme2") }
104
+ return names.joined(separator: ", ")
105
+ }
106
+
107
+ // MARK: - Serial Dispatch Helper
108
+
109
+ private func withSerialDispatch(_ body: () -> Void) {
110
+ nk_dispatch_table_update(1) // nk_cap_serial_k
111
+ defer { nk_dispatch_table_update(nk_capabilities()) }
112
+ body()
113
+ }
114
+
115
+ // MARK: - Pairwise Benchmark Helpers
116
+
117
+ extension XCTestCase {
118
+ /// Benchmarks a pairwise operation over `pairwiseReps` iterations, with optional serial-only dispatch.
119
+ func benchPairwise<T>(_ make: (Int) -> [T], _ op: @escaping ([T], [T]) -> Any?, serial: Bool = false) {
120
+ let dims = T.self == U1x8.self ? denseDims / 8 : denseDims
121
+ let a = make(dims)
122
+ let b = make(dims)
123
+ let body = { self.measure(metrics: [XCTClockMetric()]) { for _ in 0..<pairwiseReps { _ = op(a, b) } } }
124
+ if serial { withSerialDispatch(body) } else { body() }
125
+ }
126
+
127
+ /// Benchmarks a packed matrix operation, with optional serial-only dispatch.
128
+ func benchPacked<T: NumKongDotsMatrixElement>(
129
+ _ make: (Int) -> [T], serial: Bool = false, _ op: @escaping (Tensor<T>, PackedMatrix<T>) throws -> Any
130
+ ) throws {
131
+ let depth = T.self == U1x8.self ? matrixDepth / 8 : matrixDepth
132
+ let a = try Tensor<T>.fromArray(make(matrixHeight * depth), rows: matrixHeight, cols: depth)
133
+ let b = try Tensor<T>.fromArray(make(matrixWidth * depth), rows: matrixWidth, cols: depth)
134
+ let packed = try b.packForDots()
135
+ let body = { self.measure(metrics: [XCTClockMetric()]) { _ = try! op(a, packed) } }
136
+ if serial { withSerialDispatch(body) } else { body() }
137
+ }
138
+
139
+ /// Benchmarks a symmetric matrix operation, with optional serial-only dispatch.
140
+ func benchSymmetric<T>(_ make: (Int) -> [T], serial: Bool = false, _ op: @escaping (Tensor<T>) throws -> Any) throws
141
+ {
142
+ let depth = T.self == U1x8.self ? matrixDepth / 8 : matrixDepth
143
+ let a = try Tensor<T>.fromArray(make(matrixHeight * depth), rows: matrixHeight, cols: depth)
144
+ let body = { self.measure(metrics: [XCTClockMetric()]) { _ = try! op(a) } }
145
+ if serial { withSerialDispatch(body) } else { body() }
146
+ }
147
+ }
148
+
149
+ // MARK: - Info
150
+
151
+ final class BenchInfo: XCTestCase {
152
+ func testCapabilities() {
153
+ let caps = nk_capabilities()
154
+ let dynamic = nk_uses_dynamic_dispatch()
155
+ print("Capabilities: \(caps) [\(capabilityNames(caps))]")
156
+ print("Dynamic dispatch: \(dynamic != 0 ? "YES" : "NO")")
157
+ print("Dense dimensions: \(denseDims)")
158
+ print("Matrix: \(matrixHeight)×\(matrixDepth) × \(matrixWidth)×\(matrixDepth)")
159
+ }
160
+ }
161
+
162
+ // MARK: - Pairwise: Dot
163
+
164
+ final class BenchDot: XCTestCase {
165
+ func testFloat64() { benchPairwise(randomFloat64) { $0.dot($1) } }
166
+ func testFloat64Serial() { benchPairwise(randomFloat64, { $0.dot($1) }, serial: true) }
167
+ func testFloat32() { benchPairwise(randomFloat32) { $0.dot($1) } }
168
+ func testFloat32Serial() { benchPairwise(randomFloat32, { $0.dot($1) }, serial: true) }
169
+ #if !arch(x86_64)
170
+ @available(macOS 11.0, iOS 14.0, tvOS 14.0, watchOS 7.0, *)
171
+ func testFloat16() { benchPairwise(randomFloat16) { $0.dot($1) } }
172
+ @available(macOS 11.0, iOS 14.0, tvOS 14.0, watchOS 7.0, *)
173
+ func testFloat16Serial() { benchPairwise(randomFloat16, { $0.dot($1) }, serial: true) }
174
+ #endif // !arch(x86_64)
175
+ func testBFloat16() { benchPairwise(randomBFloat16) { $0.dot($1) } }
176
+ func testBFloat16Serial() { benchPairwise(randomBFloat16, { $0.dot($1) }, serial: true) }
177
+ func testInt8() { benchPairwise(randomInt8) { $0.dot($1) } }
178
+ func testInt8Serial() { benchPairwise(randomInt8, { $0.dot($1) }, serial: true) }
179
+ func testUInt8() { benchPairwise(randomUInt8) { $0.dot($1) } }
180
+ func testUInt8Serial() { benchPairwise(randomUInt8, { $0.dot($1) }, serial: true) }
181
+ func testE4M3() { benchPairwise(randomE4M3) { $0.dot($1) } }
182
+ func testE4M3Serial() { benchPairwise(randomE4M3, { $0.dot($1) }, serial: true) }
183
+ func testE5M2() { benchPairwise(randomE5M2) { $0.dot($1) } }
184
+ func testE5M2Serial() { benchPairwise(randomE5M2, { $0.dot($1) }, serial: true) }
185
+ func testE2M3() { benchPairwise(randomE2M3) { $0.dot($1) } }
186
+ func testE2M3Serial() { benchPairwise(randomE2M3, { $0.dot($1) }, serial: true) }
187
+ func testE3M2() { benchPairwise(randomE3M2) { $0.dot($1) } }
188
+ func testE3M2Serial() { benchPairwise(randomE3M2, { $0.dot($1) }, serial: true) }
189
+ func testU1x8() { benchPairwise(randomU1x8) { $0.dot($1) } }
190
+ func testU1x8Serial() { benchPairwise(randomU1x8, { $0.dot($1) }, serial: true) }
191
+ }
192
+
193
+ // MARK: - Pairwise: Angular
194
+
195
+ final class BenchAngular: XCTestCase {
196
+ func testFloat64() { benchPairwise(randomFloat64) { $0.angular($1) } }
197
+ func testFloat64Serial() { benchPairwise(randomFloat64, { $0.angular($1) }, serial: true) }
198
+ func testFloat32() { benchPairwise(randomFloat32) { $0.angular($1) } }
199
+ func testFloat32Serial() { benchPairwise(randomFloat32, { $0.angular($1) }, serial: true) }
200
+ #if !arch(x86_64)
201
+ @available(macOS 11.0, iOS 14.0, tvOS 14.0, watchOS 7.0, *)
202
+ func testFloat16() { benchPairwise(randomFloat16) { $0.angular($1) } }
203
+ @available(macOS 11.0, iOS 14.0, tvOS 14.0, watchOS 7.0, *)
204
+ func testFloat16Serial() { benchPairwise(randomFloat16, { $0.angular($1) }, serial: true) }
205
+ #endif // !arch(x86_64)
206
+ func testBFloat16() { benchPairwise(randomBFloat16) { $0.angular($1) } }
207
+ func testBFloat16Serial() { benchPairwise(randomBFloat16, { $0.angular($1) }, serial: true) }
208
+ func testInt8() { benchPairwise(randomInt8) { $0.angular($1) } }
209
+ func testInt8Serial() { benchPairwise(randomInt8, { $0.angular($1) }, serial: true) }
210
+ func testUInt8() { benchPairwise(randomUInt8) { $0.angular($1) } }
211
+ func testUInt8Serial() { benchPairwise(randomUInt8, { $0.angular($1) }, serial: true) }
212
+ func testE4M3() { benchPairwise(randomE4M3) { $0.angular($1) } }
213
+ func testE4M3Serial() { benchPairwise(randomE4M3, { $0.angular($1) }, serial: true) }
214
+ func testE5M2() { benchPairwise(randomE5M2) { $0.angular($1) } }
215
+ func testE5M2Serial() { benchPairwise(randomE5M2, { $0.angular($1) }, serial: true) }
216
+ func testE2M3() { benchPairwise(randomE2M3) { $0.angular($1) } }
217
+ func testE2M3Serial() { benchPairwise(randomE2M3, { $0.angular($1) }, serial: true) }
218
+ func testE3M2() { benchPairwise(randomE3M2) { $0.angular($1) } }
219
+ func testE3M2Serial() { benchPairwise(randomE3M2, { $0.angular($1) }, serial: true) }
220
+ }
221
+
222
+ // MARK: - Pairwise: Euclidean
223
+
224
+ final class BenchEuclidean: XCTestCase {
225
+ func testFloat64() { benchPairwise(randomFloat64) { $0.euclidean($1) } }
226
+ func testFloat64Serial() { benchPairwise(randomFloat64, { $0.euclidean($1) }, serial: true) }
227
+ func testFloat32() { benchPairwise(randomFloat32) { $0.euclidean($1) } }
228
+ func testFloat32Serial() { benchPairwise(randomFloat32, { $0.euclidean($1) }, serial: true) }
229
+ #if !arch(x86_64)
230
+ @available(macOS 11.0, iOS 14.0, tvOS 14.0, watchOS 7.0, *)
231
+ func testFloat16() { benchPairwise(randomFloat16) { $0.euclidean($1) } }
232
+ @available(macOS 11.0, iOS 14.0, tvOS 14.0, watchOS 7.0, *)
233
+ func testFloat16Serial() { benchPairwise(randomFloat16, { $0.euclidean($1) }, serial: true) }
234
+ #endif // !arch(x86_64)
235
+ func testBFloat16() { benchPairwise(randomBFloat16) { $0.euclidean($1) } }
236
+ func testBFloat16Serial() { benchPairwise(randomBFloat16, { $0.euclidean($1) }, serial: true) }
237
+ func testInt8() { benchPairwise(randomInt8) { $0.euclidean($1) } }
238
+ func testInt8Serial() { benchPairwise(randomInt8, { $0.euclidean($1) }, serial: true) }
239
+ func testUInt8() { benchPairwise(randomUInt8) { $0.euclidean($1) } }
240
+ func testUInt8Serial() { benchPairwise(randomUInt8, { $0.euclidean($1) }, serial: true) }
241
+ func testE4M3() { benchPairwise(randomE4M3) { $0.euclidean($1) } }
242
+ func testE4M3Serial() { benchPairwise(randomE4M3, { $0.euclidean($1) }, serial: true) }
243
+ func testE5M2() { benchPairwise(randomE5M2) { $0.euclidean($1) } }
244
+ func testE5M2Serial() { benchPairwise(randomE5M2, { $0.euclidean($1) }, serial: true) }
245
+ func testE2M3() { benchPairwise(randomE2M3) { $0.euclidean($1) } }
246
+ func testE2M3Serial() { benchPairwise(randomE2M3, { $0.euclidean($1) }, serial: true) }
247
+ func testE3M2() { benchPairwise(randomE3M2) { $0.euclidean($1) } }
248
+ func testE3M2Serial() { benchPairwise(randomE3M2, { $0.euclidean($1) }, serial: true) }
249
+ }
250
+
251
+ // MARK: - Pairwise: Squared Euclidean
252
+
253
+ final class BenchSqEuclidean: XCTestCase {
254
+ func testFloat64() { benchPairwise(randomFloat64) { $0.sqeuclidean($1) } }
255
+ func testFloat64Serial() { benchPairwise(randomFloat64, { $0.sqeuclidean($1) }, serial: true) }
256
+ func testFloat32() { benchPairwise(randomFloat32) { $0.sqeuclidean($1) } }
257
+ func testFloat32Serial() { benchPairwise(randomFloat32, { $0.sqeuclidean($1) }, serial: true) }
258
+ #if !arch(x86_64)
259
+ @available(macOS 11.0, iOS 14.0, tvOS 14.0, watchOS 7.0, *)
260
+ func testFloat16() { benchPairwise(randomFloat16) { $0.sqeuclidean($1) } }
261
+ @available(macOS 11.0, iOS 14.0, tvOS 14.0, watchOS 7.0, *)
262
+ func testFloat16Serial() { benchPairwise(randomFloat16, { $0.sqeuclidean($1) }, serial: true) }
263
+ #endif // !arch(x86_64)
264
+ func testBFloat16() { benchPairwise(randomBFloat16) { $0.sqeuclidean($1) } }
265
+ func testBFloat16Serial() { benchPairwise(randomBFloat16, { $0.sqeuclidean($1) }, serial: true) }
266
+ func testInt8() { benchPairwise(randomInt8) { $0.sqeuclidean($1) } }
267
+ func testInt8Serial() { benchPairwise(randomInt8, { $0.sqeuclidean($1) }, serial: true) }
268
+ func testUInt8() { benchPairwise(randomUInt8) { $0.sqeuclidean($1) } }
269
+ func testUInt8Serial() { benchPairwise(randomUInt8, { $0.sqeuclidean($1) }, serial: true) }
270
+ func testE4M3() { benchPairwise(randomE4M3) { $0.sqeuclidean($1) } }
271
+ func testE4M3Serial() { benchPairwise(randomE4M3, { $0.sqeuclidean($1) }, serial: true) }
272
+ func testE5M2() { benchPairwise(randomE5M2) { $0.sqeuclidean($1) } }
273
+ func testE5M2Serial() { benchPairwise(randomE5M2, { $0.sqeuclidean($1) }, serial: true) }
274
+ func testE2M3() { benchPairwise(randomE2M3) { $0.sqeuclidean($1) } }
275
+ func testE2M3Serial() { benchPairwise(randomE2M3, { $0.sqeuclidean($1) }, serial: true) }
276
+ func testE3M2() { benchPairwise(randomE3M2) { $0.sqeuclidean($1) } }
277
+ func testE3M2Serial() { benchPairwise(randomE3M2, { $0.sqeuclidean($1) }, serial: true) }
278
+ }
279
+
280
+ // MARK: - Pairwise: Hamming (binary)
281
+
282
+ final class BenchHamming: XCTestCase {
283
+ func testU1x8() { benchPairwise(randomU1x8) { $0.hamming($1) } }
284
+ func testU1x8Serial() { benchPairwise(randomU1x8, { $0.hamming($1) }, serial: true) }
285
+ }
286
+
287
+ // MARK: - Pairwise: Jaccard (binary)
288
+
289
+ final class BenchJaccard: XCTestCase {
290
+ func testU1x8() { benchPairwise(randomU1x8) { $0.jaccard($1) } }
291
+ func testU1x8Serial() { benchPairwise(randomU1x8, { $0.jaccard($1) }, serial: true) }
292
+ }
293
+
294
+ // MARK: - Packed: Dots
295
+
296
+ final class BenchDotsPacked: XCTestCase {
297
+ func testFloat64() throws { try benchPacked(randomFloat64) { try $0.dotsPacked($1) } }
298
+ func testFloat64Serial() throws { try benchPacked(randomFloat64, serial: true) { try $0.dotsPacked($1) } }
299
+ func testFloat32() throws { try benchPacked(randomFloat32) { try $0.dotsPacked($1) } }
300
+ func testFloat32Serial() throws { try benchPacked(randomFloat32, serial: true) { try $0.dotsPacked($1) } }
301
+ #if !arch(x86_64)
302
+ @available(macOS 11.0, iOS 14.0, tvOS 14.0, watchOS 7.0, *)
303
+ func testFloat16() throws { try benchPacked(randomFloat16) { try $0.dotsPacked($1) } }
304
+ @available(macOS 11.0, iOS 14.0, tvOS 14.0, watchOS 7.0, *)
305
+ func testFloat16Serial() throws { try benchPacked(randomFloat16, serial: true) { try $0.dotsPacked($1) } }
306
+ #endif // !arch(x86_64)
307
+ func testBFloat16() throws { try benchPacked(randomBFloat16) { try $0.dotsPacked($1) } }
308
+ func testBFloat16Serial() throws { try benchPacked(randomBFloat16, serial: true) { try $0.dotsPacked($1) } }
309
+ func testInt8() throws { try benchPacked(randomInt8) { try $0.dotsPacked($1) } }
310
+ func testInt8Serial() throws { try benchPacked(randomInt8, serial: true) { try $0.dotsPacked($1) } }
311
+ func testUInt8() throws { try benchPacked(randomUInt8) { try $0.dotsPacked($1) } }
312
+ func testUInt8Serial() throws { try benchPacked(randomUInt8, serial: true) { try $0.dotsPacked($1) } }
313
+ func testE4M3() throws { try benchPacked(randomE4M3) { try $0.dotsPacked($1) } }
314
+ func testE4M3Serial() throws { try benchPacked(randomE4M3, serial: true) { try $0.dotsPacked($1) } }
315
+ func testE5M2() throws { try benchPacked(randomE5M2) { try $0.dotsPacked($1) } }
316
+ func testE5M2Serial() throws { try benchPacked(randomE5M2, serial: true) { try $0.dotsPacked($1) } }
317
+ func testE2M3() throws { try benchPacked(randomE2M3) { try $0.dotsPacked($1) } }
318
+ func testE2M3Serial() throws { try benchPacked(randomE2M3, serial: true) { try $0.dotsPacked($1) } }
319
+ func testE3M2() throws { try benchPacked(randomE3M2) { try $0.dotsPacked($1) } }
320
+ func testE3M2Serial() throws { try benchPacked(randomE3M2, serial: true) { try $0.dotsPacked($1) } }
321
+ func testU1x8() throws { try benchPacked(randomU1x8) { try $0.dotsPacked($1) } }
322
+ func testU1x8Serial() throws { try benchPacked(randomU1x8, serial: true) { try $0.dotsPacked($1) } }
323
+ }
324
+
325
+ // MARK: - Packed: Angulars
326
+
327
+ final class BenchAngularsPacked: XCTestCase {
328
+ func testFloat64() throws { try benchPacked(randomFloat64) { try $0.angularsPacked($1) } }
329
+ func testFloat64Serial() throws { try benchPacked(randomFloat64, serial: true) { try $0.angularsPacked($1) } }
330
+ func testFloat32() throws { try benchPacked(randomFloat32) { try $0.angularsPacked($1) } }
331
+ func testFloat32Serial() throws { try benchPacked(randomFloat32, serial: true) { try $0.angularsPacked($1) } }
332
+ #if !arch(x86_64)
333
+ @available(macOS 11.0, iOS 14.0, tvOS 14.0, watchOS 7.0, *)
334
+ func testFloat16() throws { try benchPacked(randomFloat16) { try $0.angularsPacked($1) } }
335
+ @available(macOS 11.0, iOS 14.0, tvOS 14.0, watchOS 7.0, *)
336
+ func testFloat16Serial() throws { try benchPacked(randomFloat16, serial: true) { try $0.angularsPacked($1) } }
337
+ #endif // !arch(x86_64)
338
+ func testBFloat16() throws { try benchPacked(randomBFloat16) { try $0.angularsPacked($1) } }
339
+ func testBFloat16Serial() throws { try benchPacked(randomBFloat16, serial: true) { try $0.angularsPacked($1) } }
340
+ func testInt8() throws { try benchPacked(randomInt8) { try $0.angularsPacked($1) } }
341
+ func testInt8Serial() throws { try benchPacked(randomInt8, serial: true) { try $0.angularsPacked($1) } }
342
+ func testUInt8() throws { try benchPacked(randomUInt8) { try $0.angularsPacked($1) } }
343
+ func testUInt8Serial() throws { try benchPacked(randomUInt8, serial: true) { try $0.angularsPacked($1) } }
344
+ func testE4M3() throws { try benchPacked(randomE4M3) { try $0.angularsPacked($1) } }
345
+ func testE4M3Serial() throws { try benchPacked(randomE4M3, serial: true) { try $0.angularsPacked($1) } }
346
+ func testE5M2() throws { try benchPacked(randomE5M2) { try $0.angularsPacked($1) } }
347
+ func testE5M2Serial() throws { try benchPacked(randomE5M2, serial: true) { try $0.angularsPacked($1) } }
348
+ func testE2M3() throws { try benchPacked(randomE2M3) { try $0.angularsPacked($1) } }
349
+ func testE2M3Serial() throws { try benchPacked(randomE2M3, serial: true) { try $0.angularsPacked($1) } }
350
+ func testE3M2() throws { try benchPacked(randomE3M2) { try $0.angularsPacked($1) } }
351
+ func testE3M2Serial() throws { try benchPacked(randomE3M2, serial: true) { try $0.angularsPacked($1) } }
352
+ }
353
+
354
+ // MARK: - Packed: Euclideans
355
+
356
+ final class BenchEuclideansPacked: XCTestCase {
357
+ func testFloat64() throws { try benchPacked(randomFloat64) { try $0.euclideansPacked($1) } }
358
+ func testFloat64Serial() throws { try benchPacked(randomFloat64, serial: true) { try $0.euclideansPacked($1) } }
359
+ func testFloat32() throws { try benchPacked(randomFloat32) { try $0.euclideansPacked($1) } }
360
+ func testFloat32Serial() throws { try benchPacked(randomFloat32, serial: true) { try $0.euclideansPacked($1) } }
361
+ #if !arch(x86_64)
362
+ @available(macOS 11.0, iOS 14.0, tvOS 14.0, watchOS 7.0, *)
363
+ func testFloat16() throws { try benchPacked(randomFloat16) { try $0.euclideansPacked($1) } }
364
+ @available(macOS 11.0, iOS 14.0, tvOS 14.0, watchOS 7.0, *)
365
+ func testFloat16Serial() throws { try benchPacked(randomFloat16, serial: true) { try $0.euclideansPacked($1) } }
366
+ #endif // !arch(x86_64)
367
+ func testBFloat16() throws { try benchPacked(randomBFloat16) { try $0.euclideansPacked($1) } }
368
+ func testBFloat16Serial() throws { try benchPacked(randomBFloat16, serial: true) { try $0.euclideansPacked($1) } }
369
+ func testInt8() throws { try benchPacked(randomInt8) { try $0.euclideansPacked($1) } }
370
+ func testInt8Serial() throws { try benchPacked(randomInt8, serial: true) { try $0.euclideansPacked($1) } }
371
+ func testUInt8() throws { try benchPacked(randomUInt8) { try $0.euclideansPacked($1) } }
372
+ func testUInt8Serial() throws { try benchPacked(randomUInt8, serial: true) { try $0.euclideansPacked($1) } }
373
+ func testE4M3() throws { try benchPacked(randomE4M3) { try $0.euclideansPacked($1) } }
374
+ func testE4M3Serial() throws { try benchPacked(randomE4M3, serial: true) { try $0.euclideansPacked($1) } }
375
+ func testE5M2() throws { try benchPacked(randomE5M2) { try $0.euclideansPacked($1) } }
376
+ func testE5M2Serial() throws { try benchPacked(randomE5M2, serial: true) { try $0.euclideansPacked($1) } }
377
+ func testE2M3() throws { try benchPacked(randomE2M3) { try $0.euclideansPacked($1) } }
378
+ func testE2M3Serial() throws { try benchPacked(randomE2M3, serial: true) { try $0.euclideansPacked($1) } }
379
+ func testE3M2() throws { try benchPacked(randomE3M2) { try $0.euclideansPacked($1) } }
380
+ func testE3M2Serial() throws { try benchPacked(randomE3M2, serial: true) { try $0.euclideansPacked($1) } }
381
+ }
382
+
383
+ // MARK: - Packed: Hammings (binary)
384
+
385
+ final class BenchHammingsPacked: XCTestCase {
386
+ func testU1x8() throws { try benchPacked(randomU1x8) { try $0.hammingsPacked($1) } }
387
+ func testU1x8Serial() throws { try benchPacked(randomU1x8, serial: true) { try $0.hammingsPacked($1) } }
388
+ }
389
+
390
+ // MARK: - Packed: Jaccards (binary)
391
+
392
+ final class BenchJaccardsPacked: XCTestCase {
393
+ func testU1x8() throws { try benchPacked(randomU1x8) { try $0.jaccardsPacked($1) } }
394
+ func testU1x8Serial() throws { try benchPacked(randomU1x8, serial: true) { try $0.jaccardsPacked($1) } }
395
+ }
396
+
397
+ // MARK: - Symmetric: Dots
398
+
399
+ final class BenchDotsSymmetric: XCTestCase {
400
+ func testFloat64() throws { try benchSymmetric(randomFloat64) { try $0.dotsSymmetric() } }
401
+ func testFloat64Serial() throws { try benchSymmetric(randomFloat64, serial: true) { try $0.dotsSymmetric() } }
402
+ func testFloat32() throws { try benchSymmetric(randomFloat32) { try $0.dotsSymmetric() } }
403
+ func testFloat32Serial() throws { try benchSymmetric(randomFloat32, serial: true) { try $0.dotsSymmetric() } }
404
+ #if !arch(x86_64)
405
+ @available(macOS 11.0, iOS 14.0, tvOS 14.0, watchOS 7.0, *)
406
+ func testFloat16() throws { try benchSymmetric(randomFloat16) { try $0.dotsSymmetric() } }
407
+ @available(macOS 11.0, iOS 14.0, tvOS 14.0, watchOS 7.0, *)
408
+ func testFloat16Serial() throws { try benchSymmetric(randomFloat16, serial: true) { try $0.dotsSymmetric() } }
409
+ #endif // !arch(x86_64)
410
+ func testBFloat16() throws { try benchSymmetric(randomBFloat16) { try $0.dotsSymmetric() } }
411
+ func testBFloat16Serial() throws { try benchSymmetric(randomBFloat16, serial: true) { try $0.dotsSymmetric() } }
412
+ func testInt8() throws { try benchSymmetric(randomInt8) { try $0.dotsSymmetric() } }
413
+ func testInt8Serial() throws { try benchSymmetric(randomInt8, serial: true) { try $0.dotsSymmetric() } }
414
+ func testUInt8() throws { try benchSymmetric(randomUInt8) { try $0.dotsSymmetric() } }
415
+ func testUInt8Serial() throws { try benchSymmetric(randomUInt8, serial: true) { try $0.dotsSymmetric() } }
416
+ func testE4M3() throws { try benchSymmetric(randomE4M3) { try $0.dotsSymmetric() } }
417
+ func testE4M3Serial() throws { try benchSymmetric(randomE4M3, serial: true) { try $0.dotsSymmetric() } }
418
+ func testE5M2() throws { try benchSymmetric(randomE5M2) { try $0.dotsSymmetric() } }
419
+ func testE5M2Serial() throws { try benchSymmetric(randomE5M2, serial: true) { try $0.dotsSymmetric() } }
420
+ func testE2M3() throws { try benchSymmetric(randomE2M3) { try $0.dotsSymmetric() } }
421
+ func testE2M3Serial() throws { try benchSymmetric(randomE2M3, serial: true) { try $0.dotsSymmetric() } }
422
+ func testE3M2() throws { try benchSymmetric(randomE3M2) { try $0.dotsSymmetric() } }
423
+ func testE3M2Serial() throws { try benchSymmetric(randomE3M2, serial: true) { try $0.dotsSymmetric() } }
424
+ func testU1x8() throws { try benchSymmetric(randomU1x8) { try $0.dotsSymmetric() } }
425
+ func testU1x8Serial() throws { try benchSymmetric(randomU1x8, serial: true) { try $0.dotsSymmetric() } }
426
+ }
427
+
428
+ // MARK: - Symmetric: Angulars
429
+
430
+ final class BenchAngularsSymmetric: XCTestCase {
431
+ func testFloat64() throws { try benchSymmetric(randomFloat64) { try $0.angularsSymmetric() } }
432
+ func testFloat64Serial() throws { try benchSymmetric(randomFloat64, serial: true) { try $0.angularsSymmetric() } }
433
+ func testFloat32() throws { try benchSymmetric(randomFloat32) { try $0.angularsSymmetric() } }
434
+ func testFloat32Serial() throws { try benchSymmetric(randomFloat32, serial: true) { try $0.angularsSymmetric() } }
435
+ #if !arch(x86_64)
436
+ @available(macOS 11.0, iOS 14.0, tvOS 14.0, watchOS 7.0, *)
437
+ func testFloat16() throws { try benchSymmetric(randomFloat16) { try $0.angularsSymmetric() } }
438
+ @available(macOS 11.0, iOS 14.0, tvOS 14.0, watchOS 7.0, *)
439
+ func testFloat16Serial() throws {
440
+ try benchSymmetric(randomFloat16, serial: true) { try $0.angularsSymmetric() }
441
+ }
442
+ #endif // !arch(x86_64)
443
+ func testBFloat16() throws { try benchSymmetric(randomBFloat16) { try $0.angularsSymmetric() } }
444
+ func testBFloat16Serial() throws { try benchSymmetric(randomBFloat16, serial: true) { try $0.angularsSymmetric() } }
445
+ func testInt8() throws { try benchSymmetric(randomInt8) { try $0.angularsSymmetric() } }
446
+ func testInt8Serial() throws { try benchSymmetric(randomInt8, serial: true) { try $0.angularsSymmetric() } }
447
+ func testUInt8() throws { try benchSymmetric(randomUInt8) { try $0.angularsSymmetric() } }
448
+ func testUInt8Serial() throws { try benchSymmetric(randomUInt8, serial: true) { try $0.angularsSymmetric() } }
449
+ func testE4M3() throws { try benchSymmetric(randomE4M3) { try $0.angularsSymmetric() } }
450
+ func testE4M3Serial() throws { try benchSymmetric(randomE4M3, serial: true) { try $0.angularsSymmetric() } }
451
+ func testE5M2() throws { try benchSymmetric(randomE5M2) { try $0.angularsSymmetric() } }
452
+ func testE5M2Serial() throws { try benchSymmetric(randomE5M2, serial: true) { try $0.angularsSymmetric() } }
453
+ func testE2M3() throws { try benchSymmetric(randomE2M3) { try $0.angularsSymmetric() } }
454
+ func testE2M3Serial() throws { try benchSymmetric(randomE2M3, serial: true) { try $0.angularsSymmetric() } }
455
+ func testE3M2() throws { try benchSymmetric(randomE3M2) { try $0.angularsSymmetric() } }
456
+ func testE3M2Serial() throws { try benchSymmetric(randomE3M2, serial: true) { try $0.angularsSymmetric() } }
457
+ }
458
+
459
+ // MARK: - Symmetric: Euclideans
460
+
461
+ final class BenchEuclideansSymmetric: XCTestCase {
462
+ func testFloat64() throws { try benchSymmetric(randomFloat64) { try $0.euclideansSymmetric() } }
463
+ func testFloat64Serial() throws { try benchSymmetric(randomFloat64, serial: true) { try $0.euclideansSymmetric() } }
464
+ func testFloat32() throws { try benchSymmetric(randomFloat32) { try $0.euclideansSymmetric() } }
465
+ func testFloat32Serial() throws { try benchSymmetric(randomFloat32, serial: true) { try $0.euclideansSymmetric() } }
466
+ #if !arch(x86_64)
467
+ @available(macOS 11.0, iOS 14.0, tvOS 14.0, watchOS 7.0, *)
468
+ func testFloat16() throws { try benchSymmetric(randomFloat16) { try $0.euclideansSymmetric() } }
469
+ @available(macOS 11.0, iOS 14.0, tvOS 14.0, watchOS 7.0, *)
470
+ func testFloat16Serial() throws {
471
+ try benchSymmetric(randomFloat16, serial: true) { try $0.euclideansSymmetric() }
472
+ }
473
+ #endif // !arch(x86_64)
474
+ func testBFloat16() throws { try benchSymmetric(randomBFloat16) { try $0.euclideansSymmetric() } }
475
+ func testBFloat16Serial() throws {
476
+ try benchSymmetric(randomBFloat16, serial: true) { try $0.euclideansSymmetric() }
477
+ }
478
+ func testInt8() throws { try benchSymmetric(randomInt8) { try $0.euclideansSymmetric() } }
479
+ func testInt8Serial() throws { try benchSymmetric(randomInt8, serial: true) { try $0.euclideansSymmetric() } }
480
+ func testUInt8() throws { try benchSymmetric(randomUInt8) { try $0.euclideansSymmetric() } }
481
+ func testUInt8Serial() throws { try benchSymmetric(randomUInt8, serial: true) { try $0.euclideansSymmetric() } }
482
+ func testE4M3() throws { try benchSymmetric(randomE4M3) { try $0.euclideansSymmetric() } }
483
+ func testE4M3Serial() throws { try benchSymmetric(randomE4M3, serial: true) { try $0.euclideansSymmetric() } }
484
+ func testE5M2() throws { try benchSymmetric(randomE5M2) { try $0.euclideansSymmetric() } }
485
+ func testE5M2Serial() throws { try benchSymmetric(randomE5M2, serial: true) { try $0.euclideansSymmetric() } }
486
+ func testE2M3() throws { try benchSymmetric(randomE2M3) { try $0.euclideansSymmetric() } }
487
+ func testE2M3Serial() throws { try benchSymmetric(randomE2M3, serial: true) { try $0.euclideansSymmetric() } }
488
+ func testE3M2() throws { try benchSymmetric(randomE3M2) { try $0.euclideansSymmetric() } }
489
+ func testE3M2Serial() throws { try benchSymmetric(randomE3M2, serial: true) { try $0.euclideansSymmetric() } }
490
+ }
491
+
492
+ // MARK: - Symmetric: Hammings (binary)
493
+
494
+ final class BenchHammingsSymmetric: XCTestCase {
495
+ func testU1x8() throws { try benchSymmetric(randomU1x8) { try $0.hammingsSymmetric() } }
496
+ func testU1x8Serial() throws { try benchSymmetric(randomU1x8, serial: true) { try $0.hammingsSymmetric() } }
497
+ }
498
+
499
+ // MARK: - Symmetric: Jaccards (binary)
500
+
501
+ final class BenchJaccardsSymmetric: XCTestCase {
502
+ func testU1x8() throws { try benchSymmetric(randomU1x8) { try $0.jaccardsSymmetric() } }
503
+ func testU1x8Serial() throws { try benchSymmetric(randomU1x8, serial: true) { try $0.jaccardsSymmetric() } }
504
+ }
505
+
506
+ #endif // canImport(Darwin)
@@ -0,0 +1,169 @@
1
+ {
2
+ "variables": {
3
+ "openssl_fips": ""
4
+ },
5
+ "targets": [
6
+ {
7
+ "target_name": "numkong",
8
+ "sources": [
9
+ "javascript/numkong.c",
10
+ "c/numkong.c",
11
+ "c/dispatch_f64.c",
12
+ "c/dispatch_f32.c",
13
+ "c/dispatch_f16.c",
14
+ "c/dispatch_bf16.c",
15
+ "c/dispatch_i8.c",
16
+ "c/dispatch_u8.c",
17
+ "c/dispatch_u1.c",
18
+ "c/dispatch_e4m3.c",
19
+ "c/dispatch_e5m2.c",
20
+ "c/dispatch_other.c",
21
+ "c/dispatch_f64c.c",
22
+ "c/dispatch_f32c.c",
23
+ "c/dispatch_f16c.c",
24
+ "c/dispatch_bf16c.c",
25
+ "c/dispatch_i16.c",
26
+ "c/dispatch_i32.c",
27
+ "c/dispatch_i64.c",
28
+ "c/dispatch_u16.c",
29
+ "c/dispatch_u32.c",
30
+ "c/dispatch_u64.c",
31
+ "c/dispatch_i4.c",
32
+ "c/dispatch_u4.c",
33
+ "c/dispatch_e2m3.c",
34
+ "c/dispatch_e3m2.c",
35
+ ],
36
+ "include_dirs": [
37
+ "include"
38
+ ],
39
+ "defines": [
40
+ "NK_NATIVE_F16=0",
41
+ "NK_NATIVE_BF16=0",
42
+ "NK_DYNAMIC_DISPATCH=1",
43
+ "NK_USE_OPENMP=1"
44
+ ],
45
+ "cflags": [
46
+ "-std=c11",
47
+ "-O3",
48
+ "-fopenmp",
49
+ "-Wno-unknown-pragmas",
50
+ "-Wno-maybe-uninitialized",
51
+ "-Wno-cast-function-type",
52
+ "-Wno-switch",
53
+ "-Wno-psabi",
54
+ "-include",
55
+ "<(module_root_dir)/nk_probes.h",
56
+ ],
57
+ "ldflags": [
58
+ "-fopenmp"
59
+ ],
60
+ "msvs_settings": {
61
+ "VCCLCompilerTool": {
62
+ "ForcedIncludeFiles": [
63
+ "<(module_root_dir)/nk_probes.h"
64
+ ],
65
+ "AdditionalOptions": [
66
+ "/Zc:preprocessor",
67
+ "/openmp:llvm"
68
+ ],
69
+ },
70
+ },
71
+ "conditions": [
72
+ # Pin TU baseline to each arch's ABI floor; SIMD kernels use per-function pragmas.
73
+ [
74
+ "OS!='win' and target_arch=='arm64'",
75
+ {
76
+ "cflags": [
77
+ "-march=armv8-a"
78
+ ]
79
+ }
80
+ ],
81
+ [
82
+ "OS!='win' and target_arch=='x64'",
83
+ {
84
+ "cflags": [
85
+ "-march=x86-64"
86
+ ]
87
+ }
88
+ ],
89
+ [
90
+ "OS!='win' and target_arch=='riscv64'",
91
+ {
92
+ "cflags": [
93
+ "-march=rv64gc"
94
+ ]
95
+ }
96
+ ],
97
+ # Forbid auto-vectorization so serial fallbacks don't get silently
98
+ # promoted to NEON/SSE2/VSX. SIMD kernels use explicit intrinsics
99
+ # and per-function `target` pragmas; unaffected. MSVC has no
100
+ # command-line vectorizer toggle.
101
+ [
102
+ "OS!='win'",
103
+ {
104
+ "cflags": [
105
+ "-fno-tree-vectorize",
106
+ "-fno-tree-slp-vectorize"
107
+ ]
108
+ }
109
+ ],
110
+ [
111
+ "OS=='mac'",
112
+ {
113
+ "xcode_settings": {
114
+ "MACOSX_DEPLOYMENT_TARGET": "11.0",
115
+ # Apple Clang ships no `omp.h`; the CI step
116
+ # `brew install libomp` makes it keg-only under
117
+ # `/opt/homebrew/opt/libomp` (arm64) or
118
+ # `/usr/local/opt/libomp` (x86_64). Clang silently
119
+ # ignores `-I` / `-L` dirs that don't exist, so
120
+ # listing both keeps the file arch-agnostic.
121
+ "OTHER_CFLAGS": [
122
+ "-Xpreprocessor",
123
+ "-fopenmp",
124
+ "-I/opt/homebrew/opt/libomp/include",
125
+ "-I/usr/local/opt/libomp/include"
126
+ ],
127
+ "OTHER_LDFLAGS": [
128
+ "-lomp",
129
+ "-L/opt/homebrew/opt/libomp/lib",
130
+ "-L/usr/local/opt/libomp/lib"
131
+ ]
132
+ }
133
+ }
134
+ ],
135
+ # MSVC: no per-function target pragma; these match defaults.
136
+ [
137
+ "OS=='win' and target_arch=='arm64'",
138
+ {
139
+ "defines": [
140
+ "_ARM64_"
141
+ ],
142
+ "msvs_settings": {
143
+ "VCCLCompilerTool": {
144
+ "AdditionalOptions": [
145
+ "/arch:armv8.0"
146
+ ]
147
+ }
148
+ }
149
+ }
150
+ ],
151
+ [
152
+ "OS=='win' and target_arch=='x64'",
153
+ {
154
+ "defines": [
155
+ "_AMD64_"
156
+ ],
157
+ "msvs_settings": {
158
+ "VCCLCompilerTool": {
159
+ "AdditionalOptions": [
160
+ "/arch:SSE2"
161
+ ]
162
+ }
163
+ }
164
+ }
165
+ ],
166
+ ],
167
+ }
168
+ ],
169
+ }