usearch 2.21.3 → 2.25.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (602) hide show
  1. package/README.md +24 -24
  2. package/binding.gyp +15 -37
  3. package/c/CMakeLists.txt +4 -5
  4. package/c/README.md +7 -7
  5. package/c/lib.cpp +32 -14
  6. package/c/test.c +83 -1
  7. package/c/usearch.h +24 -3
  8. package/cpp/CMakeLists.txt +4 -0
  9. package/cpp/README.md +5 -5
  10. package/cpp/bench.cpp +97 -116
  11. package/cpp/test.cpp +117 -20
  12. package/include/usearch/index.hpp +235 -52
  13. package/include/usearch/index_dense.hpp +105 -40
  14. package/include/usearch/index_plugins.hpp +1387 -204
  15. package/javascript/dist/cjs/usearch.d.ts +8 -3
  16. package/javascript/dist/cjs/usearch.js +12 -4
  17. package/javascript/dist/esm/usearch.d.ts +8 -3
  18. package/javascript/dist/esm/usearch.js +12 -4
  19. package/javascript/lib.cpp +17 -0
  20. package/javascript/usearch.ts +14 -6
  21. package/numkong/.clang-tidy +30 -0
  22. package/{simsimd → numkong}/.cmake-format.py +18 -0
  23. package/numkong/.editorconfig +12 -0
  24. package/numkong/.git-blame-ignore-revs +123 -0
  25. package/numkong/.mailmap +15 -0
  26. package/numkong/.spi.yml +11 -0
  27. package/numkong/.swift-format +14 -0
  28. package/numkong/CITATION.cff +81 -0
  29. package/numkong/CONTRIBUTING.md +500 -0
  30. package/numkong/Cargo.toml +54 -0
  31. package/numkong/MANIFEST.in +8 -0
  32. package/numkong/Package.swift +84 -0
  33. package/numkong/README.md +569 -0
  34. package/numkong/bench/README.md +217 -0
  35. package/numkong/bench/bench-browser.html +323 -0
  36. package/numkong/bench/bench.cpp +344 -0
  37. package/numkong/bench/bench.hpp +816 -0
  38. package/numkong/bench/bench.js +148 -0
  39. package/numkong/bench/bench.mjs +616 -0
  40. package/numkong/bench/bench_attention.cpp +113 -0
  41. package/numkong/bench/bench_cast.cpp +264 -0
  42. package/numkong/bench/bench_cross_amx.cpp +62 -0
  43. package/numkong/bench/bench_cross_arm.cpp +245 -0
  44. package/numkong/bench/bench_cross_blas.cpp +309 -0
  45. package/numkong/bench/bench_cross_loongarch.cpp +106 -0
  46. package/numkong/bench/bench_cross_power.cpp +84 -0
  47. package/numkong/bench/bench_cross_rvv.cpp +121 -0
  48. package/numkong/bench/bench_cross_serial.cpp +151 -0
  49. package/numkong/bench/bench_cross_sme.cpp +163 -0
  50. package/numkong/bench/bench_cross_wasm.cpp +142 -0
  51. package/numkong/bench/bench_cross_x86.cpp +455 -0
  52. package/numkong/bench/bench_curved.cpp +210 -0
  53. package/numkong/bench/bench_dot.cpp +315 -0
  54. package/numkong/bench/bench_each.cpp +503 -0
  55. package/numkong/bench/bench_geospatial.cpp +112 -0
  56. package/numkong/bench/bench_maxsim.cpp +154 -0
  57. package/numkong/bench/bench_mesh.cpp +148 -0
  58. package/numkong/bench/bench_probability.cpp +60 -0
  59. package/numkong/bench/bench_reduce.cpp +371 -0
  60. package/numkong/bench/bench_set.cpp +73 -0
  61. package/numkong/bench/bench_sparse.cpp +198 -0
  62. package/numkong/bench/bench_spatial.cpp +347 -0
  63. package/numkong/bench/bench_trigonometry.cpp +137 -0
  64. package/numkong/bench/swift/Bench.swift +506 -0
  65. package/numkong/binding.gyp +169 -0
  66. package/numkong/build.rs +484 -0
  67. package/numkong/c/dispatch.h +512 -0
  68. package/numkong/c/dispatch_bf16.c +447 -0
  69. package/numkong/c/dispatch_bf16c.c +52 -0
  70. package/numkong/c/dispatch_e2m3.c +296 -0
  71. package/numkong/c/dispatch_e3m2.c +284 -0
  72. package/numkong/c/dispatch_e4m3.c +318 -0
  73. package/numkong/c/dispatch_e5m2.c +316 -0
  74. package/numkong/c/dispatch_f16.c +452 -0
  75. package/numkong/c/dispatch_f16c.c +58 -0
  76. package/numkong/c/dispatch_f32.c +434 -0
  77. package/numkong/c/dispatch_f32c.c +99 -0
  78. package/numkong/c/dispatch_f64.c +348 -0
  79. package/numkong/c/dispatch_f64c.c +98 -0
  80. package/numkong/c/dispatch_i16.c +96 -0
  81. package/numkong/c/dispatch_i32.c +89 -0
  82. package/numkong/c/dispatch_i4.c +153 -0
  83. package/numkong/c/dispatch_i64.c +86 -0
  84. package/numkong/c/dispatch_i8.c +348 -0
  85. package/numkong/c/dispatch_other.c +348 -0
  86. package/numkong/c/dispatch_u1.c +193 -0
  87. package/numkong/c/dispatch_u16.c +124 -0
  88. package/numkong/c/dispatch_u32.c +118 -0
  89. package/numkong/c/dispatch_u4.c +153 -0
  90. package/numkong/c/dispatch_u64.c +102 -0
  91. package/numkong/c/dispatch_u8.c +364 -0
  92. package/numkong/c/numkong.c +940 -0
  93. package/numkong/cmake/nk_arm_isa_probes.cmake +61 -0
  94. package/numkong/cmake/nk_isa_probe.cmake +90 -0
  95. package/numkong/cmake/nk_loongarch_isa_probes.cmake +15 -0
  96. package/numkong/cmake/nk_math_lib.cmake +46 -0
  97. package/numkong/cmake/nk_power_isa_probes.cmake +15 -0
  98. package/numkong/cmake/nk_riscv_isa_probes.cmake +19 -0
  99. package/numkong/cmake/nk_x86_isa_probes.cmake +35 -0
  100. package/numkong/cmake/toolchain-aarch64-gnu.cmake +86 -0
  101. package/numkong/cmake/toolchain-android-arm64.cmake +25 -0
  102. package/numkong/cmake/toolchain-android-armv7.cmake +25 -0
  103. package/numkong/cmake/toolchain-loongarch64-gnu.cmake +68 -0
  104. package/numkong/cmake/toolchain-ppc64le-gnu.cmake +74 -0
  105. package/numkong/cmake/toolchain-riscv64-gnu.cmake +107 -0
  106. package/numkong/cmake/toolchain-riscv64-llvm.cmake +114 -0
  107. package/numkong/cmake/toolchain-wasi.cmake +77 -0
  108. package/numkong/cmake/toolchain-wasm.cmake +70 -0
  109. package/numkong/cmake/toolchain-wasm64.cmake +62 -0
  110. package/numkong/cmake/toolchain-x86_64-llvm.cmake +47 -0
  111. package/numkong/include/README.md +643 -0
  112. package/numkong/include/module.modulemap +129 -0
  113. package/numkong/include/numkong/attention/sapphireamx.h +1363 -0
  114. package/numkong/include/numkong/attention/sme.h +2075 -0
  115. package/numkong/include/numkong/attention.h +49 -0
  116. package/numkong/include/numkong/capabilities.h +930 -0
  117. package/numkong/include/numkong/cast/README.md +262 -0
  118. package/numkong/include/numkong/cast/diamond.h +64 -0
  119. package/numkong/include/numkong/cast/haswell.h +823 -0
  120. package/numkong/include/numkong/cast/icelake.h +475 -0
  121. package/numkong/include/numkong/cast/loongsonasx.h +252 -0
  122. package/numkong/include/numkong/cast/neon.h +1174 -0
  123. package/numkong/include/numkong/cast/powervsx.h +449 -0
  124. package/numkong/include/numkong/cast/rvv.h +970 -0
  125. package/numkong/include/numkong/cast/sapphire.h +262 -0
  126. package/numkong/include/numkong/cast/serial.h +2336 -0
  127. package/numkong/include/numkong/cast/skylake.h +915 -0
  128. package/numkong/include/numkong/cast/v128relaxed.h +537 -0
  129. package/numkong/include/numkong/cast.h +254 -0
  130. package/numkong/include/numkong/cast.hpp +44 -0
  131. package/numkong/include/numkong/curved/README.md +223 -0
  132. package/numkong/include/numkong/curved/genoa.h +182 -0
  133. package/numkong/include/numkong/curved/haswell.h +276 -0
  134. package/numkong/include/numkong/curved/neon.h +329 -0
  135. package/numkong/include/numkong/curved/neonbfdot.h +211 -0
  136. package/numkong/include/numkong/curved/rvv.h +305 -0
  137. package/numkong/include/numkong/curved/serial.h +207 -0
  138. package/numkong/include/numkong/curved/skylake.h +457 -0
  139. package/numkong/include/numkong/curved/smef64.h +530 -0
  140. package/numkong/include/numkong/curved.h +513 -0
  141. package/numkong/include/numkong/curved.hpp +144 -0
  142. package/numkong/include/numkong/dot/README.md +442 -0
  143. package/numkong/include/numkong/dot/alder.h +563 -0
  144. package/numkong/include/numkong/dot/diamond.h +158 -0
  145. package/numkong/include/numkong/dot/genoa.h +289 -0
  146. package/numkong/include/numkong/dot/haswell.h +1723 -0
  147. package/numkong/include/numkong/dot/icelake.h +997 -0
  148. package/numkong/include/numkong/dot/loongsonasx.h +671 -0
  149. package/numkong/include/numkong/dot/neon.h +869 -0
  150. package/numkong/include/numkong/dot/neonbfdot.h +243 -0
  151. package/numkong/include/numkong/dot/neonfhm.h +358 -0
  152. package/numkong/include/numkong/dot/neonfp8.h +323 -0
  153. package/numkong/include/numkong/dot/neonsdot.h +622 -0
  154. package/numkong/include/numkong/dot/powervsx.h +752 -0
  155. package/numkong/include/numkong/dot/rvv.h +722 -0
  156. package/numkong/include/numkong/dot/rvvbb.h +72 -0
  157. package/numkong/include/numkong/dot/rvvbf16.h +123 -0
  158. package/numkong/include/numkong/dot/rvvhalf.h +129 -0
  159. package/numkong/include/numkong/dot/sapphire.h +141 -0
  160. package/numkong/include/numkong/dot/serial.h +874 -0
  161. package/numkong/include/numkong/dot/sierra.h +405 -0
  162. package/numkong/include/numkong/dot/skylake.h +1116 -0
  163. package/numkong/include/numkong/dot/sve.h +420 -0
  164. package/numkong/include/numkong/dot/svebfdot.h +75 -0
  165. package/numkong/include/numkong/dot/svehalf.h +168 -0
  166. package/numkong/include/numkong/dot/svesdot.h +90 -0
  167. package/numkong/include/numkong/dot/v128relaxed.h +1293 -0
  168. package/numkong/include/numkong/dot.h +1136 -0
  169. package/numkong/include/numkong/dot.hpp +94 -0
  170. package/numkong/include/numkong/dots/README.md +496 -0
  171. package/numkong/include/numkong/dots/alder.h +117 -0
  172. package/numkong/include/numkong/dots/diamond.h +86 -0
  173. package/numkong/include/numkong/dots/genoa.h +100 -0
  174. package/numkong/include/numkong/dots/graniteamx.h +733 -0
  175. package/numkong/include/numkong/dots/haswell.h +310 -0
  176. package/numkong/include/numkong/dots/icelake.h +180 -0
  177. package/numkong/include/numkong/dots/loongsonasx.h +176 -0
  178. package/numkong/include/numkong/dots/neon.h +123 -0
  179. package/numkong/include/numkong/dots/neonbfdot.h +59 -0
  180. package/numkong/include/numkong/dots/neonfhm.h +96 -0
  181. package/numkong/include/numkong/dots/neonfp8.h +99 -0
  182. package/numkong/include/numkong/dots/neonsdot.h +144 -0
  183. package/numkong/include/numkong/dots/powervsx.h +194 -0
  184. package/numkong/include/numkong/dots/rvv.h +2593 -0
  185. package/numkong/include/numkong/dots/sapphireamx.h +4017 -0
  186. package/numkong/include/numkong/dots/serial.h +2867 -0
  187. package/numkong/include/numkong/dots/sierra.h +100 -0
  188. package/numkong/include/numkong/dots/skylake.h +207 -0
  189. package/numkong/include/numkong/dots/sme.h +5041 -0
  190. package/numkong/include/numkong/dots/smebi32.h +477 -0
  191. package/numkong/include/numkong/dots/smef64.h +1328 -0
  192. package/numkong/include/numkong/dots/smehalf.h +47 -0
  193. package/numkong/include/numkong/dots/v128relaxed.h +317 -0
  194. package/numkong/include/numkong/dots.h +3110 -0
  195. package/numkong/include/numkong/dots.hpp +641 -0
  196. package/numkong/include/numkong/each/README.md +465 -0
  197. package/numkong/include/numkong/each/haswell.h +1658 -0
  198. package/numkong/include/numkong/each/icelake.h +272 -0
  199. package/numkong/include/numkong/each/neon.h +1138 -0
  200. package/numkong/include/numkong/each/neonbfdot.h +211 -0
  201. package/numkong/include/numkong/each/neonhalf.h +318 -0
  202. package/numkong/include/numkong/each/rvv.h +1121 -0
  203. package/numkong/include/numkong/each/sapphire.h +343 -0
  204. package/numkong/include/numkong/each/serial.h +282 -0
  205. package/numkong/include/numkong/each/skylake.h +1562 -0
  206. package/numkong/include/numkong/each/v128relaxed.h +562 -0
  207. package/numkong/include/numkong/each.h +2232 -0
  208. package/numkong/include/numkong/each.hpp +434 -0
  209. package/numkong/include/numkong/geospatial/README.md +147 -0
  210. package/numkong/include/numkong/geospatial/haswell.h +633 -0
  211. package/numkong/include/numkong/geospatial/neon.h +615 -0
  212. package/numkong/include/numkong/geospatial/rvv.h +701 -0
  213. package/numkong/include/numkong/geospatial/serial.h +309 -0
  214. package/numkong/include/numkong/geospatial/skylake.h +613 -0
  215. package/numkong/include/numkong/geospatial/v128relaxed.h +652 -0
  216. package/numkong/include/numkong/geospatial.h +453 -0
  217. package/numkong/include/numkong/geospatial.hpp +235 -0
  218. package/numkong/include/numkong/matrix.hpp +336 -0
  219. package/numkong/include/numkong/maxsim/README.md +187 -0
  220. package/numkong/include/numkong/maxsim/alder.h +511 -0
  221. package/numkong/include/numkong/maxsim/genoa.h +115 -0
  222. package/numkong/include/numkong/maxsim/haswell.h +553 -0
  223. package/numkong/include/numkong/maxsim/icelake.h +480 -0
  224. package/numkong/include/numkong/maxsim/neonsdot.h +394 -0
  225. package/numkong/include/numkong/maxsim/sapphireamx.h +877 -0
  226. package/numkong/include/numkong/maxsim/serial.h +490 -0
  227. package/numkong/include/numkong/maxsim/sme.h +993 -0
  228. package/numkong/include/numkong/maxsim/v128relaxed.h +280 -0
  229. package/numkong/include/numkong/maxsim.h +571 -0
  230. package/numkong/include/numkong/maxsim.hpp +133 -0
  231. package/numkong/include/numkong/mesh/README.md +219 -0
  232. package/numkong/include/numkong/mesh/haswell.h +2013 -0
  233. package/numkong/include/numkong/mesh/neon.h +1821 -0
  234. package/numkong/include/numkong/mesh/neonbfdot.h +771 -0
  235. package/numkong/include/numkong/mesh/rvv.h +936 -0
  236. package/numkong/include/numkong/mesh/serial.h +721 -0
  237. package/numkong/include/numkong/mesh/skylake.h +2344 -0
  238. package/numkong/include/numkong/mesh/v128relaxed.h +1081 -0
  239. package/numkong/include/numkong/mesh.h +666 -0
  240. package/numkong/include/numkong/mesh.hpp +701 -0
  241. package/numkong/include/numkong/numkong.h +78 -0
  242. package/numkong/include/numkong/numkong.hpp +58 -0
  243. package/numkong/include/numkong/probability/README.md +177 -0
  244. package/numkong/include/numkong/probability/haswell.h +267 -0
  245. package/numkong/include/numkong/probability/neon.h +255 -0
  246. package/numkong/include/numkong/probability/rvv.h +414 -0
  247. package/numkong/include/numkong/probability/serial.h +181 -0
  248. package/numkong/include/numkong/probability/skylake.h +324 -0
  249. package/numkong/include/numkong/probability.h +380 -0
  250. package/numkong/include/numkong/probability.hpp +120 -0
  251. package/numkong/include/numkong/random.h +50 -0
  252. package/numkong/include/numkong/random.hpp +285 -0
  253. package/numkong/include/numkong/reduce/README.md +552 -0
  254. package/numkong/include/numkong/reduce/alder.h +636 -0
  255. package/numkong/include/numkong/reduce/genoa.h +201 -0
  256. package/numkong/include/numkong/reduce/haswell.h +3785 -0
  257. package/numkong/include/numkong/reduce/icelake.h +549 -0
  258. package/numkong/include/numkong/reduce/neon.h +3980 -0
  259. package/numkong/include/numkong/reduce/neonbfdot.h +142 -0
  260. package/numkong/include/numkong/reduce/neonfhm.h +293 -0
  261. package/numkong/include/numkong/reduce/neonsdot.h +357 -0
  262. package/numkong/include/numkong/reduce/rvv.h +3533 -0
  263. package/numkong/include/numkong/reduce/serial.h +753 -0
  264. package/numkong/include/numkong/reduce/sierra.h +338 -0
  265. package/numkong/include/numkong/reduce/skylake.h +3794 -0
  266. package/numkong/include/numkong/reduce/sve.h +52 -0
  267. package/numkong/include/numkong/reduce/v128relaxed.h +2302 -0
  268. package/numkong/include/numkong/reduce.h +1582 -0
  269. package/numkong/include/numkong/reduce.hpp +778 -0
  270. package/numkong/include/numkong/scalar/README.md +89 -0
  271. package/numkong/include/numkong/scalar/haswell.h +122 -0
  272. package/numkong/include/numkong/scalar/loongsonasx.h +74 -0
  273. package/numkong/include/numkong/scalar/neon.h +122 -0
  274. package/numkong/include/numkong/scalar/neonhalf.h +70 -0
  275. package/numkong/include/numkong/scalar/powervsx.h +96 -0
  276. package/numkong/include/numkong/scalar/rvv.h +211 -0
  277. package/numkong/include/numkong/scalar/sapphire.h +74 -0
  278. package/numkong/include/numkong/scalar/serial.h +332 -0
  279. package/numkong/include/numkong/scalar/v128relaxed.h +56 -0
  280. package/numkong/include/numkong/scalar.h +696 -0
  281. package/numkong/include/numkong/set/README.md +179 -0
  282. package/numkong/include/numkong/set/haswell.h +334 -0
  283. package/numkong/include/numkong/set/icelake.h +485 -0
  284. package/numkong/include/numkong/set/loongsonasx.h +181 -0
  285. package/numkong/include/numkong/set/neon.h +363 -0
  286. package/numkong/include/numkong/set/powervsx.h +326 -0
  287. package/numkong/include/numkong/set/rvv.h +226 -0
  288. package/numkong/include/numkong/set/rvvbb.h +117 -0
  289. package/numkong/include/numkong/set/serial.h +174 -0
  290. package/numkong/include/numkong/set/sve.h +187 -0
  291. package/numkong/include/numkong/set/v128relaxed.h +240 -0
  292. package/numkong/include/numkong/set.h +471 -0
  293. package/numkong/include/numkong/set.hpp +114 -0
  294. package/numkong/include/numkong/sets/README.md +149 -0
  295. package/numkong/include/numkong/sets/haswell.h +63 -0
  296. package/numkong/include/numkong/sets/icelake.h +66 -0
  297. package/numkong/include/numkong/sets/loongsonasx.h +52 -0
  298. package/numkong/include/numkong/sets/neon.h +61 -0
  299. package/numkong/include/numkong/sets/powervsx.h +65 -0
  300. package/numkong/include/numkong/sets/serial.h +43 -0
  301. package/numkong/include/numkong/sets/smebi32.h +1135 -0
  302. package/numkong/include/numkong/sets/v128relaxed.h +58 -0
  303. package/numkong/include/numkong/sets.h +382 -0
  304. package/numkong/include/numkong/sparse/README.md +156 -0
  305. package/numkong/include/numkong/sparse/icelake.h +463 -0
  306. package/numkong/include/numkong/sparse/neon.h +288 -0
  307. package/numkong/include/numkong/sparse/serial.h +117 -0
  308. package/numkong/include/numkong/sparse/sve2.h +504 -0
  309. package/numkong/include/numkong/sparse/turin.h +322 -0
  310. package/numkong/include/numkong/sparse.h +363 -0
  311. package/numkong/include/numkong/sparse.hpp +113 -0
  312. package/numkong/include/numkong/spatial/README.md +439 -0
  313. package/numkong/include/numkong/spatial/alder.h +604 -0
  314. package/numkong/include/numkong/spatial/diamond.h +240 -0
  315. package/numkong/include/numkong/spatial/genoa.h +222 -0
  316. package/numkong/include/numkong/spatial/haswell.h +979 -0
  317. package/numkong/include/numkong/spatial/icelake.h +1067 -0
  318. package/numkong/include/numkong/spatial/loongsonasx.h +483 -0
  319. package/numkong/include/numkong/spatial/neon.h +846 -0
  320. package/numkong/include/numkong/spatial/neonbfdot.h +164 -0
  321. package/numkong/include/numkong/spatial/neonfp8.h +258 -0
  322. package/numkong/include/numkong/spatial/neonsdot.h +429 -0
  323. package/numkong/include/numkong/spatial/powervsx.h +738 -0
  324. package/numkong/include/numkong/spatial/rvv.h +991 -0
  325. package/numkong/include/numkong/spatial/rvvbf16.h +128 -0
  326. package/numkong/include/numkong/spatial/rvvhalf.h +120 -0
  327. package/numkong/include/numkong/spatial/serial.h +347 -0
  328. package/numkong/include/numkong/spatial/sierra.h +516 -0
  329. package/numkong/include/numkong/spatial/skylake.h +605 -0
  330. package/numkong/include/numkong/spatial/sve.h +246 -0
  331. package/numkong/include/numkong/spatial/svebfdot.h +125 -0
  332. package/numkong/include/numkong/spatial/svehalf.h +136 -0
  333. package/numkong/include/numkong/spatial/svesdot.h +143 -0
  334. package/numkong/include/numkong/spatial/v128relaxed.h +969 -0
  335. package/numkong/include/numkong/spatial.h +1681 -0
  336. package/numkong/include/numkong/spatial.hpp +183 -0
  337. package/numkong/include/numkong/spatials/README.md +580 -0
  338. package/numkong/include/numkong/spatials/alder.h +94 -0
  339. package/numkong/include/numkong/spatials/diamond.h +82 -0
  340. package/numkong/include/numkong/spatials/genoa.h +94 -0
  341. package/numkong/include/numkong/spatials/graniteamx.h +173 -0
  342. package/numkong/include/numkong/spatials/haswell.h +219 -0
  343. package/numkong/include/numkong/spatials/icelake.h +113 -0
  344. package/numkong/include/numkong/spatials/loongsonasx.h +153 -0
  345. package/numkong/include/numkong/spatials/neon.h +109 -0
  346. package/numkong/include/numkong/spatials/neonbfdot.h +60 -0
  347. package/numkong/include/numkong/spatials/neonfhm.h +92 -0
  348. package/numkong/include/numkong/spatials/neonfp8.h +111 -0
  349. package/numkong/include/numkong/spatials/neonsdot.h +143 -0
  350. package/numkong/include/numkong/spatials/powervsx.h +153 -0
  351. package/numkong/include/numkong/spatials/rvv.h +1976 -0
  352. package/numkong/include/numkong/spatials/sapphireamx.h +1149 -0
  353. package/numkong/include/numkong/spatials/serial.h +248 -0
  354. package/numkong/include/numkong/spatials/sierra.h +96 -0
  355. package/numkong/include/numkong/spatials/skylake.h +184 -0
  356. package/numkong/include/numkong/spatials/sme.h +1927 -0
  357. package/numkong/include/numkong/spatials/smef64.h +483 -0
  358. package/numkong/include/numkong/spatials/v128relaxed.h +240 -0
  359. package/numkong/include/numkong/spatials.h +3374 -0
  360. package/numkong/include/numkong/spatials.hpp +509 -0
  361. package/numkong/include/numkong/tensor.hpp +1981 -0
  362. package/numkong/include/numkong/trigonometry/README.md +184 -0
  363. package/numkong/include/numkong/trigonometry/haswell.h +653 -0
  364. package/numkong/include/numkong/trigonometry/neon.h +638 -0
  365. package/numkong/include/numkong/trigonometry/rvv.h +700 -0
  366. package/numkong/include/numkong/trigonometry/serial.h +703 -0
  367. package/numkong/include/numkong/trigonometry/skylake.h +725 -0
  368. package/numkong/include/numkong/trigonometry/v128relaxed.h +667 -0
  369. package/numkong/include/numkong/trigonometry.h +467 -0
  370. package/numkong/include/numkong/trigonometry.hpp +166 -0
  371. package/numkong/include/numkong/types.h +1695 -0
  372. package/numkong/include/numkong/types.hpp +6027 -0
  373. package/numkong/include/numkong/vector.hpp +766 -0
  374. package/numkong/javascript/@numkong-darwin-arm64/package.json +26 -0
  375. package/numkong/javascript/@numkong-darwin-x64/package.json +26 -0
  376. package/numkong/javascript/@numkong-linux-arm64/package.json +25 -0
  377. package/numkong/javascript/@numkong-linux-x64/package.json +25 -0
  378. package/numkong/javascript/@numkong-win32-arm64/package.json +25 -0
  379. package/numkong/javascript/@numkong-win32-x64/package.json +25 -0
  380. package/numkong/javascript/README.md +254 -0
  381. package/numkong/javascript/node-gyp-build.d.ts +4 -0
  382. package/numkong/javascript/numkong-browser.ts +40 -0
  383. package/numkong/javascript/numkong-wasm.ts +750 -0
  384. package/numkong/javascript/numkong.c +712 -0
  385. package/numkong/javascript/numkong.ts +613 -0
  386. package/{simsimd → numkong}/javascript/tsconfig-base.json +6 -3
  387. package/numkong/javascript/tsconfig-cjs.json +13 -0
  388. package/{simsimd → numkong}/javascript/tsconfig-esm.json +1 -1
  389. package/numkong/javascript/types.ts +784 -0
  390. package/numkong/numkong.gypi +104 -0
  391. package/numkong/package.json +108 -0
  392. package/numkong/probes/arm_neon.c +8 -0
  393. package/numkong/probes/arm_neon_bfdot.c +9 -0
  394. package/numkong/probes/arm_neon_fhm.c +9 -0
  395. package/numkong/probes/arm_neon_half.c +8 -0
  396. package/numkong/probes/arm_neon_sdot.c +9 -0
  397. package/numkong/probes/arm_neonfp8.c +9 -0
  398. package/numkong/probes/arm_sme.c +16 -0
  399. package/numkong/probes/arm_sme2.c +16 -0
  400. package/numkong/probes/arm_sme2p1.c +16 -0
  401. package/numkong/probes/arm_sme_bf16.c +16 -0
  402. package/numkong/probes/arm_sme_bi32.c +16 -0
  403. package/numkong/probes/arm_sme_f64.c +16 -0
  404. package/numkong/probes/arm_sme_fa64.c +14 -0
  405. package/numkong/probes/arm_sme_half.c +16 -0
  406. package/numkong/probes/arm_sme_lut2.c +15 -0
  407. package/numkong/probes/arm_sve.c +18 -0
  408. package/numkong/probes/arm_sve2.c +20 -0
  409. package/numkong/probes/arm_sve2p1.c +18 -0
  410. package/numkong/probes/arm_sve_bfdot.c +20 -0
  411. package/numkong/probes/arm_sve_half.c +18 -0
  412. package/numkong/probes/arm_sve_sdot.c +21 -0
  413. package/numkong/probes/loongarch_lasx.c +12 -0
  414. package/numkong/probes/power_vsx.c +12 -0
  415. package/numkong/probes/probe.js +127 -0
  416. package/numkong/probes/riscv_rvv.c +14 -0
  417. package/numkong/probes/riscv_rvv_bb.c +15 -0
  418. package/numkong/probes/riscv_rvv_bf16.c +17 -0
  419. package/numkong/probes/riscv_rvv_half.c +14 -0
  420. package/numkong/probes/wasm_v128relaxed.c +11 -0
  421. package/numkong/probes/x86_alder.c +17 -0
  422. package/numkong/probes/x86_diamond.c +17 -0
  423. package/numkong/probes/x86_genoa.c +17 -0
  424. package/numkong/probes/x86_graniteamx.c +19 -0
  425. package/numkong/probes/x86_haswell.c +11 -0
  426. package/numkong/probes/x86_icelake.c +17 -0
  427. package/numkong/probes/x86_sapphire.c +16 -0
  428. package/numkong/probes/x86_sapphireamx.c +18 -0
  429. package/numkong/probes/x86_sierra.c +17 -0
  430. package/numkong/probes/x86_skylake.c +15 -0
  431. package/numkong/probes/x86_turin.c +17 -0
  432. package/numkong/rust/README.md +698 -0
  433. package/numkong/rust/capabilities.rs +96 -0
  434. package/numkong/rust/cast.rs +314 -0
  435. package/numkong/rust/curved.rs +391 -0
  436. package/numkong/rust/each.rs +2721 -0
  437. package/numkong/rust/geospatial.rs +343 -0
  438. package/numkong/rust/matrix.rs +5424 -0
  439. package/numkong/rust/maxsim.rs +540 -0
  440. package/numkong/rust/mesh.rs +837 -0
  441. package/numkong/rust/numkong.rs +409 -0
  442. package/numkong/rust/probability.rs +272 -0
  443. package/numkong/rust/reduce.rs +1249 -0
  444. package/numkong/rust/set.rs +194 -0
  445. package/numkong/rust/sparse.rs +513 -0
  446. package/numkong/rust/spatial.rs +1815 -0
  447. package/numkong/rust/tensor.rs +7565 -0
  448. package/numkong/rust/types.rs +3666 -0
  449. package/numkong/rust/vector.rs +1899 -0
  450. package/numkong/rustfmt.toml +2 -0
  451. package/numkong/swift/Matrix.swift +1388 -0
  452. package/numkong/swift/MaxSim.swift +151 -0
  453. package/numkong/swift/NumKong.swift +283 -0
  454. package/numkong/swift/Numerics.swift +329 -0
  455. package/numkong/swift/README.md +433 -0
  456. package/numkong/swift/Scalar.swift +741 -0
  457. package/numkong/swift/Tensor.swift +209 -0
  458. package/numkong/test/README.md +315 -0
  459. package/numkong/test/playwright.config.ts +16 -0
  460. package/numkong/test/swift/Test.swift +534 -0
  461. package/numkong/test/test-browser-bundle-runner.mjs +36 -0
  462. package/numkong/test/test-browser-bundle.html +188 -0
  463. package/numkong/test/test-browser-runner.mjs +43 -0
  464. package/numkong/test/test-browser.html +305 -0
  465. package/numkong/test/test-dtypes.mjs +453 -0
  466. package/numkong/test/test-wasm.mjs +267 -0
  467. package/numkong/test/test.cpp +442 -0
  468. package/numkong/test/test.hpp +580 -0
  469. package/numkong/test/test.mjs +363 -0
  470. package/numkong/test/test_base.py +1041 -0
  471. package/numkong/test/test_cast.cpp +242 -0
  472. package/numkong/test/test_cross.hpp +551 -0
  473. package/numkong/test/test_cross.py +467 -0
  474. package/numkong/test/test_cross_amx.cpp +50 -0
  475. package/numkong/test/test_cross_arm.cpp +225 -0
  476. package/numkong/test/test_cross_blas.cpp +354 -0
  477. package/numkong/test/test_cross_loongarch.cpp +90 -0
  478. package/numkong/test/test_cross_power.cpp +73 -0
  479. package/numkong/test/test_cross_rvv.cpp +109 -0
  480. package/numkong/test/test_cross_serial.cpp +181 -0
  481. package/numkong/test/test_cross_sme.cpp +148 -0
  482. package/numkong/test/test_cross_wasm.cpp +141 -0
  483. package/numkong/test/test_cross_x86.cpp +442 -0
  484. package/numkong/test/test_curved.cpp +182 -0
  485. package/numkong/test/test_curved.py +207 -0
  486. package/numkong/test/test_dot.cpp +353 -0
  487. package/numkong/test/test_dot.py +296 -0
  488. package/numkong/test/test_each.cpp +437 -0
  489. package/numkong/test/test_each.py +756 -0
  490. package/numkong/test/test_geospatial.cpp +155 -0
  491. package/numkong/test/test_geospatial.py +241 -0
  492. package/numkong/test/test_maxsim.cpp +138 -0
  493. package/numkong/test/test_maxsim.py +209 -0
  494. package/numkong/test/test_mesh.cpp +203 -0
  495. package/numkong/test/test_mesh.py +394 -0
  496. package/numkong/test/test_probability.cpp +136 -0
  497. package/numkong/test/test_probability.py +166 -0
  498. package/numkong/test/test_reduce.cpp +563 -0
  499. package/numkong/test/test_reduce.py +781 -0
  500. package/numkong/test/test_set.cpp +151 -0
  501. package/numkong/test/test_set.py +120 -0
  502. package/numkong/test/test_similarities.py +579 -0
  503. package/numkong/test/test_sparse.cpp +121 -0
  504. package/numkong/test/test_sparse.py +118 -0
  505. package/numkong/test/test_spatial.cpp +518 -0
  506. package/numkong/test/test_spatial.py +269 -0
  507. package/numkong/test/test_tensor.cpp +884 -0
  508. package/numkong/test/test_tensor.py +1417 -0
  509. package/numkong/test/test_trigonometry.cpp +156 -0
  510. package/numkong/test/test_trigonometry.py +180 -0
  511. package/package.json +7 -8
  512. package/prebuilds/darwin-arm64+x64/usearch.node +0 -0
  513. package/prebuilds/linux-arm64/usearch.node +0 -0
  514. package/prebuilds/linux-x64/usearch.node +0 -0
  515. package/fp16/CMakeLists.txt +0 -176
  516. package/fp16/LICENSE +0 -11
  517. package/fp16/README.md +0 -20
  518. package/fp16/bench/alt-element.cc +0 -89
  519. package/fp16/bench/from-alt-array.cc +0 -175
  520. package/fp16/bench/from-ieee-array.cc +0 -399
  521. package/fp16/bench/ieee-element.cc +0 -272
  522. package/fp16/bench/to-alt-array.cc +0 -91
  523. package/fp16/bench/to-ieee-array.cc +0 -303
  524. package/fp16/cmake/DownloadGoogleBenchmark.cmake +0 -15
  525. package/fp16/cmake/DownloadGoogleTest.cmake +0 -15
  526. package/fp16/cmake/DownloadPSimd.cmake +0 -15
  527. package/fp16/configure.py +0 -65
  528. package/fp16/confu.yaml +0 -8
  529. package/fp16/include/fp16/__init__.py +0 -0
  530. package/fp16/include/fp16/avx.py +0 -50
  531. package/fp16/include/fp16/avx2.py +0 -53
  532. package/fp16/include/fp16/bitcasts.h +0 -92
  533. package/fp16/include/fp16/fp16.h +0 -451
  534. package/fp16/include/fp16/psimd.h +0 -131
  535. package/fp16/include/fp16.h +0 -11
  536. package/fp16/jni/Android.mk +0 -6
  537. package/fp16/jni/Application.mk +0 -4
  538. package/fp16/test/alt-from-fp32-value.cc +0 -498
  539. package/fp16/test/alt-to-fp32-bits.cc +0 -263
  540. package/fp16/test/alt-to-fp32-psimd.cc +0 -145
  541. package/fp16/test/alt-to-fp32-value.cc +0 -348
  542. package/fp16/test/alt-to-fp32x2-psimd.cc +0 -245
  543. package/fp16/test/bitcasts.cc +0 -56
  544. package/fp16/test/ieee-from-fp32-value.cc +0 -523
  545. package/fp16/test/ieee-to-fp32-bits.cc +0 -333
  546. package/fp16/test/ieee-to-fp32-psimd.cc +0 -312
  547. package/fp16/test/ieee-to-fp32-value.cc +0 -420
  548. package/fp16/test/ieee-to-fp32x2-psimd.cc +0 -541
  549. package/fp16/test/peachpy/alt-xmm-to-fp32-xmm-avx.cc +0 -96
  550. package/fp16/test/peachpy/alt-xmm-to-fp32-ymm-avx2.cc +0 -96
  551. package/fp16/test/peachpy/stubs.py +0 -38
  552. package/fp16/test/tables.cc +0 -530
  553. package/fp16/test/tables.h +0 -13
  554. package/fp16/third-party/THHalf.h +0 -92
  555. package/fp16/third-party/eigen-half.h +0 -170
  556. package/fp16/third-party/float16-compressor.h +0 -80
  557. package/fp16/third-party/half.hpp +0 -2916
  558. package/fp16/third-party/npy-halffloat.h +0 -328
  559. package/simsimd/.git-blame-ignore-revs +0 -2
  560. package/simsimd/CONTRIBUTING.md +0 -321
  561. package/simsimd/Cargo.toml +0 -49
  562. package/simsimd/MANIFEST.in +0 -4
  563. package/simsimd/Package.swift +0 -28
  564. package/simsimd/README.md +0 -1493
  565. package/simsimd/binding.gyp +0 -35
  566. package/simsimd/build.rs +0 -70
  567. package/simsimd/c/lib.c +0 -374
  568. package/simsimd/include/module.modulemap +0 -4
  569. package/simsimd/include/simsimd/binary.h +0 -486
  570. package/simsimd/include/simsimd/curved.h +0 -1541
  571. package/simsimd/include/simsimd/dot.h +0 -1853
  572. package/simsimd/include/simsimd/elementwise.h +0 -2465
  573. package/simsimd/include/simsimd/geospatial.h +0 -43
  574. package/simsimd/include/simsimd/mesh.h +0 -69
  575. package/simsimd/include/simsimd/probability.h +0 -606
  576. package/simsimd/include/simsimd/simsimd.h +0 -2567
  577. package/simsimd/include/simsimd/sparse.h +0 -1384
  578. package/simsimd/include/simsimd/spatial.h +0 -2335
  579. package/simsimd/include/simsimd/types.h +0 -666
  580. package/simsimd/javascript/fallback.ts +0 -233
  581. package/simsimd/javascript/lib.c +0 -125
  582. package/simsimd/javascript/node-gyp-build.d.ts +0 -1
  583. package/simsimd/javascript/simsimd.ts +0 -179
  584. package/simsimd/javascript/tsconfig-cjs.json +0 -8
  585. package/simsimd/package-lock.json +0 -1761
  586. package/simsimd/package.json +0 -61
  587. package/simsimd/rust/lib.rs +0 -1821
  588. package/simsimd/scripts/bench.cxx +0 -1170
  589. package/simsimd/scripts/bench.ipynb +0 -187
  590. package/simsimd/scripts/bench.js +0 -127
  591. package/simsimd/scripts/bench.rs +0 -876
  592. package/simsimd/scripts/bench_vectors.py +0 -734
  593. package/simsimd/scripts/bench_vectors_live.py +0 -213
  594. package/simsimd/scripts/test.c +0 -187
  595. package/simsimd/scripts/test.mjs +0 -220
  596. package/simsimd/scripts/test.py +0 -1505
  597. package/simsimd/swift/SimSIMD.swift +0 -149
  598. package/simsimd/swift/Test.swift +0 -128
  599. /package/{simsimd → numkong}/CODE_OF_CONDUCT.md +0 -0
  600. /package/{simsimd → numkong}/LICENSE +0 -0
  601. /package/{simsimd → numkong}/javascript/dist-package-cjs.json +0 -0
  602. /package/{simsimd → numkong}/javascript/dist-package-esm.json +0 -0
