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,500 @@
1
+ # Contributing
2
+
3
+ To keep the quality of the code high, we follow the [coding style and conventions](https://github.com/ashvardanian/ashvardanian/blob/master/CONTRIBUTING.md) shared across multiple projects — covering Git history, C++ and Python formatting, dependency management, and documentation.
4
+
5
+ ## Directory Tree
6
+
7
+ ```
8
+ include/numkong/ C and C++ headers — one .h per kernel family, one .hpp per C++ API
9
+ include/numkong/*/ Per-ISA kernel implementations — serial, haswell, neon, rvv, sme, etc.
10
+ c/ Runtime dispatch layer — one dispatch_*.c per dtype
11
+ test/ C++ precision tests — see test/README.md
12
+ bench/ C++ Google Benchmark suite and JS bench runner — see bench/README.md
13
+ python/ CPython extension, no SWIG or PyBind11
14
+ javascript/ Node.js native addon + Emscripten WASM + TypeScript API
15
+ rust/ Rust FFI bindings
16
+ swift/ Swift Package Manager bindings
17
+ golang/ Go cgo bindings
18
+ cmake/ Toolchain files for cross-compilation — WASM, WASI, RISC-V, AArch64
19
+ ```
20
+
21
+ ## C and C++
22
+
23
+ ### Building
24
+
25
+ ```sh
26
+ cmake -B build_release -D CMAKE_BUILD_TYPE=Release \
27
+ -D NK_BUILD_TEST=1 \
28
+ -D NK_BUILD_BENCH=1 \
29
+ -D NK_COMPARE_TO_BLAS=1
30
+ cmake --build build_release --config Release --parallel
31
+ build_release/nk_bench
32
+ build_release/nk_test
33
+ ```
34
+
35
+ | CMake Flag | Default | Description |
36
+ | -------------------------- | ------------------ | ------------------------------------------------------ |
37
+ | `NK_BUILD_TEST` | `OFF` | Compile precision tests with ULP error analysis |
38
+ | `NK_BUILD_BENCH` | `OFF` | Compile micro-benchmarks |
39
+ | `NK_BUILD_SHARED` | `ON`, if top-level | Compile dynamic library |
40
+ | `NK_BUILD_SHARED_TEST` | `OFF` | Compile tests against the shared library |
41
+ | `NK_COMPARE_TO_BLAS` | `AUTO` | Include OpenBLAS into test/bench comparisons |
42
+ | `NK_COMPARE_TO_ACCELERATE` | `AUTO` | Include Apple's Accelerate into test/bench comparisons |
43
+ | `NK_COMPARE_TO_MKL` | `AUTO` | Include Intel' MKL into test/bench comparisons |
44
+ | `NK_MARCH_NATIVE` | `OFF` | Tune for host CPU with `-march=native` |
45
+
46
+ ### Target Baseline Policy
47
+
48
+ `CMakeLists.txt`, `build.rs`, `setup.py`, and `binding.gyp` pin the TU-level baseline to each architecture's ABI floor so distributable artifacts run on any CPU matching the ABI, not just the build host.
49
+ SIMD kernels live inside `#pragma GCC target(...)` regions and are only called after runtime probing — see the README's [Compile-Time and Run-Time Dispatch](../README.md#compile-time-and-run-time-dispatch) section.
50
+
51
+ | Target arch | GCC/Clang baseline | MSVC baseline | Notes |
52
+ | ------------- | --------------------------- | --------------- | ----------------------------------------------------------- |
53
+ | `x86_64` | `-march=x86-64` | `/arch:SSE2` | System V psABI / Microsoft x64 ABI floor; SSE2 is mandatory |
54
+ | `aarch64` | `-march=armv8-a` | `/arch:armv8.0` | ARMv8-A ABI floor; NEON is mandatory |
55
+ | `riscv64` | `-march=rv64gc` | n/a | V extension is runtime-probed and dispatched |
56
+ | `powerpc64le` | `-mcpu=power8` | n/a | ELFv2 ABI floor (VSX is mandatory) |
57
+ | `loongarch64` | `-march=loongarch64 -mlasx` | n/a | LASX baked into the baseline — see LoongArch note below |
58
+
59
+ GCC/Clang builds also pass `-fno-tree-vectorize -fno-tree-slp-vectorize` so the auto-vectorizer cannot promote serial fallbacks to baseline SIMD (NEON, SSE2, VSX, …).
60
+ That keeps the tiered dispatch design intact: "serial" kernels stay actually serial, and the per-pragma SIMD kernels — which use explicit intrinsics, not vectorized scalar code — are the sole source of SIMD emission.
61
+ MSVC has no per-function target pragma and no command-line vectorizer toggle, so the explicit `/arch:` flags above match defaults and document intent only; NumKong's MSVC strategy is compile-time gating via `_MSC_VER` version checks (see `include/numkong/types.h`).
62
+ LoongArch is the one arch that can't honor the per-function-pragma model: `__attribute__((target("lasx")))` and `#pragma GCC target("lasx")` only landed in GCC 15.1 (Feb 2025) and Clang 22.1 (May 2025), and the bundled `lasxintrin.h` gates every wrapper on the `__loongarch_asx` macro that those older toolchains only set via TU-level `-mlasx`.
63
+ Until NumKong's minimum supported toolchain catches up, LoongArch artifacts require LASX-capable hardware (LA464+, c. 2021).
64
+ `Package.swift` and `golang/numkong.go` do not pin baselines: SPM forbids `.unsafeFlags()` on remotely consumed targets, and the cgo bindings rely on the surrounding compiler default.
65
+
66
+ For host-tuned local builds, set `NK_MARCH_NATIVE=1` (env var honored by `build.rs` and `setup.py`; CMake option `-DNK_MARCH_NATIVE=ON`).
67
+ The resulting artifact bakes host-specific instructions into scaffolding code and is __not__ portable.
68
+
69
+ ### Compiler Requirements
70
+
71
+ | ISA Family | GCC | Clang | AppleClang | MSVC |
72
+ | --------------------------------------- | --- | ----- | -------------- | ----------- |
73
+ | Base — serial, NEON, AVX2 | 9+ | 10+ | Any | 2019+ |
74
+ | Float16 — NEONHalf, Sapphire FP16, Zvfh | 12+ | 16+ | Any | 2022 17.14+ |
75
+ | AVX-512 — Skylake, Ice Lake | 9+ | 10+ | N/A | 2019+ |
76
+ | AVX-512BF16 — Genoa | 12+ | 16+ | N/A | 2022 17.14+ |
77
+ | Intel AMX — Sapphire, Granite | 14+ | 18+ | N/A | 2022 17.14+ |
78
+ | Arm SME/SME2 | 14+ | 18+ | 16+ / Xcode 16 | N/A |
79
+ | RISC-V Vector — RVV 1.0 | 13+ | 17+ | N/A | N/A |
80
+ | RVV + Zvfh/Zvfbfwma/Zvbb | 14+ | 18+ | N/A | N/A |
81
+
82
+ To install on Ubuntu 22.04:
83
+
84
+ ```sh
85
+ sudo apt install gcc-12 g++-12
86
+ sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-12 100
87
+ sudo update-alternatives --install /usr/bin/g++ g++ /usr/bin/g++-12 100
88
+ ```
89
+
90
+ ### Cross-Compilation
91
+
92
+ NumKong ships 8 toolchain files in `cmake/` for cross-compiling to non-native targets.
93
+ Tests and benchmarks run transparently under QEMU via `CMAKE_CROSSCOMPILING_EMULATOR`.
94
+
95
+ | Target | Toolchain File | Emulator | Prerequisites |
96
+ | ------------------------- | ------------------------------- | ----------------------- | ------------------------------------------------------------------------------------------------ |
97
+ | ARM64 Linux | `toolchain-aarch64-gnu.cmake` | `qemu-aarch64 -cpu max` | `gcc-aarch64-linux-gnu`, `qemu-user` |
98
+ | RISC-V 64 GCC | `toolchain-riscv64-gnu.cmake` | `qemu-riscv64 -cpu max` | [riscv-gnu-toolchain](https://github.com/riscv-collab/riscv-gnu-toolchain/releases), `qemu-user` |
99
+ | RISC-V 64 LLVM | `toolchain-riscv64-llvm.cmake` | `qemu-riscv64 -cpu max` | LLVM 17+, `RISCV_SYSROOT` |
100
+ | Android ARM64 | `toolchain-android-arm64.cmake` | — | `ANDROID_NDK_ROOT` |
101
+ | x86_64 from Apple Silicon | `toolchain-x86_64-llvm.cmake` | `arch -x86_64` | Homebrew LLVM |
102
+ | WASM Emscripten | `toolchain-wasm.cmake` | Node.js | Emscripten 3.1.27+ |
103
+ | WASM64 Memory64 | `toolchain-wasm64.cmake` | Node.js | Emscripten 3.1.35+ |
104
+ | WASI | `toolchain-wasi.cmake` | Wasmtime / Wasmer | WASI SDK 24+ |
105
+
106
+ Set `NK_IN_QEMU=1` to relax half-precision accuracy thresholds under emulation.
107
+
108
+ __ARM64 Linux__
109
+
110
+ ```sh
111
+ cmake -B build_arm64 -DCMAKE_TOOLCHAIN_FILE=cmake/toolchain-aarch64-gnu.cmake
112
+ cmake --build build_arm64 --parallel
113
+ ```
114
+
115
+ To build and run tests under emulation, see [test/README.md](test/README.md#cross-compilation).
116
+
117
+ Default arch: `armv9-a+sve2+fp16+bf16+i8mm+dotprod+fp16fml`.
118
+
119
+ __RISC-V 64 with GCC__
120
+
121
+ ```sh
122
+ cmake -B build_riscv -DCMAKE_TOOLCHAIN_FILE=cmake/toolchain-riscv64-gnu.cmake
123
+ cmake --build build_riscv --parallel
124
+ ```
125
+
126
+ To build and run tests under emulation, see [test/README.md](test/README.md#cross-compilation).
127
+
128
+ Default arch: `rv64gcv_zvfh_zvfbfwma_zvbb`.
129
+
130
+ __RISC-V 64 with LLVM__
131
+
132
+ ```sh
133
+ export RISCV_SYSROOT=/path/to/riscv-sysroot
134
+ cmake -B build_riscv_llvm -DCMAKE_TOOLCHAIN_FILE=cmake/toolchain-riscv64-llvm.cmake
135
+ cmake --build build_riscv_llvm --parallel
136
+ ```
137
+
138
+ To build and run tests under emulation, see [test/README.md](test/README.md#cross-compilation).
139
+
140
+ __Android ARM64__
141
+
142
+ ```sh
143
+ cmake -B build_android -DCMAKE_TOOLCHAIN_FILE=cmake/toolchain-android-arm64.cmake
144
+ cmake --build build_android --parallel
145
+ ```
146
+
147
+ To build and run tests under emulation, see [test/README.md](test/README.md#cross-compilation).
148
+
149
+ __WASM via Emscripten__
150
+
151
+ ```sh
152
+ source ~/emsdk/emsdk_env.sh
153
+ cmake -B build-wasm -DCMAKE_TOOLCHAIN_FILE=cmake/toolchain-wasm.cmake
154
+ cmake --build build-wasm --parallel
155
+ ```
156
+
157
+ For wasm64 — Memory64:
158
+
159
+ ```sh
160
+ cmake -B build-wasm64 -DCMAKE_TOOLCHAIN_FILE=cmake/toolchain-wasm64.cmake
161
+ cmake --build build-wasm64 --parallel
162
+ ```
163
+
164
+ __WASI__
165
+
166
+ ```sh
167
+ export WASI_SDK_PATH=~/wasi-sdk-24.0-x86_64-linux
168
+ cmake -B build-wasi -DCMAKE_TOOLCHAIN_FILE=cmake/toolchain-wasi.cmake
169
+ cmake --build build-wasi --parallel
170
+ ```
171
+
172
+ __iOS Simulator via Xcode__
173
+
174
+ ```sh
175
+ xcodebuild test -scheme NumKong -destination 'platform=iOS Simulator,name=iPhone 16'
176
+ ```
177
+
178
+ __x86_64 from Apple Silicon__
179
+
180
+ ```sh
181
+ cmake -B build_x86 -DCMAKE_TOOLCHAIN_FILE=cmake/toolchain-x86_64-llvm.cmake
182
+ cmake --build build_x86 --parallel
183
+ ```
184
+
185
+ ### macOS
186
+
187
+ With Apple Clang and Homebrew OpenBLAS:
188
+
189
+ ```sh
190
+ brew install openblas
191
+ cmake -B build_release -D CMAKE_BUILD_TYPE=Release \
192
+ -D NK_BUILD_TEST=1 \
193
+ -D NK_BUILD_BENCH=1 \
194
+ -D NK_COMPARE_TO_BLAS=1 \
195
+ -D CMAKE_PREFIX_PATH="$(brew --prefix openblas)" \
196
+ -D CMAKE_CXX_STANDARD_INCLUDE_DIRECTORIES="$(brew --prefix openblas)/include"
197
+ cmake --build build_release --config Release --parallel
198
+ ```
199
+
200
+ With Homebrew Clang — recommended for full ISA support:
201
+
202
+ ```sh
203
+ brew install llvm openblas
204
+ unset DEVELOPER_DIR
205
+ cmake -B build_release -D CMAKE_BUILD_TYPE=Release \
206
+ -D NK_BUILD_TEST=1 \
207
+ -D NK_BUILD_BENCH=1 \
208
+ -D NK_COMPARE_TO_BLAS=1 \
209
+ -D CMAKE_CXX_STANDARD_INCLUDE_DIRECTORIES="$(brew --prefix openblas)/include" \
210
+ -D CMAKE_C_LINK_FLAGS="-L$(xcrun --sdk macosx --show-sdk-path)/usr/lib" \
211
+ -D CMAKE_EXE_LINKER_FLAGS="-L$(xcrun --sdk macosx --show-sdk-path)/usr/lib" \
212
+ -D CMAKE_C_COMPILER="$(brew --prefix llvm)/bin/clang" \
213
+ -D CMAKE_CXX_COMPILER="$(brew --prefix llvm)/bin/clang++" \
214
+ -D CMAKE_OSX_SYSROOT="$(xcrun --sdk macosx --show-sdk-path)" \
215
+ -D CMAKE_OSX_DEPLOYMENT_TARGET=$(sw_vers -productVersion)
216
+ cmake --build build_release --config Release --parallel
217
+ ```
218
+
219
+ ### BLAS Threading
220
+
221
+ When benchmarking with BLAS cross-validation, disable multi-threading in BLAS libraries to avoid interference — see [bench/README.md](bench/README.md#environment-variables) for the `*_NUM_THREADS` variables.
222
+
223
+ ### Debugger Breakpoints
224
+
225
+ Useful breakpoints for debugging:
226
+
227
+ - `__asan::ReportGenericError` — illegal memory accesses.
228
+ - `__GI_exit` — exit points at end of any executable.
229
+ - `__builtin_unreachable` — unexpected code paths.
230
+ - `_sz_assert_failure` — StringZilla logic assertions.
231
+
232
+ See [test/README.md](test/README.md) for test framework details and [bench/README.md](bench/README.md) for benchmark configuration.
233
+
234
+ ### Static Analysis & Formatting
235
+
236
+ Once done editing the code, please run analyzers and formatters:
237
+
238
+ ```bash
239
+ git ls-files '*.h' '*.c' '*.hpp' '*.cpp' | xargs clang-format -i # Use Clang Format 21 or newer
240
+ ```
241
+
242
+ ## Python
243
+
244
+ Python bindings are implemented using pure CPython, so you wouldn't need to install SWIG, PyBind11, or any other third-party library.
245
+ Still, you need a virtual environment.
246
+ If you already have one:
247
+
248
+ ```sh
249
+ pip install -e . # build locally from source
250
+ pip install pytest pytest-repeat pytest-randomly # testing dependencies
251
+ pip install numpy scipy ml_dtypes tabulate # optional reference libraries
252
+ pytest test/ -s -x -Wd # to run tests
253
+
254
+ # to check supported SIMD instructions:
255
+ python -c "import numkong; print(numkong.get_capabilities())"
256
+ ```
257
+
258
+ Alternatively, use `uv` to create the virtual environment.
259
+
260
+ ```sh
261
+ uv venv --python 3.13t # or your preferred version
262
+ source .venv/bin/activate # activate the environment
263
+ uv pip install -e . # build locally from source
264
+
265
+ # to run GIL-related tests in a free-threaded environment:
266
+ uv pip install pytest pytest-repeat pytest-randomly numpy scipy ml_dtypes tabulate
267
+ PYTHON_GIL=0 python -m pytest test/ -s -x -Wd -k gil
268
+ ```
269
+
270
+ Here, `-s` will output the logs.
271
+ The `-x` will stop on the first failure.
272
+ The `-Wd` will silence overflows and runtime warnings.
273
+
274
+ When building on macOS, same as with C/C++, use non-Apple Clang version:
275
+
276
+ ```sh
277
+ brew install llvm libomp
278
+ CC=$(brew --prefix llvm)/bin/clang CXX=$(brew --prefix llvm)/bin/clang++ pip install -e .
279
+ ```
280
+
281
+ Wheels pin a portable per-arch baseline by default — see [Target Baseline Policy](#target-baseline-policy).
282
+ For host-tuned local installs, set `NK_MARCH_NATIVE=1 pip install -e .` (the resulting build is not redistributable).
283
+
284
+ Before merging your changes you may want to test your changes against the entire matrix of Python versions NumKong supports.
285
+ For that you need the `cibuildwheel`, which is tricky to use on macOS and Windows, as it would target just the local environment.
286
+ Still, if you have Docker running on any desktop OS, you can use it to build and test the Python bindings for all Python versions for Linux:
287
+
288
+ ```sh
289
+ pip install cibuildwheel
290
+ cibuildwheel
291
+ cibuildwheel --platform linux # works on any OS and builds all Linux backends
292
+ cibuildwheel --platform linux --archs x86_64 # 64-bit x86, the most common on desktop and servers
293
+ cibuildwheel --platform linux --archs aarch64 # 64-bit Arm for mobile devices, Apple M-series, and AWS Graviton
294
+ cibuildwheel --platform linux --archs i686 # 32-bit Linux
295
+ cibuildwheel --platform macos # works only on macOS
296
+ cibuildwheel --platform windows # works only on Windows
297
+ ```
298
+
299
+ You may need root privileges for multi-architecture builds:
300
+
301
+ ```sh
302
+ sudo $(which cibuildwheel) --platform linux
303
+ ```
304
+
305
+ On Windows and macOS, to avoid frequent path resolution issues, you may want to use:
306
+
307
+ ```sh
308
+ python -m cibuildwheel --platform windows
309
+ ```
310
+
311
+ ### Static Analysis & Formatting
312
+
313
+ Once done editing the code, please run analyzers and formatters:
314
+
315
+ ```bash
316
+ ruff check test/ # linting
317
+ black . # format with default settings
318
+ ```
319
+
320
+ ## Rust
321
+
322
+ ```sh
323
+ cargo test -p numkong
324
+ cargo test -p numkong -- --nocapture # to see the output
325
+ NK_MARCH_NATIVE=1 cargo build --release # for host-tuned local builds
326
+ ```
327
+
328
+ The crate pins a portable per-arch baseline by default — see [Target Baseline Policy](#target-baseline-policy).
329
+
330
+ To automatically detect the Minimum Supported Rust Version — MSRV:
331
+
332
+ ```sh
333
+ cargo +stable install cargo-msrv
334
+ cargo msrv find --ignore-lockfile
335
+ ```
336
+
337
+ Please avoid the temptation of using macros in this Rust code.
338
+
339
+ ## JavaScript
340
+
341
+ See [javascript/README.md](javascript/README.md) for JavaScript/TypeScript development, WASM support, and API documentation.
342
+
343
+ Quick reference:
344
+
345
+ ```sh
346
+ npm run build-js # Build TypeScript
347
+ npm test # Run tests
348
+ npm run bench # Run benchmarks
349
+ ```
350
+
351
+ ## Swift
352
+
353
+ ```sh
354
+ swift build && swift test -v
355
+ ```
356
+
357
+ Running Swift on Linux requires a couple of extra steps, as the Swift compiler is not available in the default repositories.
358
+ Please get the most recent Swift tarball from the [official website](https://www.swift.org/install/).
359
+ At the time of writing, for 64-bit Arm CPU running Ubuntu 22.04, the following commands would work:
360
+
361
+ ```bash
362
+ wget https://download.swift.org/swift-5.9.2-release/ubuntu2204-aarch64/swift-5.9.2-RELEASE/swift-5.9.2-RELEASE-ubuntu22.04-aarch64.tar.gz
363
+ tar xzf swift-5.9.2-RELEASE-ubuntu22.04-aarch64.tar.gz
364
+ sudo mv swift-5.9.2-RELEASE-ubuntu22.04-aarch64 /usr/share/swift
365
+ echo "export PATH=/usr/share/swift/usr/bin:$PATH" >> ~/.bashrc
366
+ source ~/.bashrc
367
+ ```
368
+
369
+ You can check the available images on [`swift.org/download` page](https://www.swift.org/download/#releases).
370
+ For x86 CPUs, the following commands would work:
371
+
372
+ ```bash
373
+ wget https://download.swift.org/swift-5.9.2-release/ubuntu2204/swift-5.9.2-RELEASE/swift-5.9.2-RELEASE-ubuntu22.04.tar.gz
374
+ tar xzf swift-5.9.2-RELEASE-ubuntu22.04.tar.gz
375
+ sudo mv swift-5.9.2-RELEASE-ubuntu22.04 /usr/share/swift
376
+ echo "export PATH=/usr/share/swift/usr/bin:$PATH" >> ~/.bashrc
377
+ source ~/.bashrc
378
+ ```
379
+
380
+ Alternatively, on Linux, the official Swift Docker image can be used for builds and tests:
381
+
382
+ ```bash
383
+ sudo docker run --rm -v "$PWD:/workspace" -w /workspace swift:5.9 /bin/bash -cl "swift build -c release --static-swift-stdlib && swift test -c release --enable-test-discovery"
384
+ ```
385
+
386
+ ## GoLang
387
+
388
+ ```sh
389
+ cd golang
390
+ go test # To test
391
+ go test -run=^$ -bench=. -benchmem # To benchmark
392
+ ```
393
+
394
+ ## Adding a New Kernel Family
395
+
396
+ To add a new operation family, for example `foo`:
397
+
398
+ 1. __C header__: create `include/numkong/foo.h` with serial implementation and dispatch function signatures.
399
+ 2. __ISA implementations__: add `include/numkong/foo/serial.h`, `foo/neon.h`, `foo/haswell.h`, etc.
400
+ 3. __Dispatch layer__: add entries to the appropriate `c/dispatch_*.c` files for each dtype the kernel supports.
401
+ 4. __C++ wrapper__: create `include/numkong/foo.hpp` with the typed C++ API.
402
+ 5. __Test__: create `test/test_foo.cpp` with precision validation against `f118_t` references.
403
+ 6. __Benchmark__: create `bench/bench_foo.cpp` with Google Benchmark harness.
404
+ 7. __Cross-platform tests__: add entries to `test/test_cross.hpp` and the relevant `test_cross_*.cpp` files.
405
+ 8. __CMakeLists.txt__: wire the new source files into the `nk_test` and `nk_bench` targets.
406
+ 9. __Language bindings__: update `python/numkong.c`, `javascript/numkong.c`, `rust/numkong.rs`, etc. as needed.
407
+
408
+ ## Adding a Backend Kernel to an Existing Family
409
+
410
+ For primary kernels, every backend implementation should be wired in five places beyond the backend header itself:
411
+
412
+ 1. __Forward declaration__: add the `NK_PUBLIC` declaration with the matching `@copydoc` in the first half of `include/numkong/<family>.h`.
413
+ 2. __Compile-time dispatch__: add the `#if !NK_DYNAMIC_DISPATCH` branch in the second half of `include/numkong/<family>.h`.
414
+ 3. __Run-time dispatch__: add the dtype-specific entry to the relevant `c/dispatch_*.c` table.
415
+ 4. __Precision tests__: register the kernel in `nk_test`, usually in the existing `test/test_<family>.cpp` suite.
416
+ 5. __Benchmarks__: register the kernel in `nk_bench`, usually in the existing `bench/bench_<family>.cpp` suite.
417
+
418
+ Use the existing family suite unless the kernel introduces a genuinely new test shape.
419
+ The rule is about coverage and reachability, not about creating a brand new source file for every symbol.
420
+
421
+ There are two intentional exceptions:
422
+
423
+ - `cast`: the family-level `nk_cast_*` kernels follow the same header/dispatch/test/bench rule, but scalar conversion helpers are wired through `c/dispatch_other.c` and are covered through `test/test_cast.cpp` and `bench/bench_cast.cpp`.
424
+ - `scalar`: scalar helpers are centrally declared in `include/numkong/scalar.h`, wired through `c/dispatch_other.c`, and currently do not follow the per-helper `nk_test` and `nk_bench` registration pattern.
425
+
426
+ ## Wording & Styling
427
+
428
+ A lot of effort goes into keeping the wording and styling of the code consistent.
429
+ Variable names must reflect the __semantic operation__, not just the intrinsic name.
430
+
431
+ ### Variable Names & Type Suffixes
432
+
433
+ Reading mixed-precision kernels can be very confusing when different wide registers encode numbers differently.
434
+ So most of the kernel code encodes the inner register representation into the symbol name:
435
+
436
+ - Fixed-width ISAs (NEON, x86, WASM) use `<name>_<dtype>x<count>` variable naming convention — e.g. `sum_f32x4`, `a_f64x2`, `query_f64x8`.
437
+ - SVE uses `<name>_<dtype>x` with no count, since VL is runtime — e.g. `a_f32x`, `accumulator_f64x`.
438
+ - RVV uses `<name>_<dtype>m<lmul>` for the LMUL register-group multiplier — e.g. `a_f32m1`, `sum_f64m2`.
439
+
440
+ For the `<name>` part, prefer full words over abbreviations: `accumulator` instead of `acc`, `sum` instead of `s`, `low` & `high` instead of `lo` & `hi`.
441
+ Regardless of the intrinsic name used to produce a value, the variable name should reflect its relation to surrounding code.
442
+
443
+ > A good example is naming upcasted register halves.
444
+ > With `svunpklo` & `svunpkhi` in SVE, `vget_low` & `vget_high` in NEON, or `_mm256_extractf128` in x86, the values are contiguous halves of the register — so we call them `low` and `high`:
445
+ >
446
+ > ```c
447
+ > svfloat32_t values_low_f32x = svreinterpret_f32_u32(svlsl_n_u32_x(p, svunpklo_u32(raw), 16));
448
+ > svfloat32_t values_high_f32x = svreinterpret_f32_u32(svlsl_n_u32_x(p, svunpkhi_u32(raw), 16));
449
+ > ```
450
+ >
451
+ > But `svcvt` & `svcvtlt` in SVE select interleaved even/odd elements, not contiguous halves.
452
+ > Using `low` & `high` here would mislead reviewers into assuming a different control flow.
453
+ > So we compensate the non-expressive intrinsic name with a more accurate variable name:
454
+ >
455
+ > ```c
456
+ > svfloat32_t values_even_f32x = svcvt_f32_f16_x(pred_even_b32x, values_f16x); // elements 0,2,4,...
457
+ > svfloat32_t values_odd_f32x = svcvtlt_f32_f16_x(pred_odd_b32x, values_f16x); // elements 1,3,5,...
458
+ > ```
459
+ >
460
+ > Similarly, in AMX tile-based GEMMs, the A matrix is split into a top half and a bottom half, while B tiles cover left and right halfs.
461
+ > Using `high` & `low` would suggest register halves; `top` & `bottom` reflects the spatial role in the matrix multiplication:
462
+ >
463
+ > ```c
464
+ > _tile_loadd(0, a_tile_top, a_stride_bytes); // A top rows
465
+ > _tile_loadd(1, a_tile_bottom, a_stride_bytes); // A bottom rows
466
+ > _tile_loadd(2, b_tile_left, 64); // B left columns
467
+ > _tile_loadd(3, b_tile_right, 64); // B right columns
468
+ > ```
469
+
470
+ For the `<dtype>` part, values like `u8`, `bf16`, `f64c`, `i4`, and `e3m2` are used — except where the type doesn't matter, such as predicate masks, loads, and stores.
471
+ Those use `b32` or `b8`, reflecting the number of bits in each mask element.
472
+
473
+ ---
474
+
475
+ For scalar variables, similar preferences for cleaner and longer variable names apply:
476
+
477
+ - Loop variables use `i` for simple loops; `row_tile_index`, `column_tile_index`, `depth_step` for nested tile loops.
478
+ - Matrix / GEMM dimensions use `rows`, `columns`, `depth` — never single-letter `m`, `n`, `k`.
479
+ - Tile terminology is descriptive: `tile_dimension`, `row_in_tile`, `column_within_tile`.
480
+ - Element counts are explicit about what's counted: `count_scalars`, `count_pairs`.
481
+ - Strides explicitly mention the units: `a_stride_in_bytes`, `a_stride_elements = a_stride_in_bytes / sizeof(nk_f16_t)`.
482
+
483
+ ### Intrinsic Style
484
+
485
+ Prefer explicit named intrinsics over implicit syntax or manual bit manipulation.
486
+ Power VSX uses `vec_xl()`, `vec_xst()` — never implicit Altivec vector operators.
487
+ x86 AVX-512 uses `_mm512_mask_*` K-mask intrinsics — never manual bitwise ops on `__mmask16`.
488
+ When hardware has no intrinsic, wrap raw assembly in an `NK_INTERNAL` helper and document the instruction mnemonic:
489
+
490
+ ```c
491
+ NK_INTERNAL void nk_sme_start_streaming_(void) {
492
+ __asm__ __volatile__("smstart sm" ::: "memory");
493
+ }
494
+ ```
495
+
496
+ ### Function Naming
497
+
498
+ Public API: `nk_<operation>_<dtype>_<isa>` — e.g. `nk_dot_f32_sve`, `nk_angular_f16_sme`.
499
+ Internal helpers use a trailing underscore: `nk_reduce_add_f32x16_skylake_`.
500
+ Conversions: `nk_<src>x<count>_to_<dst>x<count>_<isa>_` — e.g. `nk_e4m3x8_to_f32x8_haswell_`.
@@ -0,0 +1,54 @@
1
+ [package]
2
+ authors = ["Ash Vardanian <1983160+ashvardanian@users.noreply.github.com>"]
3
+ categories = [
4
+ "mathematics",
5
+ "hardware-support",
6
+ "no-std",
7
+ "wasm",
8
+ "external-ffi-bindings",
9
+ ]
10
+ description = "Portable mixed-precision math, linear-algebra, & retrieval library with 2000+ SIMD kernels for x86, Arm, RISC-V, LoongArch, Power, & WebAssembly"
11
+ documentation = "https://docs.rs/numkong"
12
+ edition = "2021"
13
+ homepage = "https://ashvardanian.com/posts/numkong-faster-scipy"
14
+ include = ["rust/*.rs", "c/*.c", "c/*.h", "include/**/*.h", "probes/*.c", "build.rs"]
15
+ keywords = ["simd", "search", "linear-algebra", "vector"]
16
+ license = "Apache-2.0"
17
+ links = "numkong"
18
+ name = "numkong"
19
+ readme = "rust/README.md"
20
+ repository = "https://github.com/ashvardanian/NumKong"
21
+ rust-version = "1.64" # Introduced Core C FFI in stable Rust
22
+ version = "7.5.0"
23
+
24
+ [lib]
25
+ name = "numkong"
26
+ path = "rust/numkong.rs"
27
+
28
+ [package.metadata.docs.rs]
29
+ all-features = true
30
+ rustdoc-args = ["--cfg", "docsrs"]
31
+
32
+ [build-dependencies]
33
+ cc = "1.2.36"
34
+
35
+ [profile.bench]
36
+ codegen-units = 1 # May increase compilation time but optimizes further
37
+ lto = true # Enables Link Time Optimization for further optimizations
38
+ opt-level = 3 # Corresponds to -O3
39
+ rpath = false # On some systems, setting this to false can help with optimizations
40
+
41
+ [features]
42
+ default = []
43
+ parallel = ["dep:fork_union", "std"]
44
+ std = []
45
+ wasm-runtime = []
46
+
47
+ [dependencies]
48
+ fork_union = {version = "2.3", optional = true}
49
+
50
+ [dev-dependencies]
51
+ half = {version = "2.6.0"}
52
+ rand = {version = "0.10.0"}
53
+ wasmtime = {version = "43.0"}
54
+ wasmtime-wasi = {version = "43.0"}
@@ -0,0 +1,8 @@
1
+ recursive-include include *.h
2
+ recursive-include c *.c *.h
3
+ recursive-include python *.c *.h *.py *.pyi
4
+ recursive-include probes *.c
5
+ include VERSION
6
+ include LICENSE
7
+ include README.md
8
+ include python/README.md
@@ -0,0 +1,84 @@
1
+ // swift-tools-version:6.1
2
+ // The swift-tools-version declares the minimum version of Swift required to build this package.
3
+ // 6.1 is the minimum version required for the package access level.
4
+
5
+ import PackageDescription
6
+
7
+ let package = Package(
8
+ name: "NumKong",
9
+ // SPM has no `.linux` platform constant — Linux is supported and tested in CI;
10
+ // it simply ignores the `platforms` array on non-Apple hosts.
11
+ platforms: [
12
+ .macOS(.v11),
13
+ .iOS(.v14),
14
+ .tvOS(.v14),
15
+ .watchOS(.v7),
16
+ .visionOS(.v1),
17
+ ],
18
+ products: [
19
+ // We need to expose the underlying `CNumKongDispatch` target to simplify
20
+ // linking for USearch
21
+ .library(name: "NumKong", targets: ["NumKong"]),
22
+ .library(name: "CNumKongDispatch", targets: ["CNumKongDispatch"]),
23
+ ],
24
+ targets: [
25
+ .testTarget(
26
+ name: "Test",
27
+ dependencies: ["NumKong"],
28
+ path: "test/swift",
29
+ cSettings: [
30
+ .define("NK_DYNAMIC_DISPATCH", to: "1"),
31
+ .define("NK_NATIVE_F16", to: "0"),
32
+ .define("NK_NATIVE_BF16", to: "0"),
33
+ ]
34
+ ),
35
+ .testTarget(
36
+ name: "Bench",
37
+ dependencies: ["NumKong", "CNumKong"],
38
+ path: "bench/swift",
39
+ cSettings: [
40
+ .define("NK_DYNAMIC_DISPATCH", to: "1"),
41
+ .define("NK_NATIVE_F16", to: "0"),
42
+ .define("NK_NATIVE_BF16", to: "0"),
43
+ ]
44
+ ),
45
+ .target(
46
+ name: "NumKong",
47
+ dependencies: ["CNumKong", "CNumKongDispatch"],
48
+ path: "swift",
49
+ exclude: ["README.md"],
50
+ cSettings: [
51
+ .define("NK_DYNAMIC_DISPATCH", to: "1"),
52
+ .define("NK_NATIVE_F16", to: "0"),
53
+ .define("NK_NATIVE_BF16", to: "0"),
54
+ ]
55
+ ),
56
+ .target(
57
+ name: "CNumKong",
58
+ path: "include",
59
+ publicHeadersPath: ".",
60
+ cSettings: [
61
+ .define("NK_DYNAMIC_DISPATCH", to: "1"),
62
+ .define("NK_NATIVE_F16", to: "0"),
63
+ .define("NK_NATIVE_BF16", to: "0"),
64
+ ]
65
+ ),
66
+ // No `.unsafeFlags` here — SPM forbids depending on targets with unsafeFlags
67
+ // when pulled as a remote package dependency. `-Wno-psabi` is GCC-only anyway
68
+ // (ARM Linux ABI notes); CMake handles it in the GNU-only branch.
69
+ .target(
70
+ name: "CNumKongDispatch",
71
+ dependencies: ["CNumKong"],
72
+ path: "c",
73
+ // dispatch.h is internal to this target — expose it so SPM doesn't
74
+ // look for a non-existent `include/` subdirectory.
75
+ publicHeadersPath: ".",
76
+ cSettings: [
77
+ .define("NK_DYNAMIC_DISPATCH", to: "1"),
78
+ .define("NK_NATIVE_F16", to: "0"),
79
+ .define("NK_NATIVE_BF16", to: "0"),
80
+ .headerSearchPath("../include"),
81
+ ]
82
+ ),
83
+ ]
84
+ )