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