@@ -0,0 +1,940 @@
1
+ /**
2
+ * @brief Dynamic dispatch library for NumKong.
3
+ * @file c/numkong.c
4
+ * @author Ash Vardanian
5
+ * @date March 13, 2024
6
+ */
7
+ #include "dispatch.h"
8
+
9
+ /* MemorySanitizer cannot track initialization through SIMD intrinsics (SVE, NEON, SSE, AVX),
10
+ * causing false-positive "use-of-uninitialized-value" reports. We unpoison results after dispatch.
11
+ */
12
+ #if defined(__has_feature)
13
+ #if __has_feature(memory_sanitizer)
14
+ #include <sanitizer/msan_interface.h>
15
+ #define nk_unpoison_(ptr, size) __msan_unpoison((ptr), (size))
16
+ #endif
17
+ #endif
18
+ #ifndef nk_unpoison_
19
+ #define nk_unpoison_(ptr, size) nk_unused_(ptr), nk_unused_(size)
20
+ #endif
21
+
22
+ #ifdef __cplusplus
23
+ extern "C" {
24
+ #endif
25
+
26
+ // WASM capability detection for standalone Emscripten builds.
27
+ // EM_JS embeds JavaScript probes for runtime SIMD detection. It only works in
28
+ // standalone builds — Pyodide side modules cannot use EM_JS (the linker fails
29
+ // with undefined ___em_js__* symbols). Pyodide builds define NK_PYODIDE_SIDE_MODULE
30
+ // and fall through to compile-time detection in capabilities.h instead.
31
+ #if defined(__EMSCRIPTEN__) && NK_DYNAMIC_DISPATCH && !defined(NK_PYODIDE_SIDE_MODULE)
32
+ #include <emscripten.h>
33
+
34
+ // EM_JS expands to an empty-parameter-list declaration `()` and a trailing `;`,
35
+ // which trigger `-Wstrict-prototypes` and `-Wextra-semi` under Clang/Emscripten.
36
+ #if defined(__clang__)
37
+ #pragma clang diagnostic push
38
+ #pragma clang diagnostic ignored "-Wstrict-prototypes"
39
+ #pragma clang diagnostic ignored "-Wextra-semi"
40
+ #endif
41
+
42
+ EM_JS(int, nk_has_v128, (), {
43
+ var test = new Uint8Array([
44
+ 0x00, 0x61, 0x73, 0x6d, 0x01, 0x00, 0x00, 0x00, 0x01, 0x05, 0x01, 0x60, 0x00, 0x01, 0x7b, 0x03,
45
+ 0x02, 0x01, 0x00, 0x0a, 0x09, 0x01, 0x07, 0x00, 0xfd, 0x0c, 0x00, 0x00, 0x00, 0x00, 0x0b
46
+ ]);
47
+ try {
48
+ return WebAssembly.validate(test) ? 1 : 0;
49
+ }
50
+ catch (e) {
51
+ return 0;
52
+ }
53
+ });
54
+
55
+ EM_JS(int, nk_has_relaxed, (), {
56
+ var test = new Uint8Array([
57
+ 0x00, 0x61, 0x73, 0x6d, 0x01, 0x00, 0x00, 0x00, 0x01, 0x08, 0x01, 0x60, 0x03,
58
+ 0x7b, 0x7b, 0x7b, 0x01, 0x7b, 0x03, 0x02, 0x01, 0x00, 0x0a, 0x09, 0x01, 0x07,
59
+ 0x00, 0x20, 0x00, 0x20, 0x01, 0x20, 0x02, 0xfd, 0xaf, 0x01, 0x0b
60
+ ]);
61
+ try {
62
+ return WebAssembly.validate(test) ? 1 : 0;
63
+ }
64
+ catch (e) {
65
+ return 0;
66
+ }
67
+ });
68
+
69
+ #if defined(__clang__)
70
+ #pragma clang diagnostic pop
71
+ #endif
72
+ #endif // __EMSCRIPTEN__ && NK_DYNAMIC_DISPATCH && !NK_PYODIDE_SIDE_MODULE
73
+
74
+ /**
75
+ * @brief Fill memory with 0xFF - produces NaN for floats, -1 for signed integers, and MAX for unsigned.
76
+ * Avoids libc dependency on memset.
77
+ */
78
+ NK_INTERNAL void nk_fill_error_(void *ptr, nk_size_t bytes) {
79
+ nk_u8_t *p = (nk_u8_t *)ptr;
80
+ while (bytes--) *p++ = 0xFF;
81
+ }
82
+
83
+ void nk_error_dense_(void const *a, void const *b, nk_size_t n, void *d) {
84
+ nk_unused_(a);
85
+ nk_unused_(b);
86
+ nk_unused_(n);
87
+ nk_fill_error_(d, sizeof(nk_fmax_t));
88
+ }
89
+
90
+ void nk_error_sparse_intersect_(void const *a, void const *b, nk_size_t a_length, nk_size_t b_length, void *result,
91
+ nk_size_t *count) {
92
+ nk_unused_(a);
93
+ nk_unused_(b);
94
+ nk_unused_(a_length);
95
+ nk_unused_(b_length);
96
+ nk_unused_(result);
97
+ if (count) *count = 0;
98
+ }
99
+
100
+ void nk_error_sparse_dot_(void const *a, void const *b, void const *a_weights, void const *b_weights,
101
+ nk_size_t a_length, nk_size_t b_length, void *product) {
102
+ nk_unused_(a);
103
+ nk_unused_(b);
104
+ nk_unused_(a_weights);
105
+ nk_unused_(b_weights);
106
+ nk_unused_(a_length);
107
+ nk_unused_(b_length);
108
+ nk_fill_error_(product, sizeof(nk_fmax_t));
109
+ }
110
+
111
+ void nk_error_curved_(void const *a, void const *b, void const *c, nk_size_t n, void *result) {
112
+ nk_unused_(a);
113
+ nk_unused_(b);
114
+ nk_unused_(c);
115
+ nk_unused_(n);
116
+ nk_fill_error_(result, sizeof(nk_fmax_t));
117
+ }
118
+
119
+ void nk_error_geospatial_(void const *a_lats, void const *a_lons, void const *b_lats, void const *b_lons, nk_size_t n,
120
+ void *results) {
121
+ nk_unused_(a_lats);
122
+ nk_unused_(a_lons);
123
+ nk_unused_(b_lats);
124
+ nk_unused_(b_lons);
125
+ nk_unused_(n);
126
+ nk_fill_error_(results, sizeof(nk_fmax_t));
127
+ }
128
+
129
+ void nk_error_each_fma_(void const *a, void const *b, void const *c, nk_size_t n, void const *alpha, void const *beta,
130
+ void *result) {
131
+ nk_unused_(a);
132
+ nk_unused_(b);
133
+ nk_unused_(c);
134
+ nk_unused_(alpha);
135
+ nk_unused_(beta);
136
+ nk_fill_error_(result, n * sizeof(nk_fmax_t));
137
+ }
138
+
139
+ void nk_error_each_blend_(void const *a, void const *b, nk_size_t n, void const *alpha, void const *beta,
140
+ void *result) {
141
+ nk_unused_(a);
142
+ nk_unused_(b);
143
+ nk_unused_(alpha);
144
+ nk_unused_(beta);
145
+ nk_fill_error_(result, n * sizeof(nk_fmax_t));
146
+ }
147
+
148
+ void nk_error_each_scale_(void const *a, nk_size_t n, void const *alpha, void const *beta, void *result) {
149
+ nk_unused_(a);
150
+ nk_unused_(alpha);
151
+ nk_unused_(beta);
152
+ nk_fill_error_(result, n * sizeof(nk_fmax_t));
153
+ }
154
+
155
+ void nk_error_each_sum_(void const *a, void const *b, nk_size_t n, void *y) {
156
+ nk_unused_(a);
157
+ nk_unused_(b);
158
+ nk_fill_error_(y, n * sizeof(nk_fmax_t));
159
+ }
160
+
161
+ void nk_error_trigonometry_(void const *x, nk_size_t n, void *y) {
162
+ nk_unused_(x);
163
+ nk_fill_error_(y, n * sizeof(nk_fmax_t));
164
+ }
165
+
166
+ void nk_error_mesh_(void const *a, void const *b, nk_size_t n, void *a_centroid, void *b_centroid, void *rotation,
167
+ void *scale, void *result) {
168
+ nk_unused_(a);
169
+ nk_unused_(b);
170
+ nk_unused_(n);
171
+ if (a_centroid) nk_fill_error_(a_centroid, 3 * sizeof(nk_fmax_t));
172
+ if (b_centroid) nk_fill_error_(b_centroid, 3 * sizeof(nk_fmax_t));
173
+ if (rotation) nk_fill_error_(rotation, 9 * sizeof(nk_fmax_t));
174
+ if (scale) nk_fill_error_(scale, sizeof(nk_fmax_t));
175
+ nk_fill_error_(result, sizeof(nk_fmax_t));
176
+ }
177
+
178
+ void nk_error_reduce_moments_(void const *data, nk_size_t count, nk_size_t stride_bytes, void *sum_ptr,
179
+ void *sumsq_ptr) {
180
+ nk_unused_(data), nk_unused_(count), nk_unused_(stride_bytes), nk_unused_(sum_ptr), nk_unused_(sumsq_ptr);
181
+ nk_fill_error_(sum_ptr, sizeof(nk_fmax_t));
182
+ nk_fill_error_(sumsq_ptr, sizeof(nk_fmax_t));
183
+ }
184
+
185
+ void nk_error_reduce_minmax_(void const *data, nk_size_t count, nk_size_t stride_bytes, void *min_value,
186
+ nk_size_t *min_index, void *max_value, nk_size_t *max_index) {
187
+ nk_unused_(data), nk_unused_(count), nk_unused_(stride_bytes), nk_unused_(min_value), nk_unused_(min_index),
188
+ nk_unused_(max_value), nk_unused_(max_index);
189
+ nk_fill_error_(min_value, sizeof(nk_fmax_t));
190
+ nk_fill_error_(min_index, sizeof(nk_size_t));
191
+ nk_fill_error_(max_value, sizeof(nk_fmax_t));
192
+ nk_fill_error_(max_index, sizeof(nk_size_t));
193
+ }
194
+
195
+ nk_size_t nk_error_packed_size_(nk_size_t n, nk_size_t k) {
196
+ nk_unused_(n);
197
+ nk_unused_(k);
198
+ return 0;
199
+ }
200
+
201
+ void nk_error_pack_(void const *b, nk_size_t n, nk_size_t k, nk_size_t b_stride, void *b_packed) {
202
+ nk_unused_(b);
203
+ nk_unused_(n);
204
+ nk_unused_(k);
205
+ nk_unused_(b_stride);
206
+ nk_unused_(b_packed);
207
+ }
208
+
209
+ void nk_error_dots_(void const *a, void const *b_packed, void *c, nk_size_t m, nk_size_t n, nk_size_t k,
210
+ nk_size_t a_stride, nk_size_t c_stride) {
211
+ nk_unused_(a);
212
+ nk_unused_(b_packed);
213
+ nk_unused_(k);
214
+ nk_unused_(a_stride);
215
+ for (nk_size_t row = 0; row < m; ++row) nk_fill_error_((nk_u8_t *)c + row * c_stride, n * sizeof(nk_fmax_t));
216
+ }
217
+
218
+ void nk_error_dots_symmetric_(void const *vectors, nk_size_t n_vectors, nk_size_t depth, nk_size_t stride, void *result,
219
+ nk_size_t result_stride, nk_size_t row_start, nk_size_t row_count) {
220
+ nk_unused_(vectors);
221
+ nk_unused_(depth);
222
+ nk_unused_(stride);
223
+ nk_unused_(row_start);
224
+ nk_unused_(row_count);
225
+ for (nk_size_t row = 0; row < n_vectors; ++row)
226
+ nk_fill_error_((nk_u8_t *)result + row * result_stride, n_vectors * sizeof(nk_fmax_t));
227
+ }
228
+
229
+ // Global dispatch table - 64-byte aligned for cache performance
230
+ // Type defined in dispatch.h, made non-static for access from dtype files
231
+ NK_ALIGN64 nk_implementations_t nk_dispatch_table;
232
+
233
+ // Direct dispatch macros using central dispatch table (no lazy initialization)
234
+ #define nk_dispatch_dense_(name, extension, input_type, output_type) \
235
+ NK_DYNAMIC void nk_##name##_##extension(nk_##input_type##_t const *a, nk_##input_type##_t const *b, nk_size_t n, \
236
+ nk_##output_type##_t *results) { \
237
+ nk_dispatch_table.name##_##extension(a, b, n, (void *)results); \
238
+ nk_unpoison_((void *)results, sizeof(nk_##output_type##_t)); \
239
+ }
240
+
241
+ #define nk_dispatch_sparse_(name, extension, type) \
242
+ NK_DYNAMIC void nk_##name##_##extension(nk_##type##_t const *a, nk_##type##_t const *b, nk_size_t a_length, \
243
+ nk_size_t b_length, nk_##type##_t *result, nk_size_t *count) { \
244
+ nk_dispatch_table.name##_##extension(a, b, a_length, b_length, (void *)result, count); \
245
+ nk_unpoison_(count, sizeof(nk_size_t)); \
246
+ nk_unpoison_((void *)result, (*count) * sizeof(nk_##type##_t)); \
247
+ }
248
+
249
+ #define nk_dispatch_sparse_dot_(name, index_type, weight_type, output_type) \
250
+ NK_DYNAMIC void nk_##name##_##index_type##weight_type(nk_##index_type##_t const *a, nk_##index_type##_t const *b, \
251
+ nk_##weight_type##_t const *a_weights, \
252
+ nk_##weight_type##_t const *b_weights, nk_size_t a_length, \
253
+ nk_size_t b_length, nk_##output_type##_t *product) { \
254
+ nk_dispatch_table.name##_##index_type##weight_type(a, b, a_weights, b_weights, a_length, b_length, \
255
+ (void *)product); \
256
+ nk_unpoison_((void *)product, sizeof(nk_##output_type##_t)); \
257
+ }
258
+
259
+ #define nk_dispatch_curved_(name, extension, output_type) \
260
+ NK_DYNAMIC void nk_##name##_##extension(nk_##extension##_t const *a, nk_##extension##_t const *b, \
261
+ nk_##extension##_t const *c, nk_size_t n, nk_##output_type##_t *result) { \
262
+ nk_dispatch_table.name##_##extension(a, b, c, n, (void *)result); \
263
+ nk_unpoison_((void *)result, sizeof(nk_##output_type##_t)); \
264
+ }
265
+
266
+ #define nk_dispatch_geospatial_(name, extension, output_type) \
267
+ NK_DYNAMIC void nk_##name##_##extension(nk_##extension##_t const *a_lats, nk_##extension##_t const *a_lons, \
268
+ nk_##extension##_t const *b_lats, nk_##extension##_t const *b_lons, \
269
+ nk_size_t n, nk_##output_type##_t *results) { \
270
+ nk_dispatch_table.name##_##extension(a_lats, a_lons, b_lats, b_lons, n, (void *)results); \
271
+ nk_unpoison_((void *)results, sizeof(nk_##output_type##_t)); \
272
+ }
273
+
274
+ #define nk_dispatch_each_fma_(extension, scalar_type) \
275
+ NK_DYNAMIC void nk_each_fma_##extension( \
276
+ nk_##extension##_t const *a, nk_##extension##_t const *b, nk_##extension##_t const *c, nk_size_t n, \
277
+ nk_##scalar_type##_t const *alpha, nk_##scalar_type##_t const *beta, nk_##extension##_t *result) { \
278
+ nk_dispatch_table.each_fma_##extension(a, b, c, n, (void const *)alpha, (void const *)beta, result); \
279
+ nk_unpoison_((void *)result, n * sizeof(nk_##extension##_t)); \
280
+ }
281
+
282
+ #define nk_dispatch_each_blend_(extension, scalar_type) \
283
+ NK_DYNAMIC void nk_each_blend_##extension(nk_##extension##_t const *a, nk_##extension##_t const *b, nk_size_t n, \
284
+ nk_##scalar_type##_t const *alpha, nk_##scalar_type##_t const *beta, \
285
+ nk_##extension##_t *result) { \
286
+ nk_dispatch_table.each_blend_##extension(a, b, n, (void const *)alpha, (void const *)beta, result); \
287
+ nk_unpoison_((void *)result, n * sizeof(nk_##extension##_t)); \
288
+ }
289
+
290
+ #define nk_dispatch_each_scale_(extension, scalar_type) \
291
+ NK_DYNAMIC void nk_each_scale_##extension(nk_##extension##_t const *a, nk_size_t n, \
292
+ nk_##scalar_type##_t const *alpha, nk_##scalar_type##_t const *beta, \
293
+ nk_##extension##_t *result) { \
294
+ nk_dispatch_table.each_scale_##extension(a, n, (void const *)alpha, (void const *)beta, result); \
295
+ nk_unpoison_((void *)result, n * sizeof(nk_##extension##_t)); \
296
+ }
297
+
298
+ #define nk_dispatch_each_sum_(extension) \
299
+ NK_DYNAMIC void nk_each_sum_##extension(nk_##extension##_t const *a, nk_##extension##_t const *b, nk_size_t n, \
300
+ nk_##extension##_t *result) { \
301
+ nk_dispatch_table.each_sum_##extension(a, b, n, result); \
302
+ nk_unpoison_((void *)result, n * sizeof(nk_##extension##_t)); \
303
+ }
304
+
305
+ #define nk_dispatch_trigonometry_(name, extension) \
306
+ NK_DYNAMIC void nk_each_##name##_##extension(nk_##extension##_t const *inputs, nk_size_t n, \
307
+ nk_##extension##_t *outputs) { \
308
+ nk_dispatch_table.each_##name##_##extension(inputs, n, outputs); \
309
+ nk_unpoison_((void *)outputs, n * sizeof(nk_##extension##_t)); \
310
+ }
311
+
312
+ #define nk_dispatch_mesh_(name, extension, transform_type, metric_type) \
313
+ NK_DYNAMIC void nk_##name##_##extension(nk_##extension##_t const *a, nk_##extension##_t const *b, nk_size_t n, \
314
+ nk_##transform_type##_t *a_centroid, nk_##transform_type##_t *b_centroid, \
315
+ nk_##transform_type##_t *rotation, nk_##transform_type##_t *scale, \
316
+ nk_##metric_type##_t *result) { \
317
+ nk_dispatch_table.name##_##extension(a, b, n, (void *)a_centroid, (void *)b_centroid, (void *)rotation, \
318
+ (void *)scale, (void *)result); \
319
+ if (a_centroid) nk_unpoison_((void *)a_centroid, 3 * sizeof(nk_##transform_type##_t)); \
320
+ if (b_centroid) nk_unpoison_((void *)b_centroid, 3 * sizeof(nk_##transform_type##_t)); \
321
+ if (rotation) nk_unpoison_((void *)rotation, 9 * sizeof(nk_##transform_type##_t)); \
322
+ if (scale) nk_unpoison_((void *)scale, sizeof(nk_##transform_type##_t)); \
323
+ nk_unpoison_((void *)result, sizeof(nk_##metric_type##_t)); \
324
+ }
325
+
326
+ #define nk_dispatch_reduce_moments_(extension, data_type, sum_type, sumsq_type) \
327
+ NK_DYNAMIC void nk_reduce_moments_##extension(data_type const *data, nk_size_t count, nk_size_t stride_bytes, \
328
+ sum_type *sum_ptr, sumsq_type *sumsq_ptr) { \
329
+ ((nk_kernel_reduce_moments_punned_t)nk_dispatch_table.reduce_moments_##extension)(data, count, stride_bytes, \
330
+ sum_ptr, sumsq_ptr); \
331
+ nk_unpoison_((void *)sum_ptr, sizeof(sum_type)); \
332
+ nk_unpoison_((void *)sumsq_ptr, sizeof(sumsq_type)); \
333
+ }
334
+
335
+ #define nk_dispatch_reduce_minmax_(extension, data_type, minmax_type) \
336
+ NK_DYNAMIC void nk_reduce_minmax_##extension(data_type const *data, nk_size_t count, nk_size_t stride_bytes, \
337
+ minmax_type *min_value, nk_size_t *min_index, minmax_type *max_value, \
338
+ nk_size_t *max_index) { \
339
+ ((nk_kernel_reduce_minmax_punned_t)nk_dispatch_table.reduce_minmax_##extension)( \
340
+ data, count, stride_bytes, min_value, min_index, max_value, max_index); \
341
+ nk_unpoison_((void *)min_value, sizeof(minmax_type)); \
342
+ nk_unpoison_(min_index, sizeof(nk_size_t)); \
343
+ nk_unpoison_((void *)max_value, sizeof(minmax_type)); \
344
+ nk_unpoison_(max_index, sizeof(nk_size_t)); \
345
+ }
346
+
347
+ #define nk_dispatch_cross_packed_size_(api_name, name, input_type, accum_type) \
348
+ NK_DYNAMIC nk_size_t nk_##api_name##_packed_size_##name(nk_size_t n, nk_size_t k) { \
349
+ return nk_dispatch_table.api_name##_packed_size_##name(n, k); \
350
+ }
351
+
352
+ #define nk_dispatch_cross_pack_(api_name, name, input_type, accum_type) \
353
+ NK_DYNAMIC void nk_##api_name##_pack_##name(nk_##input_type##_t const *b, nk_size_t n, nk_size_t k, \
354
+ nk_size_t b_stride, void *b_packed) { \
355
+ nk_dispatch_table.api_name##_pack_##name(b, n, k, b_stride, b_packed); \
356
+ }
357
+
358
+ #define nk_dispatch_cross_packed_(api_name, name, input_type, accum_type, output_type) \
359
+ NK_DYNAMIC void nk_##api_name##_packed_##name(nk_##input_type##_t const *a, void const *b_packed, \
360
+ nk_##output_type##_t *c, nk_size_t m, nk_size_t n, nk_size_t k, \
361
+ nk_size_t a_stride, nk_size_t c_stride) { \
362
+ nk_dispatch_table.api_name##_packed_##name(a, b_packed, c, m, n, k, a_stride, c_stride); \
363
+ nk_unpoison_((void *)c, m * c_stride); \
364
+ }
365
+
366
+ #define nk_dispatch_cross_symmetric_(api_name, name, input_type, output_type) \
367
+ NK_DYNAMIC void nk_##api_name##_symmetric_##name( \
368
+ nk_##input_type##_t const *vectors, nk_size_t n_vectors, nk_size_t depth, nk_size_t stride, \
369
+ nk_##output_type##_t *result, nk_size_t result_stride, nk_size_t row_start, nk_size_t row_count) { \
370
+ nk_dispatch_table.api_name##_symmetric_##name(vectors, n_vectors, depth, stride, result, result_stride, \
371
+ row_start, row_count); \
372
+ nk_unpoison_((void *)result, row_count * result_stride); \
373
+ }
374
+
375
+ #define nk_dispatch_maxsim_packed_(name, output_type) \
376
+ NK_DYNAMIC void nk_maxsim_packed_##name(void const *q_packed, void const *d_packed, nk_size_t n_q, nk_size_t n_d, \
377
+ nk_size_t depth, nk_##output_type##_t *result) { \
378
+ nk_dispatch_table.maxsim_packed_##name(q_packed, d_packed, n_q, n_d, depth, (void *)result); \
379
+ nk_unpoison_((void *)result, sizeof(nk_##output_type##_t)); \
380
+ }
381
+
382
+ // Dot products
383
+ nk_dispatch_dense_(dot, f64c, f64c, f64c)
384
+ nk_dispatch_dense_(dot, f32c, f32c, f64c)
385
+ nk_dispatch_dense_(dot, bf16c, bf16c, f32c)
386
+ nk_dispatch_dense_(dot, f16c, f16c, f32c)
387
+ nk_dispatch_dense_(dot, f64, f64, f64)
388
+ nk_dispatch_dense_(dot, f32, f32, f64)
389
+ nk_dispatch_dense_(dot, bf16, bf16, f32)
390
+ nk_dispatch_dense_(dot, f16, f16, f32)
391
+ nk_dispatch_dense_(dot, e5m2, e5m2, f32)
392
+ nk_dispatch_dense_(dot, e4m3, e4m3, f32)
393
+ nk_dispatch_dense_(dot, e3m2, e3m2, f32)
394
+ nk_dispatch_dense_(dot, e2m3, e2m3, f32)
395
+ nk_dispatch_dense_(dot, i8, i8, i32)
396
+ nk_dispatch_dense_(dot, i4, i4x2, i32)
397
+ nk_dispatch_dense_(dot, u8, u8, u32)
398
+ nk_dispatch_dense_(dot, u4, u4x2, u32)
399
+ nk_dispatch_dense_(dot, u1, u1x8, u32)
400
+ nk_dispatch_dense_(vdot, f64c, f64c, f64c)
401
+ nk_dispatch_dense_(vdot, f32c, f32c, f64c)
402
+ nk_dispatch_dense_(vdot, bf16c, bf16c, f32c)
403
+ nk_dispatch_dense_(vdot, f16c, f16c, f32c)
404
+
405
+ // Spatial distances
406
+ nk_dispatch_dense_(angular, f64, f64, f64)
407
+ nk_dispatch_dense_(angular, f32, f32, f64)
408
+ nk_dispatch_dense_(angular, bf16, bf16, f32)
409
+ nk_dispatch_dense_(angular, f16, f16, f32)
410
+ nk_dispatch_dense_(angular, e5m2, e5m2, f32)
411
+ nk_dispatch_dense_(angular, e4m3, e4m3, f32)
412
+ nk_dispatch_dense_(angular, e3m2, e3m2, f32)
413
+ nk_dispatch_dense_(angular, e2m3, e2m3, f32)
414
+ nk_dispatch_dense_(angular, i8, i8, f32)
415
+ nk_dispatch_dense_(angular, i4, i4x2, f32)
416
+ nk_dispatch_dense_(angular, u8, u8, f32)
417
+ nk_dispatch_dense_(angular, u4, u4x2, f32)
418
+ nk_dispatch_dense_(euclidean, f64, f64, f64)
419
+ nk_dispatch_dense_(euclidean, f32, f32, f64)
420
+ nk_dispatch_dense_(euclidean, bf16, bf16, f32)
421
+ nk_dispatch_dense_(euclidean, f16, f16, f32)
422
+ nk_dispatch_dense_(euclidean, e5m2, e5m2, f32)
423
+ nk_dispatch_dense_(euclidean, e4m3, e4m3, f32)
424
+ nk_dispatch_dense_(euclidean, e3m2, e3m2, f32)
425
+ nk_dispatch_dense_(euclidean, e2m3, e2m3, f32)
426
+ nk_dispatch_dense_(euclidean, i8, i8, f32)
427
+ nk_dispatch_dense_(euclidean, i4, i4x2, f32)
428
+ nk_dispatch_dense_(euclidean, u8, u8, f32)
429
+ nk_dispatch_dense_(euclidean, u4, u4x2, f32)
430
+ nk_dispatch_dense_(sqeuclidean, f64, f64, f64)
431
+ nk_dispatch_dense_(sqeuclidean, f32, f32, f64)
432
+ nk_dispatch_dense_(sqeuclidean, bf16, bf16, f32)
433
+ nk_dispatch_dense_(sqeuclidean, f16, f16, f32)
434
+ nk_dispatch_dense_(sqeuclidean, e5m2, e5m2, f32)
435
+ nk_dispatch_dense_(sqeuclidean, e4m3, e4m3, f32)
436
+ nk_dispatch_dense_(sqeuclidean, e3m2, e3m2, f32)
437
+ nk_dispatch_dense_(sqeuclidean, e2m3, e2m3, f32)
438
+ nk_dispatch_dense_(sqeuclidean, i8, i8, u32)
439
+ nk_dispatch_dense_(sqeuclidean, i4, i4x2, u32)
440
+ nk_dispatch_dense_(sqeuclidean, u8, u8, u32)
441
+ nk_dispatch_dense_(sqeuclidean, u4, u4x2, u32)
442
+
443
+ // Binary distances
444
+ nk_dispatch_dense_(hamming, u8, u8, u32)
445
+ nk_dispatch_dense_(hamming, u1, u1x8, u32)
446
+ nk_dispatch_dense_(jaccard, u32, u32, f32)
447
+ nk_dispatch_dense_(jaccard, u16, u16, f32)
448
+ nk_dispatch_dense_(jaccard, u1, u1x8, f32)
449
+
450
+ // Curved spaces
451
+ nk_dispatch_curved_(bilinear, f64c, f64c)
452
+ nk_dispatch_curved_(bilinear, f32c, f64c)
453
+ nk_dispatch_curved_(bilinear, bf16c, f32c)
454
+ nk_dispatch_curved_(bilinear, f16c, f32c)
455
+ nk_dispatch_curved_(bilinear, f64, f64)
456
+ nk_dispatch_curved_(bilinear, f32, f64)
457
+ nk_dispatch_curved_(bilinear, bf16, f32)
458
+ nk_dispatch_curved_(bilinear, f16, f32)
459
+ nk_dispatch_curved_(mahalanobis, f64, f64)
460
+ nk_dispatch_curved_(mahalanobis, f32, f64)
461
+ nk_dispatch_curved_(mahalanobis, bf16, f32)
462
+ nk_dispatch_curved_(mahalanobis, f16, f32)
463
+
464
+ // Geospatial distances
465
+ nk_dispatch_geospatial_(haversine, f64, f64)
466
+ nk_dispatch_geospatial_(haversine, f32, f32)
467
+ nk_dispatch_geospatial_(vincenty, f64, f64)
468
+ nk_dispatch_geospatial_(vincenty, f32, f32)
469
+
470
+ // Probability distributions
471
+ nk_dispatch_dense_(kld, f64, f64, f64)
472
+ nk_dispatch_dense_(kld, f32, f32, f64)
473
+ nk_dispatch_dense_(kld, bf16, bf16, f32)
474
+ nk_dispatch_dense_(kld, f16, f16, f32)
475
+ nk_dispatch_dense_(jsd, f64, f64, f64)
476
+ nk_dispatch_dense_(jsd, f32, f32, f64)
477
+ nk_dispatch_dense_(jsd, bf16, bf16, f32)
478
+ nk_dispatch_dense_(jsd, f16, f16, f32)
479
+
480
+ // Mesh alignment (RMSD, Kabsch, Umeyama)
481
+ nk_dispatch_mesh_(rmsd, f64, f64, f64)
482
+ nk_dispatch_mesh_(rmsd, f32, f32, f64)
483
+ nk_dispatch_mesh_(rmsd, bf16, f32, f32)
484
+ nk_dispatch_mesh_(rmsd, f16, f32, f32)
485
+ nk_dispatch_mesh_(kabsch, f64, f64, f64)
486
+ nk_dispatch_mesh_(kabsch, f32, f32, f64)
487
+ nk_dispatch_mesh_(kabsch, bf16, f32, f32)
488
+ nk_dispatch_mesh_(kabsch, f16, f32, f32)
489
+ nk_dispatch_mesh_(umeyama, f64, f64, f64)
490
+ nk_dispatch_mesh_(umeyama, f32, f32, f64)
491
+ nk_dispatch_mesh_(umeyama, bf16, f32, f32)
492
+ nk_dispatch_mesh_(umeyama, f16, f32, f32)
493
+
494
+ // Sparse sets
495
+ nk_dispatch_sparse_(sparse_intersect, u64, u64)
496
+ nk_dispatch_sparse_(sparse_intersect, u32, u32)
497
+ nk_dispatch_sparse_(sparse_intersect, u16, u16)
498
+ nk_dispatch_sparse_dot_(sparse_dot, u32, f32, f64)
499
+ nk_dispatch_sparse_dot_(sparse_dot, u16, bf16, f32)
500
+
501
+ // Element-wise operations
502
+ nk_dispatch_each_scale_(f64c, f64c)
503
+ nk_dispatch_each_scale_(f32c, f32c)
504
+ nk_dispatch_each_scale_(f64, f64)
505
+ nk_dispatch_each_scale_(f32, f32)
506
+ nk_dispatch_each_scale_(bf16, f32)
507
+ nk_dispatch_each_scale_(f16, f32)
508
+ nk_dispatch_each_scale_(e5m2, f32)
509
+ nk_dispatch_each_scale_(e4m3, f32)
510
+ nk_dispatch_each_scale_(e3m2, f32)
511
+ nk_dispatch_each_scale_(e2m3, f32)
512
+ nk_dispatch_each_scale_(i64, f64)
513
+ nk_dispatch_each_scale_(i32, f64)
514
+ nk_dispatch_each_scale_(i16, f32)
515
+ nk_dispatch_each_scale_(i8, f32)
516
+ nk_dispatch_each_scale_(u64, f64)
517
+ nk_dispatch_each_scale_(u32, f64)
518
+ nk_dispatch_each_scale_(u16, f32)
519
+ nk_dispatch_each_scale_(u8, f32)
520
+ nk_dispatch_each_sum_(f64c)
521
+ nk_dispatch_each_sum_(f32c)
522
+ nk_dispatch_each_sum_(f64)
523
+ nk_dispatch_each_sum_(f32)
524
+ nk_dispatch_each_sum_(bf16)
525
+ nk_dispatch_each_sum_(f16)
526
+ nk_dispatch_each_sum_(e5m2)
527
+ nk_dispatch_each_sum_(e4m3)
528
+ nk_dispatch_each_sum_(e3m2)
529
+ nk_dispatch_each_sum_(e2m3)
530
+ nk_dispatch_each_sum_(i64)
531
+ nk_dispatch_each_sum_(i32)
532
+ nk_dispatch_each_sum_(i16)
533
+ nk_dispatch_each_sum_(i8)
534
+ nk_dispatch_each_sum_(u64)
535
+ nk_dispatch_each_sum_(u32)
536
+ nk_dispatch_each_sum_(u16)
537
+ nk_dispatch_each_sum_(u8)
538
+ nk_dispatch_each_blend_(f64c, f64c)
539
+ nk_dispatch_each_blend_(f32c, f32c)
540
+ nk_dispatch_each_blend_(f64, f64)
541
+ nk_dispatch_each_blend_(f32, f32)
542
+ nk_dispatch_each_blend_(bf16, f32)
543
+ nk_dispatch_each_blend_(f16, f32)
544
+ nk_dispatch_each_blend_(e5m2, f32)
545
+ nk_dispatch_each_blend_(e4m3, f32)
546
+ nk_dispatch_each_blend_(e3m2, f32)
547
+ nk_dispatch_each_blend_(e2m3, f32)
548
+ nk_dispatch_each_blend_(i64, f64)
549
+ nk_dispatch_each_blend_(i32, f64)
550
+ nk_dispatch_each_blend_(i16, f32)
551
+ nk_dispatch_each_blend_(i8, f32)
552
+ nk_dispatch_each_blend_(u64, f64)
553
+ nk_dispatch_each_blend_(u32, f64)
554
+ nk_dispatch_each_blend_(u16, f32)
555
+ nk_dispatch_each_blend_(u8, f32)
556
+ nk_dispatch_each_fma_(f64c, f64c)
557
+ nk_dispatch_each_fma_(f32c, f32c)
558
+ nk_dispatch_each_fma_(f64, f64)
559
+ nk_dispatch_each_fma_(f32, f32)
560
+ nk_dispatch_each_fma_(bf16, f32)
561
+ nk_dispatch_each_fma_(f16, f32)
562
+ nk_dispatch_each_fma_(e5m2, f32)
563
+ nk_dispatch_each_fma_(e4m3, f32)
564
+ nk_dispatch_each_fma_(e3m2, f32)
565
+ nk_dispatch_each_fma_(e2m3, f32)
566
+ nk_dispatch_each_fma_(i64, f64)
567
+ nk_dispatch_each_fma_(i32, f64)
568
+ nk_dispatch_each_fma_(i16, f32)
569
+ nk_dispatch_each_fma_(i8, f32)
570
+ nk_dispatch_each_fma_(u64, f64)
571
+ nk_dispatch_each_fma_(u32, f64)
572
+ nk_dispatch_each_fma_(u16, f32)
573
+ nk_dispatch_each_fma_(u8, f32)
574
+
575
+ // Trigonometry functions
576
+ nk_dispatch_trigonometry_(sin, f64)
577
+ nk_dispatch_trigonometry_(sin, f32)
578
+ nk_dispatch_trigonometry_(sin, f16)
579
+ nk_dispatch_trigonometry_(cos, f64)
580
+ nk_dispatch_trigonometry_(cos, f32)
581
+ nk_dispatch_trigonometry_(cos, f16)
582
+ nk_dispatch_trigonometry_(atan, f64)
583
+ nk_dispatch_trigonometry_(atan, f32)
584
+ nk_dispatch_trigonometry_(atan, f16)
585
+
586
+ // Horizontal reductions: moments (sum + sum-of-squares)
587
+ nk_dispatch_reduce_moments_(f64, nk_f64_t, nk_f64_t, nk_f64_t)
588
+ nk_dispatch_reduce_moments_(f32, nk_f32_t, nk_f64_t, nk_f64_t)
589
+ nk_dispatch_reduce_moments_(bf16, nk_bf16_t, nk_f32_t, nk_f32_t)
590
+ nk_dispatch_reduce_moments_(f16, nk_f16_t, nk_f32_t, nk_f32_t)
591
+ nk_dispatch_reduce_moments_(e5m2, nk_e5m2_t, nk_f32_t, nk_f32_t)
592
+ nk_dispatch_reduce_moments_(e4m3, nk_e4m3_t, nk_f32_t, nk_f32_t)
593
+ nk_dispatch_reduce_moments_(e3m2, nk_e3m2_t, nk_f32_t, nk_f32_t)
594
+ nk_dispatch_reduce_moments_(e2m3, nk_e2m3_t, nk_f32_t, nk_f32_t)
595
+ nk_dispatch_reduce_moments_(i64, nk_i64_t, nk_i64_t, nk_u64_t)
596
+ nk_dispatch_reduce_moments_(i32, nk_i32_t, nk_i64_t, nk_u64_t)
597
+ nk_dispatch_reduce_moments_(i16, nk_i16_t, nk_i64_t, nk_u64_t)
598
+ nk_dispatch_reduce_moments_(i8, nk_i8_t, nk_i64_t, nk_u64_t)
599
+ nk_dispatch_reduce_moments_(i4, nk_i4x2_t, nk_i64_t, nk_u64_t)
600
+ nk_dispatch_reduce_moments_(u64, nk_u64_t, nk_u64_t, nk_u64_t)
601
+ nk_dispatch_reduce_moments_(u32, nk_u32_t, nk_u64_t, nk_u64_t)
602
+ nk_dispatch_reduce_moments_(u16, nk_u16_t, nk_u64_t, nk_u64_t)
603
+ nk_dispatch_reduce_moments_(u8, nk_u8_t, nk_u64_t, nk_u64_t)
604
+ nk_dispatch_reduce_moments_(u4, nk_u4x2_t, nk_u64_t, nk_u64_t)
605
+ nk_dispatch_reduce_moments_(u1, nk_u1x8_t, nk_u64_t, nk_u64_t)
606
+
607
+ // Horizontal reductions: minmax (min + max with indices)
608
+ nk_dispatch_reduce_minmax_(f64, nk_f64_t, nk_f64_t)
609
+ nk_dispatch_reduce_minmax_(f32, nk_f32_t, nk_f32_t)
610
+ nk_dispatch_reduce_minmax_(bf16, nk_bf16_t, nk_bf16_t)
611
+ nk_dispatch_reduce_minmax_(f16, nk_f16_t, nk_f16_t)
612
+ nk_dispatch_reduce_minmax_(e5m2, nk_e5m2_t, nk_e5m2_t)
613
+ nk_dispatch_reduce_minmax_(e4m3, nk_e4m3_t, nk_e4m3_t)
614
+ nk_dispatch_reduce_minmax_(e3m2, nk_e3m2_t, nk_e3m2_t)
615
+ nk_dispatch_reduce_minmax_(e2m3, nk_e2m3_t, nk_e2m3_t)
616
+ nk_dispatch_reduce_minmax_(i64, nk_i64_t, nk_i64_t)
617
+ nk_dispatch_reduce_minmax_(i32, nk_i32_t, nk_i32_t)
618
+ nk_dispatch_reduce_minmax_(i16, nk_i16_t, nk_i16_t)
619
+ nk_dispatch_reduce_minmax_(i8, nk_i8_t, nk_i8_t)
620
+ nk_dispatch_reduce_minmax_(i4, nk_i4x2_t, nk_i8_t)
621
+ nk_dispatch_reduce_minmax_(u64, nk_u64_t, nk_u64_t)
622
+ nk_dispatch_reduce_minmax_(u32, nk_u32_t, nk_u32_t)
623
+ nk_dispatch_reduce_minmax_(u16, nk_u16_t, nk_u16_t)
624
+ nk_dispatch_reduce_minmax_(u8, nk_u8_t, nk_u8_t)
625
+ nk_dispatch_reduce_minmax_(u4, nk_u4x2_t, nk_u8_t)
626
+ nk_dispatch_reduce_minmax_(u1, nk_u1x8_t, nk_u8_t)
627
+
628
+ // Dots packed sizes
629
+ nk_dispatch_cross_packed_size_(dots, f64, f64, f64)
630
+ nk_dispatch_cross_packed_size_(dots, f32, f32, f32)
631
+ nk_dispatch_cross_packed_size_(dots, bf16, bf16, f32)
632
+ nk_dispatch_cross_packed_size_(dots, f16, f16, f32)
633
+ nk_dispatch_cross_packed_size_(dots, e5m2, e5m2, f32)
634
+ nk_dispatch_cross_packed_size_(dots, e4m3, e4m3, f32)
635
+ nk_dispatch_cross_packed_size_(dots, e3m2, e3m2, f32)
636
+ nk_dispatch_cross_packed_size_(dots, e2m3, e2m3, f32)
637
+ nk_dispatch_cross_packed_size_(dots, i8, i8, i32)
638
+ nk_dispatch_cross_packed_size_(dots, i4, i4x2, i32)
639
+ nk_dispatch_cross_packed_size_(dots, u8, u8, u32)
640
+ nk_dispatch_cross_packed_size_(dots, u4, u4x2, u32)
641
+ nk_dispatch_cross_packed_size_(dots, u1, u1x8, u32)
642
+
643
+ // Dots packing
644
+ nk_dispatch_cross_pack_(dots, f64, f64, f64)
645
+ nk_dispatch_cross_pack_(dots, f32, f32, f32)
646
+ nk_dispatch_cross_pack_(dots, bf16, bf16, f32)
647
+ nk_dispatch_cross_pack_(dots, f16, f16, f32)
648
+ nk_dispatch_cross_pack_(dots, e5m2, e5m2, f32)
649
+ nk_dispatch_cross_pack_(dots, e4m3, e4m3, f32)
650
+ nk_dispatch_cross_pack_(dots, e3m2, e3m2, f32)
651
+ nk_dispatch_cross_pack_(dots, e2m3, e2m3, f32)
652
+ nk_dispatch_cross_pack_(dots, i8, i8, i32)
653
+ nk_dispatch_cross_pack_(dots, i4, i4x2, i32)
654
+ nk_dispatch_cross_pack_(dots, u8, u8, u32)
655
+ nk_dispatch_cross_pack_(dots, u4, u4x2, u32)
656
+ nk_dispatch_cross_pack_(dots, u1, u1x8, u32)
657
+
658
+ // Dots packed
659
+ nk_dispatch_cross_packed_(dots, f64, f64, f64, f64)
660
+ nk_dispatch_cross_packed_(dots, f32, f32, f32, f64)
661
+ nk_dispatch_cross_packed_(dots, bf16, bf16, f32, f32)
662
+ nk_dispatch_cross_packed_(dots, f16, f16, f32, f32)
663
+ nk_dispatch_cross_packed_(dots, e5m2, e5m2, f32, f32)
664
+ nk_dispatch_cross_packed_(dots, e4m3, e4m3, f32, f32)
665
+ nk_dispatch_cross_packed_(dots, e3m2, e3m2, f32, f32)
666
+ nk_dispatch_cross_packed_(dots, e2m3, e2m3, f32, f32)
667
+ nk_dispatch_cross_packed_(dots, i8, i8, i32, i32)
668
+ nk_dispatch_cross_packed_(dots, i4, i4x2, i32, i32)
669
+ nk_dispatch_cross_packed_(dots, u8, u8, u32, u32)
670
+ nk_dispatch_cross_packed_(dots, u4, u4x2, u32, u32)
671
+ nk_dispatch_cross_packed_(dots, u1, u1x8, u32, u32)
672
+
673
+ // Dots symmetric
674
+ nk_dispatch_cross_symmetric_(dots, f64, f64, f64)
675
+ nk_dispatch_cross_symmetric_(dots, f32, f32, f64)
676
+ nk_dispatch_cross_symmetric_(dots, bf16, bf16, f32)
677
+ nk_dispatch_cross_symmetric_(dots, f16, f16, f32)
678
+ nk_dispatch_cross_symmetric_(dots, e5m2, e5m2, f32)
679
+ nk_dispatch_cross_symmetric_(dots, e4m3, e4m3, f32)
680
+ nk_dispatch_cross_symmetric_(dots, e3m2, e3m2, f32)
681
+ nk_dispatch_cross_symmetric_(dots, e2m3, e2m3, f32)
682
+ nk_dispatch_cross_symmetric_(dots, i8, i8, i32)
683
+ nk_dispatch_cross_symmetric_(dots, i4, i4x2, i32)
684
+ nk_dispatch_cross_symmetric_(dots, u8, u8, u32)
685
+ nk_dispatch_cross_symmetric_(dots, u4, u4x2, u32)
686
+ nk_dispatch_cross_symmetric_(dots, u1, u1x8, u32)
687
+
688
+ // Sets packed
689
+ nk_dispatch_cross_packed_(hammings, u1, u1x8, u32, u32)
690
+ nk_dispatch_cross_packed_(jaccards, u1, u1x8, f32, f32)
691
+
692
+ // Sets symmetric
693
+ nk_dispatch_cross_symmetric_(hammings, u1, u1x8, u32)
694
+ nk_dispatch_cross_symmetric_(jaccards, u1, u1x8, f32)
695
+
696
+ // Angulars packed
697
+ nk_dispatch_cross_packed_(angulars, f64, f64, f64, f64)
698
+ nk_dispatch_cross_packed_(angulars, f32, f32, f32, f64)
699
+ nk_dispatch_cross_packed_(angulars, bf16, bf16, f32, f32)
700
+ nk_dispatch_cross_packed_(angulars, f16, f16, f32, f32)
701
+ nk_dispatch_cross_packed_(angulars, e5m2, e5m2, f32, f32)
702
+ nk_dispatch_cross_packed_(angulars, e4m3, e4m3, f32, f32)
703
+ nk_dispatch_cross_packed_(angulars, e3m2, e3m2, f32, f32)
704
+ nk_dispatch_cross_packed_(angulars, e2m3, e2m3, f32, f32)
705
+ nk_dispatch_cross_packed_(angulars, i8, i8, i32, f32)
706
+ nk_dispatch_cross_packed_(angulars, i4, i4x2, i32, f32)
707
+ nk_dispatch_cross_packed_(angulars, u8, u8, u32, f32)
708
+ nk_dispatch_cross_packed_(angulars, u4, u4x2, u32, f32)
709
+
710
+ // Angulars symmetric
711
+ nk_dispatch_cross_symmetric_(angulars, f64, f64, f64)
712
+ nk_dispatch_cross_symmetric_(angulars, f32, f32, f64)
713
+ nk_dispatch_cross_symmetric_(angulars, bf16, bf16, f32)
714
+ nk_dispatch_cross_symmetric_(angulars, f16, f16, f32)
715
+ nk_dispatch_cross_symmetric_(angulars, e5m2, e5m2, f32)
716
+ nk_dispatch_cross_symmetric_(angulars, e4m3, e4m3, f32)
717
+ nk_dispatch_cross_symmetric_(angulars, e3m2, e3m2, f32)
718
+ nk_dispatch_cross_symmetric_(angulars, e2m3, e2m3, f32)
719
+ nk_dispatch_cross_symmetric_(angulars, i8, i8, f32)
720
+ nk_dispatch_cross_symmetric_(angulars, i4, i4x2, f32)
721
+ nk_dispatch_cross_symmetric_(angulars, u8, u8, f32)
722
+ nk_dispatch_cross_symmetric_(angulars, u4, u4x2, f32)
723
+
724
+ // Euclideans packed
725
+ nk_dispatch_cross_packed_(euclideans, f64, f64, f64, f64)
726
+ nk_dispatch_cross_packed_(euclideans, f32, f32, f32, f64)
727
+ nk_dispatch_cross_packed_(euclideans, bf16, bf16, f32, f32)
728
+ nk_dispatch_cross_packed_(euclideans, f16, f16, f32, f32)
729
+ nk_dispatch_cross_packed_(euclideans, e5m2, e5m2, f32, f32)
730
+ nk_dispatch_cross_packed_(euclideans, e4m3, e4m3, f32, f32)
731
+ nk_dispatch_cross_packed_(euclideans, e3m2, e3m2, f32, f32)
732
+ nk_dispatch_cross_packed_(euclideans, e2m3, e2m3, f32, f32)
733
+ nk_dispatch_cross_packed_(euclideans, i8, i8, i32, f32)
734
+ nk_dispatch_cross_packed_(euclideans, i4, i4x2, i32, f32)
735
+ nk_dispatch_cross_packed_(euclideans, u8, u8, u32, f32)
736
+ nk_dispatch_cross_packed_(euclideans, u4, u4x2, u32, f32)
737
+
738
+ // Euclideans symmetric
739
+ nk_dispatch_cross_symmetric_(euclideans, f64, f64, f64)
740
+ nk_dispatch_cross_symmetric_(euclideans, f32, f32, f64)
741
+ nk_dispatch_cross_symmetric_(euclideans, bf16, bf16, f32)
742
+ nk_dispatch_cross_symmetric_(euclideans, f16, f16, f32)
743
+ nk_dispatch_cross_symmetric_(euclideans, e5m2, e5m2, f32)
744
+ nk_dispatch_cross_symmetric_(euclideans, e4m3, e4m3, f32)
745
+ nk_dispatch_cross_symmetric_(euclideans, e3m2, e3m2, f32)
746
+ nk_dispatch_cross_symmetric_(euclideans, e2m3, e2m3, f32)
747
+ nk_dispatch_cross_symmetric_(euclideans, i8, i8, f32)
748
+ nk_dispatch_cross_symmetric_(euclideans, i4, i4x2, f32)
749
+ nk_dispatch_cross_symmetric_(euclideans, u8, u8, f32)
750
+ nk_dispatch_cross_symmetric_(euclideans, u4, u4x2, f32)
751
+
752
+ // MaxSim packed sizes
753
+ nk_dispatch_cross_packed_size_(maxsim, f32, f32, f32)
754
+ nk_dispatch_cross_packed_size_(maxsim, bf16, bf16, f32)
755
+ nk_dispatch_cross_packed_size_(maxsim, f16, f16, f32)
756
+
757
+ // MaxSim packing
758
+ nk_dispatch_cross_pack_(maxsim, f32, f32, f32)
759
+ nk_dispatch_cross_pack_(maxsim, bf16, bf16, f32)
760
+ nk_dispatch_cross_pack_(maxsim, f16, f16, f32)
761
+
762
+ // MaxSim packed scoring
763
+ nk_dispatch_maxsim_packed_(f32, f64)
764
+ nk_dispatch_maxsim_packed_(bf16, f32)
765
+ nk_dispatch_maxsim_packed_(f16, f32)
766
+
767
+ NK_DYNAMIC int nk_uses_dynamic_dispatch(void) { return 1; }
768
+ NK_DYNAMIC int nk_configure_thread(nk_capability_t c) { return nk_configure_thread_(c); }
769
+
770
+ NK_DYNAMIC void nk_cast(void const *from, nk_dtype_t from_type, nk_size_t n, void *to, nk_dtype_t to_type) {
771
+ nk_dispatch_table.cast(from, from_type, n, to, to_type);
772
+ }
773
+
774
+ // Forward declarations for dtype-specific dispatch initialization functions
775
+ void nk_dispatch_f64c_init_(nk_capability_t caps);
776
+ void nk_dispatch_f32c_init_(nk_capability_t caps);
777
+ void nk_dispatch_bf16c_init_(nk_capability_t caps);
778
+ void nk_dispatch_f16c_init_(nk_capability_t caps);
779
+ void nk_dispatch_f64_init_(nk_capability_t caps);
780
+ void nk_dispatch_f32_init_(nk_capability_t caps);
781
+ void nk_dispatch_bf16_init_(nk_capability_t caps);
782
+ void nk_dispatch_f16_init_(nk_capability_t caps);
783
+ void nk_dispatch_e5m2_init_(nk_capability_t caps);
784
+ void nk_dispatch_e4m3_init_(nk_capability_t caps);
785
+ void nk_dispatch_e3m2_init_(nk_capability_t caps);
786
+ void nk_dispatch_e2m3_init_(nk_capability_t caps);
787
+ void nk_dispatch_i64_init_(nk_capability_t caps);
788
+ void nk_dispatch_i32_init_(nk_capability_t caps);
789
+ void nk_dispatch_i16_init_(nk_capability_t caps);
790
+ void nk_dispatch_i8_init_(nk_capability_t caps);
791
+ void nk_dispatch_i4_init_(nk_capability_t caps);
792
+ void nk_dispatch_u64_init_(nk_capability_t caps);
793
+ void nk_dispatch_u32_init_(nk_capability_t caps);
794
+ void nk_dispatch_u16_init_(nk_capability_t caps);
795
+ void nk_dispatch_u8_init_(nk_capability_t caps);
796
+ void nk_dispatch_u4_init_(nk_capability_t caps);
797
+ void nk_dispatch_u1_init_(nk_capability_t caps);
798
+ void nk_dispatch_cast_init_(nk_capability_t caps);
799
+ void nk_dispatch_math_init_(nk_capability_t caps);
800
+
801
+ NK_INTERNAL void nk_dispatch_table_update_implementation_(nk_capability_t caps) {
802
+ nk_dispatch_f64c_init_(caps);
803
+ nk_dispatch_f32c_init_(caps);
804
+ nk_dispatch_bf16c_init_(caps);
805
+ nk_dispatch_f16c_init_(caps);
806
+ nk_dispatch_f64_init_(caps);
807
+ nk_dispatch_f32_init_(caps);
808
+ nk_dispatch_bf16_init_(caps);
809
+ nk_dispatch_f16_init_(caps);
810
+ nk_dispatch_e5m2_init_(caps);
811
+ nk_dispatch_e4m3_init_(caps);
812
+ nk_dispatch_e3m2_init_(caps);
813
+ nk_dispatch_e2m3_init_(caps);
814
+ nk_dispatch_i64_init_(caps);
815
+ nk_dispatch_i32_init_(caps);
816
+ nk_dispatch_i16_init_(caps);
817
+ nk_dispatch_i8_init_(caps);
818
+ nk_dispatch_i4_init_(caps);
819
+ nk_dispatch_u64_init_(caps);
820
+ nk_dispatch_u32_init_(caps);
821
+ nk_dispatch_u16_init_(caps);
822
+ nk_dispatch_u8_init_(caps);
823
+ nk_dispatch_u4_init_(caps);
824
+ nk_dispatch_u1_init_(caps);
825
+ nk_dispatch_cast_init_(caps);
826
+ nk_dispatch_math_init_(caps);
827
+ }
828
+
829
+ NK_INTERNAL void nk_dispatch_table_init(void) { nk_dispatch_table_update_implementation_(nk_capabilities()); }
830
+
831
+ NK_DYNAMIC void nk_dispatch_table_update(nk_capability_t caps) { nk_dispatch_table_update_implementation_(caps); }
832
+ NK_DYNAMIC nk_capability_t nk_capabilities(void) {
833
+ //! The latency of the CPUID instruction can be over 100 cycles, so we cache the result.
834
+ static nk_capability_t static_capabilities = nk_cap_any_k;
835
+ if (static_capabilities != nk_cap_any_k) return static_capabilities;
836
+
837
+ static_capabilities = nk_capabilities_();
838
+
839
+ // Initialize the central dispatch table with the detected capabilities
840
+ nk_dispatch_table_init();
841
+
842
+ return static_capabilities;
843
+ }
844
+
845
+ NK_DYNAMIC nk_capability_t nk_capabilities_available(void) { return nk_capabilities() & nk_capabilities_compiled_(); }
846
+ NK_DYNAMIC nk_capability_t nk_capabilities_compiled(void) { return nk_capabilities_compiled_(); }
847
+
848
+ NK_DYNAMIC void nk_find_kernel_punned( //
849
+ nk_kernel_kind_t kind, //
850
+ nk_dtype_t dtype, //
851
+ nk_capability_t viable, //
852
+ nk_kernel_punned_t *kernel_output, //
853
+ nk_capability_t *capability_output) {
854
+
855
+ // Modern compilers abso-freaking-lutely love optimizing-out my logic!
856
+ // Just marking the variables as `volatile` is not enough, so we have
857
+ // to add inline assembly to further discourage them!
858
+ #if defined(_MSC_VER)
859
+ _ReadWriteBarrier();
860
+ #else
861
+ __asm__ __volatile__("" ::: "memory");
862
+ #endif
863
+
864
+ nk_kernel_punned_t *m = kernel_output;
865
+ nk_capability_t *c = capability_output;
866
+
867
+ switch (dtype) {
868
+
869
+ case nk_f64c_k: nk_dispatch_f64c_find_(viable, kind, m, c); return;
870
+ case nk_f32c_k: nk_dispatch_f32c_find_(viable, kind, m, c); return;
871
+ case nk_bf16c_k: nk_dispatch_bf16c_find_(viable, kind, m, c); return;
872
+ case nk_f16c_k: nk_dispatch_f16c_find_(viable, kind, m, c); return;
873
+
874
+ case nk_f64_k: nk_dispatch_f64_find_(viable, kind, m, c); return;
875
+ case nk_f32_k: nk_dispatch_f32_find_(viable, kind, m, c); return;
876
+ case nk_bf16_k: nk_dispatch_bf16_find_(viable, kind, m, c); return;
877
+ case nk_f16_k: nk_dispatch_f16_find_(viable, kind, m, c); return;
878
+
879
+ case nk_e5m2_k: nk_dispatch_e5m2_find_(viable, kind, m, c); return;
880
+ case nk_e4m3_k: nk_dispatch_e4m3_find_(viable, kind, m, c); return;
881
+ case nk_e3m2_k: nk_dispatch_e3m2_find_(viable, kind, m, c); return;
882
+ case nk_e2m3_k: nk_dispatch_e2m3_find_(viable, kind, m, c); return;
883
+
884
+ case nk_i64_k: nk_dispatch_i64_find_(viable, kind, m, c); return;
885
+ case nk_i32_k: nk_dispatch_i32_find_(viable, kind, m, c); return;
886
+ case nk_i16_k: nk_dispatch_i16_find_(viable, kind, m, c); return;
887
+ case nk_i8_k: nk_dispatch_i8_find_(viable, kind, m, c); return;
888
+ case nk_i4_k: nk_dispatch_i4_find_(viable, kind, m, c); return;
889
+
890
+ case nk_u64_k: nk_dispatch_u64_find_(viable, kind, m, c); return;
891
+ case nk_u32_k: nk_dispatch_u32_find_(viable, kind, m, c); return;
892
+ case nk_u16_k: nk_dispatch_u16_find_(viable, kind, m, c); return;
893
+ case nk_u8_k: nk_dispatch_u8_find_(viable, kind, m, c); return;
894
+ case nk_u4_k: nk_dispatch_u4_find_(viable, kind, m, c); return;
895
+ case nk_u1_k: nk_dispatch_u1_find_(viable, kind, m, c); return;
896
+
897
+ case nk_dtype_unknown_k: nk_dispatch_cast_find_(viable, kind, m, c); return;
898
+ default: break;
899
+ }
900
+
901
+ // Replace with zeros if no suitable implementation was found
902
+ *m = (nk_kernel_punned_t)0;
903
+ *c = (nk_capability_t)0;
904
+
905
+ // Modern compilers abso-freaking-lutely love optimizing-out my logic!
906
+ // Just marking the variables as `volatile` is not enough, so we have
907
+ // to add inline assembly to further discourage them!
908
+ #if defined(_MSC_VER)
909
+ _ReadWriteBarrier();
910
+ #else
911
+ __asm__ __volatile__("" ::: "memory");
912
+ #endif
913
+ }
914
+
915
+ // Auto-initialization for dynamic libraries - ensures dispatch table is populated on library load
916
+ #if defined(__GNUC__) || defined(__clang__)
917
+ __attribute__((constructor)) static void nk_auto_init(void) {
918
+ nk_capabilities(); // Triggers dispatch table initialization
919
+ }
920
+ #elif defined(_MSC_VER)
921
+ static void nk_auto_init(void);
922
+ #pragma section(".CRT$XCU", read)
923
+ __declspec(allocate(".CRT$XCU")) static void (*nk_auto_init_ptr)(void) = nk_auto_init;
924
+ static void nk_auto_init(void) {
925
+ nk_capabilities(); // Triggers dispatch table initialization
926
+ }
927
+ #ifdef _WIN32
928
+ #include <windows.h>
929
+ BOOL WINAPI DllMain(HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpReserved) {
930
+ nk_unused_(hinstDLL);
931
+ nk_unused_(lpReserved);
932
+ if (fdwReason == DLL_PROCESS_ATTACH) nk_auto_init();
933
+ return TRUE;
934
+ }
935
+ #endif
936
+ #endif
937
+
938
+ #ifdef __cplusplus
939
+ }
940
+ #endif