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