usearch 2.21.3 → 2.25.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +24 -24
- package/binding.gyp +15 -37
- package/c/CMakeLists.txt +4 -5
- package/c/README.md +7 -7
- package/c/lib.cpp +32 -14
- package/c/test.c +83 -1
- package/c/usearch.h +24 -3
- package/cpp/CMakeLists.txt +4 -0
- package/cpp/README.md +5 -5
- package/cpp/bench.cpp +97 -116
- package/cpp/test.cpp +117 -20
- package/include/usearch/index.hpp +235 -52
- package/include/usearch/index_dense.hpp +105 -40
- package/include/usearch/index_plugins.hpp +1387 -204
- package/javascript/dist/cjs/usearch.d.ts +8 -3
- package/javascript/dist/cjs/usearch.js +12 -4
- package/javascript/dist/esm/usearch.d.ts +8 -3
- package/javascript/dist/esm/usearch.js +12 -4
- package/javascript/lib.cpp +17 -0
- package/javascript/usearch.ts +14 -6
- package/numkong/.clang-tidy +30 -0
- package/{simsimd → numkong}/.cmake-format.py +18 -0
- package/numkong/.editorconfig +12 -0
- package/numkong/.git-blame-ignore-revs +123 -0
- package/numkong/.mailmap +15 -0
- package/numkong/.spi.yml +11 -0
- package/numkong/.swift-format +14 -0
- package/numkong/CITATION.cff +81 -0
- package/numkong/CONTRIBUTING.md +500 -0
- package/numkong/Cargo.toml +54 -0
- package/numkong/MANIFEST.in +8 -0
- package/numkong/Package.swift +84 -0
- package/numkong/README.md +569 -0
- package/numkong/bench/README.md +217 -0
- package/numkong/bench/bench-browser.html +323 -0
- package/numkong/bench/bench.cpp +344 -0
- package/numkong/bench/bench.hpp +816 -0
- package/numkong/bench/bench.js +148 -0
- package/numkong/bench/bench.mjs +616 -0
- package/numkong/bench/bench_attention.cpp +113 -0
- package/numkong/bench/bench_cast.cpp +264 -0
- package/numkong/bench/bench_cross_amx.cpp +62 -0
- package/numkong/bench/bench_cross_arm.cpp +245 -0
- package/numkong/bench/bench_cross_blas.cpp +309 -0
- package/numkong/bench/bench_cross_loongarch.cpp +106 -0
- package/numkong/bench/bench_cross_power.cpp +84 -0
- package/numkong/bench/bench_cross_rvv.cpp +121 -0
- package/numkong/bench/bench_cross_serial.cpp +151 -0
- package/numkong/bench/bench_cross_sme.cpp +163 -0
- package/numkong/bench/bench_cross_wasm.cpp +142 -0
- package/numkong/bench/bench_cross_x86.cpp +455 -0
- package/numkong/bench/bench_curved.cpp +210 -0
- package/numkong/bench/bench_dot.cpp +315 -0
- package/numkong/bench/bench_each.cpp +503 -0
- package/numkong/bench/bench_geospatial.cpp +112 -0
- package/numkong/bench/bench_maxsim.cpp +154 -0
- package/numkong/bench/bench_mesh.cpp +148 -0
- package/numkong/bench/bench_probability.cpp +60 -0
- package/numkong/bench/bench_reduce.cpp +371 -0
- package/numkong/bench/bench_set.cpp +73 -0
- package/numkong/bench/bench_sparse.cpp +198 -0
- package/numkong/bench/bench_spatial.cpp +347 -0
- package/numkong/bench/bench_trigonometry.cpp +137 -0
- package/numkong/bench/swift/Bench.swift +506 -0
- package/numkong/binding.gyp +169 -0
- package/numkong/build.rs +484 -0
- package/numkong/c/dispatch.h +512 -0
- package/numkong/c/dispatch_bf16.c +447 -0
- package/numkong/c/dispatch_bf16c.c +52 -0
- package/numkong/c/dispatch_e2m3.c +296 -0
- package/numkong/c/dispatch_e3m2.c +284 -0
- package/numkong/c/dispatch_e4m3.c +318 -0
- package/numkong/c/dispatch_e5m2.c +316 -0
- package/numkong/c/dispatch_f16.c +452 -0
- package/numkong/c/dispatch_f16c.c +58 -0
- package/numkong/c/dispatch_f32.c +434 -0
- package/numkong/c/dispatch_f32c.c +99 -0
- package/numkong/c/dispatch_f64.c +348 -0
- package/numkong/c/dispatch_f64c.c +98 -0
- package/numkong/c/dispatch_i16.c +96 -0
- package/numkong/c/dispatch_i32.c +89 -0
- package/numkong/c/dispatch_i4.c +153 -0
- package/numkong/c/dispatch_i64.c +86 -0
- package/numkong/c/dispatch_i8.c +348 -0
- package/numkong/c/dispatch_other.c +348 -0
- package/numkong/c/dispatch_u1.c +193 -0
- package/numkong/c/dispatch_u16.c +124 -0
- package/numkong/c/dispatch_u32.c +118 -0
- package/numkong/c/dispatch_u4.c +153 -0
- package/numkong/c/dispatch_u64.c +102 -0
- package/numkong/c/dispatch_u8.c +364 -0
- package/numkong/c/numkong.c +940 -0
- package/numkong/cmake/nk_arm_isa_probes.cmake +61 -0
- package/numkong/cmake/nk_isa_probe.cmake +90 -0
- package/numkong/cmake/nk_loongarch_isa_probes.cmake +15 -0
- package/numkong/cmake/nk_math_lib.cmake +46 -0
- package/numkong/cmake/nk_power_isa_probes.cmake +15 -0
- package/numkong/cmake/nk_riscv_isa_probes.cmake +19 -0
- package/numkong/cmake/nk_x86_isa_probes.cmake +35 -0
- package/numkong/cmake/toolchain-aarch64-gnu.cmake +86 -0
- package/numkong/cmake/toolchain-android-arm64.cmake +25 -0
- package/numkong/cmake/toolchain-android-armv7.cmake +25 -0
- package/numkong/cmake/toolchain-loongarch64-gnu.cmake +68 -0
- package/numkong/cmake/toolchain-ppc64le-gnu.cmake +74 -0
- package/numkong/cmake/toolchain-riscv64-gnu.cmake +107 -0
- package/numkong/cmake/toolchain-riscv64-llvm.cmake +114 -0
- package/numkong/cmake/toolchain-wasi.cmake +77 -0
- package/numkong/cmake/toolchain-wasm.cmake +70 -0
- package/numkong/cmake/toolchain-wasm64.cmake +62 -0
- package/numkong/cmake/toolchain-x86_64-llvm.cmake +47 -0
- package/numkong/include/README.md +643 -0
- package/numkong/include/module.modulemap +129 -0
- package/numkong/include/numkong/attention/sapphireamx.h +1363 -0
- package/numkong/include/numkong/attention/sme.h +2075 -0
- package/numkong/include/numkong/attention.h +49 -0
- package/numkong/include/numkong/capabilities.h +930 -0
- package/numkong/include/numkong/cast/README.md +262 -0
- package/numkong/include/numkong/cast/diamond.h +64 -0
- package/numkong/include/numkong/cast/haswell.h +823 -0
- package/numkong/include/numkong/cast/icelake.h +475 -0
- package/numkong/include/numkong/cast/loongsonasx.h +252 -0
- package/numkong/include/numkong/cast/neon.h +1174 -0
- package/numkong/include/numkong/cast/powervsx.h +449 -0
- package/numkong/include/numkong/cast/rvv.h +970 -0
- package/numkong/include/numkong/cast/sapphire.h +262 -0
- package/numkong/include/numkong/cast/serial.h +2336 -0
- package/numkong/include/numkong/cast/skylake.h +915 -0
- package/numkong/include/numkong/cast/v128relaxed.h +537 -0
- package/numkong/include/numkong/cast.h +254 -0
- package/numkong/include/numkong/cast.hpp +44 -0
- package/numkong/include/numkong/curved/README.md +223 -0
- package/numkong/include/numkong/curved/genoa.h +182 -0
- package/numkong/include/numkong/curved/haswell.h +276 -0
- package/numkong/include/numkong/curved/neon.h +329 -0
- package/numkong/include/numkong/curved/neonbfdot.h +211 -0
- package/numkong/include/numkong/curved/rvv.h +305 -0
- package/numkong/include/numkong/curved/serial.h +207 -0
- package/numkong/include/numkong/curved/skylake.h +457 -0
- package/numkong/include/numkong/curved/smef64.h +530 -0
- package/numkong/include/numkong/curved.h +513 -0
- package/numkong/include/numkong/curved.hpp +144 -0
- package/numkong/include/numkong/dot/README.md +442 -0
- package/numkong/include/numkong/dot/alder.h +563 -0
- package/numkong/include/numkong/dot/diamond.h +158 -0
- package/numkong/include/numkong/dot/genoa.h +289 -0
- package/numkong/include/numkong/dot/haswell.h +1723 -0
- package/numkong/include/numkong/dot/icelake.h +997 -0
- package/numkong/include/numkong/dot/loongsonasx.h +671 -0
- package/numkong/include/numkong/dot/neon.h +869 -0
- package/numkong/include/numkong/dot/neonbfdot.h +243 -0
- package/numkong/include/numkong/dot/neonfhm.h +358 -0
- package/numkong/include/numkong/dot/neonfp8.h +323 -0
- package/numkong/include/numkong/dot/neonsdot.h +622 -0
- package/numkong/include/numkong/dot/powervsx.h +752 -0
- package/numkong/include/numkong/dot/rvv.h +722 -0
- package/numkong/include/numkong/dot/rvvbb.h +72 -0
- package/numkong/include/numkong/dot/rvvbf16.h +123 -0
- package/numkong/include/numkong/dot/rvvhalf.h +129 -0
- package/numkong/include/numkong/dot/sapphire.h +141 -0
- package/numkong/include/numkong/dot/serial.h +874 -0
- package/numkong/include/numkong/dot/sierra.h +405 -0
- package/numkong/include/numkong/dot/skylake.h +1116 -0
- package/numkong/include/numkong/dot/sve.h +420 -0
- package/numkong/include/numkong/dot/svebfdot.h +75 -0
- package/numkong/include/numkong/dot/svehalf.h +168 -0
- package/numkong/include/numkong/dot/svesdot.h +90 -0
- package/numkong/include/numkong/dot/v128relaxed.h +1293 -0
- package/numkong/include/numkong/dot.h +1136 -0
- package/numkong/include/numkong/dot.hpp +94 -0
- package/numkong/include/numkong/dots/README.md +496 -0
- package/numkong/include/numkong/dots/alder.h +117 -0
- package/numkong/include/numkong/dots/diamond.h +86 -0
- package/numkong/include/numkong/dots/genoa.h +100 -0
- package/numkong/include/numkong/dots/graniteamx.h +733 -0
- package/numkong/include/numkong/dots/haswell.h +310 -0
- package/numkong/include/numkong/dots/icelake.h +180 -0
- package/numkong/include/numkong/dots/loongsonasx.h +176 -0
- package/numkong/include/numkong/dots/neon.h +123 -0
- package/numkong/include/numkong/dots/neonbfdot.h +59 -0
- package/numkong/include/numkong/dots/neonfhm.h +96 -0
- package/numkong/include/numkong/dots/neonfp8.h +99 -0
- package/numkong/include/numkong/dots/neonsdot.h +144 -0
- package/numkong/include/numkong/dots/powervsx.h +194 -0
- package/numkong/include/numkong/dots/rvv.h +2593 -0
- package/numkong/include/numkong/dots/sapphireamx.h +4017 -0
- package/numkong/include/numkong/dots/serial.h +2867 -0
- package/numkong/include/numkong/dots/sierra.h +100 -0
- package/numkong/include/numkong/dots/skylake.h +207 -0
- package/numkong/include/numkong/dots/sme.h +5041 -0
- package/numkong/include/numkong/dots/smebi32.h +477 -0
- package/numkong/include/numkong/dots/smef64.h +1328 -0
- package/numkong/include/numkong/dots/smehalf.h +47 -0
- package/numkong/include/numkong/dots/v128relaxed.h +317 -0
- package/numkong/include/numkong/dots.h +3110 -0
- package/numkong/include/numkong/dots.hpp +641 -0
- package/numkong/include/numkong/each/README.md +465 -0
- package/numkong/include/numkong/each/haswell.h +1658 -0
- package/numkong/include/numkong/each/icelake.h +272 -0
- package/numkong/include/numkong/each/neon.h +1138 -0
- package/numkong/include/numkong/each/neonbfdot.h +211 -0
- package/numkong/include/numkong/each/neonhalf.h +318 -0
- package/numkong/include/numkong/each/rvv.h +1121 -0
- package/numkong/include/numkong/each/sapphire.h +343 -0
- package/numkong/include/numkong/each/serial.h +282 -0
- package/numkong/include/numkong/each/skylake.h +1562 -0
- package/numkong/include/numkong/each/v128relaxed.h +562 -0
- package/numkong/include/numkong/each.h +2232 -0
- package/numkong/include/numkong/each.hpp +434 -0
- package/numkong/include/numkong/geospatial/README.md +147 -0
- package/numkong/include/numkong/geospatial/haswell.h +633 -0
- package/numkong/include/numkong/geospatial/neon.h +615 -0
- package/numkong/include/numkong/geospatial/rvv.h +701 -0
- package/numkong/include/numkong/geospatial/serial.h +309 -0
- package/numkong/include/numkong/geospatial/skylake.h +613 -0
- package/numkong/include/numkong/geospatial/v128relaxed.h +652 -0
- package/numkong/include/numkong/geospatial.h +453 -0
- package/numkong/include/numkong/geospatial.hpp +235 -0
- package/numkong/include/numkong/matrix.hpp +336 -0
- package/numkong/include/numkong/maxsim/README.md +187 -0
- package/numkong/include/numkong/maxsim/alder.h +511 -0
- package/numkong/include/numkong/maxsim/genoa.h +115 -0
- package/numkong/include/numkong/maxsim/haswell.h +553 -0
- package/numkong/include/numkong/maxsim/icelake.h +480 -0
- package/numkong/include/numkong/maxsim/neonsdot.h +394 -0
- package/numkong/include/numkong/maxsim/sapphireamx.h +877 -0
- package/numkong/include/numkong/maxsim/serial.h +490 -0
- package/numkong/include/numkong/maxsim/sme.h +993 -0
- package/numkong/include/numkong/maxsim/v128relaxed.h +280 -0
- package/numkong/include/numkong/maxsim.h +571 -0
- package/numkong/include/numkong/maxsim.hpp +133 -0
- package/numkong/include/numkong/mesh/README.md +219 -0
- package/numkong/include/numkong/mesh/haswell.h +2013 -0
- package/numkong/include/numkong/mesh/neon.h +1821 -0
- package/numkong/include/numkong/mesh/neonbfdot.h +771 -0
- package/numkong/include/numkong/mesh/rvv.h +936 -0
- package/numkong/include/numkong/mesh/serial.h +721 -0
- package/numkong/include/numkong/mesh/skylake.h +2344 -0
- package/numkong/include/numkong/mesh/v128relaxed.h +1081 -0
- package/numkong/include/numkong/mesh.h +666 -0
- package/numkong/include/numkong/mesh.hpp +701 -0
- package/numkong/include/numkong/numkong.h +78 -0
- package/numkong/include/numkong/numkong.hpp +58 -0
- package/numkong/include/numkong/probability/README.md +177 -0
- package/numkong/include/numkong/probability/haswell.h +267 -0
- package/numkong/include/numkong/probability/neon.h +255 -0
- package/numkong/include/numkong/probability/rvv.h +414 -0
- package/numkong/include/numkong/probability/serial.h +181 -0
- package/numkong/include/numkong/probability/skylake.h +324 -0
- package/numkong/include/numkong/probability.h +380 -0
- package/numkong/include/numkong/probability.hpp +120 -0
- package/numkong/include/numkong/random.h +50 -0
- package/numkong/include/numkong/random.hpp +285 -0
- package/numkong/include/numkong/reduce/README.md +552 -0
- package/numkong/include/numkong/reduce/alder.h +636 -0
- package/numkong/include/numkong/reduce/genoa.h +201 -0
- package/numkong/include/numkong/reduce/haswell.h +3785 -0
- package/numkong/include/numkong/reduce/icelake.h +549 -0
- package/numkong/include/numkong/reduce/neon.h +3980 -0
- package/numkong/include/numkong/reduce/neonbfdot.h +142 -0
- package/numkong/include/numkong/reduce/neonfhm.h +293 -0
- package/numkong/include/numkong/reduce/neonsdot.h +357 -0
- package/numkong/include/numkong/reduce/rvv.h +3533 -0
- package/numkong/include/numkong/reduce/serial.h +753 -0
- package/numkong/include/numkong/reduce/sierra.h +338 -0
- package/numkong/include/numkong/reduce/skylake.h +3794 -0
- package/numkong/include/numkong/reduce/sve.h +52 -0
- package/numkong/include/numkong/reduce/v128relaxed.h +2302 -0
- package/numkong/include/numkong/reduce.h +1582 -0
- package/numkong/include/numkong/reduce.hpp +778 -0
- package/numkong/include/numkong/scalar/README.md +89 -0
- package/numkong/include/numkong/scalar/haswell.h +122 -0
- package/numkong/include/numkong/scalar/loongsonasx.h +74 -0
- package/numkong/include/numkong/scalar/neon.h +122 -0
- package/numkong/include/numkong/scalar/neonhalf.h +70 -0
- package/numkong/include/numkong/scalar/powervsx.h +96 -0
- package/numkong/include/numkong/scalar/rvv.h +211 -0
- package/numkong/include/numkong/scalar/sapphire.h +74 -0
- package/numkong/include/numkong/scalar/serial.h +332 -0
- package/numkong/include/numkong/scalar/v128relaxed.h +56 -0
- package/numkong/include/numkong/scalar.h +696 -0
- package/numkong/include/numkong/set/README.md +179 -0
- package/numkong/include/numkong/set/haswell.h +334 -0
- package/numkong/include/numkong/set/icelake.h +485 -0
- package/numkong/include/numkong/set/loongsonasx.h +181 -0
- package/numkong/include/numkong/set/neon.h +363 -0
- package/numkong/include/numkong/set/powervsx.h +326 -0
- package/numkong/include/numkong/set/rvv.h +226 -0
- package/numkong/include/numkong/set/rvvbb.h +117 -0
- package/numkong/include/numkong/set/serial.h +174 -0
- package/numkong/include/numkong/set/sve.h +187 -0
- package/numkong/include/numkong/set/v128relaxed.h +240 -0
- package/numkong/include/numkong/set.h +471 -0
- package/numkong/include/numkong/set.hpp +114 -0
- package/numkong/include/numkong/sets/README.md +149 -0
- package/numkong/include/numkong/sets/haswell.h +63 -0
- package/numkong/include/numkong/sets/icelake.h +66 -0
- package/numkong/include/numkong/sets/loongsonasx.h +52 -0
- package/numkong/include/numkong/sets/neon.h +61 -0
- package/numkong/include/numkong/sets/powervsx.h +65 -0
- package/numkong/include/numkong/sets/serial.h +43 -0
- package/numkong/include/numkong/sets/smebi32.h +1135 -0
- package/numkong/include/numkong/sets/v128relaxed.h +58 -0
- package/numkong/include/numkong/sets.h +382 -0
- package/numkong/include/numkong/sparse/README.md +156 -0
- package/numkong/include/numkong/sparse/icelake.h +463 -0
- package/numkong/include/numkong/sparse/neon.h +288 -0
- package/numkong/include/numkong/sparse/serial.h +117 -0
- package/numkong/include/numkong/sparse/sve2.h +504 -0
- package/numkong/include/numkong/sparse/turin.h +322 -0
- package/numkong/include/numkong/sparse.h +363 -0
- package/numkong/include/numkong/sparse.hpp +113 -0
- package/numkong/include/numkong/spatial/README.md +439 -0
- package/numkong/include/numkong/spatial/alder.h +604 -0
- package/numkong/include/numkong/spatial/diamond.h +240 -0
- package/numkong/include/numkong/spatial/genoa.h +222 -0
- package/numkong/include/numkong/spatial/haswell.h +979 -0
- package/numkong/include/numkong/spatial/icelake.h +1067 -0
- package/numkong/include/numkong/spatial/loongsonasx.h +483 -0
- package/numkong/include/numkong/spatial/neon.h +846 -0
- package/numkong/include/numkong/spatial/neonbfdot.h +164 -0
- package/numkong/include/numkong/spatial/neonfp8.h +258 -0
- package/numkong/include/numkong/spatial/neonsdot.h +429 -0
- package/numkong/include/numkong/spatial/powervsx.h +738 -0
- package/numkong/include/numkong/spatial/rvv.h +991 -0
- package/numkong/include/numkong/spatial/rvvbf16.h +128 -0
- package/numkong/include/numkong/spatial/rvvhalf.h +120 -0
- package/numkong/include/numkong/spatial/serial.h +347 -0
- package/numkong/include/numkong/spatial/sierra.h +516 -0
- package/numkong/include/numkong/spatial/skylake.h +605 -0
- package/numkong/include/numkong/spatial/sve.h +246 -0
- package/numkong/include/numkong/spatial/svebfdot.h +125 -0
- package/numkong/include/numkong/spatial/svehalf.h +136 -0
- package/numkong/include/numkong/spatial/svesdot.h +143 -0
- package/numkong/include/numkong/spatial/v128relaxed.h +969 -0
- package/numkong/include/numkong/spatial.h +1681 -0
- package/numkong/include/numkong/spatial.hpp +183 -0
- package/numkong/include/numkong/spatials/README.md +580 -0
- package/numkong/include/numkong/spatials/alder.h +94 -0
- package/numkong/include/numkong/spatials/diamond.h +82 -0
- package/numkong/include/numkong/spatials/genoa.h +94 -0
- package/numkong/include/numkong/spatials/graniteamx.h +173 -0
- package/numkong/include/numkong/spatials/haswell.h +219 -0
- package/numkong/include/numkong/spatials/icelake.h +113 -0
- package/numkong/include/numkong/spatials/loongsonasx.h +153 -0
- package/numkong/include/numkong/spatials/neon.h +109 -0
- package/numkong/include/numkong/spatials/neonbfdot.h +60 -0
- package/numkong/include/numkong/spatials/neonfhm.h +92 -0
- package/numkong/include/numkong/spatials/neonfp8.h +111 -0
- package/numkong/include/numkong/spatials/neonsdot.h +143 -0
- package/numkong/include/numkong/spatials/powervsx.h +153 -0
- package/numkong/include/numkong/spatials/rvv.h +1976 -0
- package/numkong/include/numkong/spatials/sapphireamx.h +1149 -0
- package/numkong/include/numkong/spatials/serial.h +248 -0
- package/numkong/include/numkong/spatials/sierra.h +96 -0
- package/numkong/include/numkong/spatials/skylake.h +184 -0
- package/numkong/include/numkong/spatials/sme.h +1927 -0
- package/numkong/include/numkong/spatials/smef64.h +483 -0
- package/numkong/include/numkong/spatials/v128relaxed.h +240 -0
- package/numkong/include/numkong/spatials.h +3374 -0
- package/numkong/include/numkong/spatials.hpp +509 -0
- package/numkong/include/numkong/tensor.hpp +1981 -0
- package/numkong/include/numkong/trigonometry/README.md +184 -0
- package/numkong/include/numkong/trigonometry/haswell.h +653 -0
- package/numkong/include/numkong/trigonometry/neon.h +638 -0
- package/numkong/include/numkong/trigonometry/rvv.h +700 -0
- package/numkong/include/numkong/trigonometry/serial.h +703 -0
- package/numkong/include/numkong/trigonometry/skylake.h +725 -0
- package/numkong/include/numkong/trigonometry/v128relaxed.h +667 -0
- package/numkong/include/numkong/trigonometry.h +467 -0
- package/numkong/include/numkong/trigonometry.hpp +166 -0
- package/numkong/include/numkong/types.h +1695 -0
- package/numkong/include/numkong/types.hpp +6027 -0
- package/numkong/include/numkong/vector.hpp +766 -0
- package/numkong/javascript/@numkong-darwin-arm64/package.json +26 -0
- package/numkong/javascript/@numkong-darwin-x64/package.json +26 -0
- package/numkong/javascript/@numkong-linux-arm64/package.json +25 -0
- package/numkong/javascript/@numkong-linux-x64/package.json +25 -0
- package/numkong/javascript/@numkong-win32-arm64/package.json +25 -0
- package/numkong/javascript/@numkong-win32-x64/package.json +25 -0
- package/numkong/javascript/README.md +254 -0
- package/numkong/javascript/node-gyp-build.d.ts +4 -0
- package/numkong/javascript/numkong-browser.ts +40 -0
- package/numkong/javascript/numkong-wasm.ts +750 -0
- package/numkong/javascript/numkong.c +712 -0
- package/numkong/javascript/numkong.ts +613 -0
- package/{simsimd → numkong}/javascript/tsconfig-base.json +6 -3
- package/numkong/javascript/tsconfig-cjs.json +13 -0
- package/{simsimd → numkong}/javascript/tsconfig-esm.json +1 -1
- package/numkong/javascript/types.ts +784 -0
- package/numkong/numkong.gypi +104 -0
- package/numkong/package.json +108 -0
- package/numkong/probes/arm_neon.c +8 -0
- package/numkong/probes/arm_neon_bfdot.c +9 -0
- package/numkong/probes/arm_neon_fhm.c +9 -0
- package/numkong/probes/arm_neon_half.c +8 -0
- package/numkong/probes/arm_neon_sdot.c +9 -0
- package/numkong/probes/arm_neonfp8.c +9 -0
- package/numkong/probes/arm_sme.c +16 -0
- package/numkong/probes/arm_sme2.c +16 -0
- package/numkong/probes/arm_sme2p1.c +16 -0
- package/numkong/probes/arm_sme_bf16.c +16 -0
- package/numkong/probes/arm_sme_bi32.c +16 -0
- package/numkong/probes/arm_sme_f64.c +16 -0
- package/numkong/probes/arm_sme_fa64.c +14 -0
- package/numkong/probes/arm_sme_half.c +16 -0
- package/numkong/probes/arm_sme_lut2.c +15 -0
- package/numkong/probes/arm_sve.c +18 -0
- package/numkong/probes/arm_sve2.c +20 -0
- package/numkong/probes/arm_sve2p1.c +18 -0
- package/numkong/probes/arm_sve_bfdot.c +20 -0
- package/numkong/probes/arm_sve_half.c +18 -0
- package/numkong/probes/arm_sve_sdot.c +21 -0
- package/numkong/probes/loongarch_lasx.c +12 -0
- package/numkong/probes/power_vsx.c +12 -0
- package/numkong/probes/probe.js +127 -0
- package/numkong/probes/riscv_rvv.c +14 -0
- package/numkong/probes/riscv_rvv_bb.c +15 -0
- package/numkong/probes/riscv_rvv_bf16.c +17 -0
- package/numkong/probes/riscv_rvv_half.c +14 -0
- package/numkong/probes/wasm_v128relaxed.c +11 -0
- package/numkong/probes/x86_alder.c +17 -0
- package/numkong/probes/x86_diamond.c +17 -0
- package/numkong/probes/x86_genoa.c +17 -0
- package/numkong/probes/x86_graniteamx.c +19 -0
- package/numkong/probes/x86_haswell.c +11 -0
- package/numkong/probes/x86_icelake.c +17 -0
- package/numkong/probes/x86_sapphire.c +16 -0
- package/numkong/probes/x86_sapphireamx.c +18 -0
- package/numkong/probes/x86_sierra.c +17 -0
- package/numkong/probes/x86_skylake.c +15 -0
- package/numkong/probes/x86_turin.c +17 -0
- package/numkong/rust/README.md +698 -0
- package/numkong/rust/capabilities.rs +96 -0
- package/numkong/rust/cast.rs +314 -0
- package/numkong/rust/curved.rs +391 -0
- package/numkong/rust/each.rs +2721 -0
- package/numkong/rust/geospatial.rs +343 -0
- package/numkong/rust/matrix.rs +5424 -0
- package/numkong/rust/maxsim.rs +540 -0
- package/numkong/rust/mesh.rs +837 -0
- package/numkong/rust/numkong.rs +409 -0
- package/numkong/rust/probability.rs +272 -0
- package/numkong/rust/reduce.rs +1249 -0
- package/numkong/rust/set.rs +194 -0
- package/numkong/rust/sparse.rs +513 -0
- package/numkong/rust/spatial.rs +1815 -0
- package/numkong/rust/tensor.rs +7565 -0
- package/numkong/rust/types.rs +3666 -0
- package/numkong/rust/vector.rs +1899 -0
- package/numkong/rustfmt.toml +2 -0
- package/numkong/swift/Matrix.swift +1388 -0
- package/numkong/swift/MaxSim.swift +151 -0
- package/numkong/swift/NumKong.swift +283 -0
- package/numkong/swift/Numerics.swift +329 -0
- package/numkong/swift/README.md +433 -0
- package/numkong/swift/Scalar.swift +741 -0
- package/numkong/swift/Tensor.swift +209 -0
- package/numkong/test/README.md +315 -0
- package/numkong/test/playwright.config.ts +16 -0
- package/numkong/test/swift/Test.swift +534 -0
- package/numkong/test/test-browser-bundle-runner.mjs +36 -0
- package/numkong/test/test-browser-bundle.html +188 -0
- package/numkong/test/test-browser-runner.mjs +43 -0
- package/numkong/test/test-browser.html +305 -0
- package/numkong/test/test-dtypes.mjs +453 -0
- package/numkong/test/test-wasm.mjs +267 -0
- package/numkong/test/test.cpp +442 -0
- package/numkong/test/test.hpp +580 -0
- package/numkong/test/test.mjs +363 -0
- package/numkong/test/test_base.py +1041 -0
- package/numkong/test/test_cast.cpp +242 -0
- package/numkong/test/test_cross.hpp +551 -0
- package/numkong/test/test_cross.py +467 -0
- package/numkong/test/test_cross_amx.cpp +50 -0
- package/numkong/test/test_cross_arm.cpp +225 -0
- package/numkong/test/test_cross_blas.cpp +354 -0
- package/numkong/test/test_cross_loongarch.cpp +90 -0
- package/numkong/test/test_cross_power.cpp +73 -0
- package/numkong/test/test_cross_rvv.cpp +109 -0
- package/numkong/test/test_cross_serial.cpp +181 -0
- package/numkong/test/test_cross_sme.cpp +148 -0
- package/numkong/test/test_cross_wasm.cpp +141 -0
- package/numkong/test/test_cross_x86.cpp +442 -0
- package/numkong/test/test_curved.cpp +182 -0
- package/numkong/test/test_curved.py +207 -0
- package/numkong/test/test_dot.cpp +353 -0
- package/numkong/test/test_dot.py +296 -0
- package/numkong/test/test_each.cpp +437 -0
- package/numkong/test/test_each.py +756 -0
- package/numkong/test/test_geospatial.cpp +155 -0
- package/numkong/test/test_geospatial.py +241 -0
- package/numkong/test/test_maxsim.cpp +138 -0
- package/numkong/test/test_maxsim.py +209 -0
- package/numkong/test/test_mesh.cpp +203 -0
- package/numkong/test/test_mesh.py +394 -0
- package/numkong/test/test_probability.cpp +136 -0
- package/numkong/test/test_probability.py +166 -0
- package/numkong/test/test_reduce.cpp +563 -0
- package/numkong/test/test_reduce.py +781 -0
- package/numkong/test/test_set.cpp +151 -0
- package/numkong/test/test_set.py +120 -0
- package/numkong/test/test_similarities.py +579 -0
- package/numkong/test/test_sparse.cpp +121 -0
- package/numkong/test/test_sparse.py +118 -0
- package/numkong/test/test_spatial.cpp +518 -0
- package/numkong/test/test_spatial.py +269 -0
- package/numkong/test/test_tensor.cpp +884 -0
- package/numkong/test/test_tensor.py +1417 -0
- package/numkong/test/test_trigonometry.cpp +156 -0
- package/numkong/test/test_trigonometry.py +180 -0
- package/package.json +7 -8
- package/prebuilds/darwin-arm64+x64/usearch.node +0 -0
- package/prebuilds/linux-arm64/usearch.node +0 -0
- package/prebuilds/linux-x64/usearch.node +0 -0
- package/fp16/CMakeLists.txt +0 -176
- package/fp16/LICENSE +0 -11
- package/fp16/README.md +0 -20
- package/fp16/bench/alt-element.cc +0 -89
- package/fp16/bench/from-alt-array.cc +0 -175
- package/fp16/bench/from-ieee-array.cc +0 -399
- package/fp16/bench/ieee-element.cc +0 -272
- package/fp16/bench/to-alt-array.cc +0 -91
- package/fp16/bench/to-ieee-array.cc +0 -303
- package/fp16/cmake/DownloadGoogleBenchmark.cmake +0 -15
- package/fp16/cmake/DownloadGoogleTest.cmake +0 -15
- package/fp16/cmake/DownloadPSimd.cmake +0 -15
- package/fp16/configure.py +0 -65
- package/fp16/confu.yaml +0 -8
- package/fp16/include/fp16/__init__.py +0 -0
- package/fp16/include/fp16/avx.py +0 -50
- package/fp16/include/fp16/avx2.py +0 -53
- package/fp16/include/fp16/bitcasts.h +0 -92
- package/fp16/include/fp16/fp16.h +0 -451
- package/fp16/include/fp16/psimd.h +0 -131
- package/fp16/include/fp16.h +0 -11
- package/fp16/jni/Android.mk +0 -6
- package/fp16/jni/Application.mk +0 -4
- package/fp16/test/alt-from-fp32-value.cc +0 -498
- package/fp16/test/alt-to-fp32-bits.cc +0 -263
- package/fp16/test/alt-to-fp32-psimd.cc +0 -145
- package/fp16/test/alt-to-fp32-value.cc +0 -348
- package/fp16/test/alt-to-fp32x2-psimd.cc +0 -245
- package/fp16/test/bitcasts.cc +0 -56
- package/fp16/test/ieee-from-fp32-value.cc +0 -523
- package/fp16/test/ieee-to-fp32-bits.cc +0 -333
- package/fp16/test/ieee-to-fp32-psimd.cc +0 -312
- package/fp16/test/ieee-to-fp32-value.cc +0 -420
- package/fp16/test/ieee-to-fp32x2-psimd.cc +0 -541
- package/fp16/test/peachpy/alt-xmm-to-fp32-xmm-avx.cc +0 -96
- package/fp16/test/peachpy/alt-xmm-to-fp32-ymm-avx2.cc +0 -96
- package/fp16/test/peachpy/stubs.py +0 -38
- package/fp16/test/tables.cc +0 -530
- package/fp16/test/tables.h +0 -13
- package/fp16/third-party/THHalf.h +0 -92
- package/fp16/third-party/eigen-half.h +0 -170
- package/fp16/third-party/float16-compressor.h +0 -80
- package/fp16/third-party/half.hpp +0 -2916
- package/fp16/third-party/npy-halffloat.h +0 -328
- package/simsimd/.git-blame-ignore-revs +0 -2
- package/simsimd/CONTRIBUTING.md +0 -321
- package/simsimd/Cargo.toml +0 -49
- package/simsimd/MANIFEST.in +0 -4
- package/simsimd/Package.swift +0 -28
- package/simsimd/README.md +0 -1493
- package/simsimd/binding.gyp +0 -35
- package/simsimd/build.rs +0 -70
- package/simsimd/c/lib.c +0 -374
- package/simsimd/include/module.modulemap +0 -4
- package/simsimd/include/simsimd/binary.h +0 -486
- package/simsimd/include/simsimd/curved.h +0 -1541
- package/simsimd/include/simsimd/dot.h +0 -1853
- package/simsimd/include/simsimd/elementwise.h +0 -2465
- package/simsimd/include/simsimd/geospatial.h +0 -43
- package/simsimd/include/simsimd/mesh.h +0 -69
- package/simsimd/include/simsimd/probability.h +0 -606
- package/simsimd/include/simsimd/simsimd.h +0 -2567
- package/simsimd/include/simsimd/sparse.h +0 -1384
- package/simsimd/include/simsimd/spatial.h +0 -2335
- package/simsimd/include/simsimd/types.h +0 -666
- package/simsimd/javascript/fallback.ts +0 -233
- package/simsimd/javascript/lib.c +0 -125
- package/simsimd/javascript/node-gyp-build.d.ts +0 -1
- package/simsimd/javascript/simsimd.ts +0 -179
- package/simsimd/javascript/tsconfig-cjs.json +0 -8
- package/simsimd/package-lock.json +0 -1761
- package/simsimd/package.json +0 -61
- package/simsimd/rust/lib.rs +0 -1821
- package/simsimd/scripts/bench.cxx +0 -1170
- package/simsimd/scripts/bench.ipynb +0 -187
- package/simsimd/scripts/bench.js +0 -127
- package/simsimd/scripts/bench.rs +0 -876
- package/simsimd/scripts/bench_vectors.py +0 -734
- package/simsimd/scripts/bench_vectors_live.py +0 -213
- package/simsimd/scripts/test.c +0 -187
- package/simsimd/scripts/test.mjs +0 -220
- package/simsimd/scripts/test.py +0 -1505
- package/simsimd/swift/SimSIMD.swift +0 -149
- package/simsimd/swift/Test.swift +0 -128
- /package/{simsimd → numkong}/CODE_OF_CONDUCT.md +0 -0
- /package/{simsimd → numkong}/LICENSE +0 -0
- /package/{simsimd → numkong}/javascript/dist-package-cjs.json +0 -0
- /package/{simsimd → numkong}/javascript/dist-package-esm.json +0 -0
|
@@ -0,0 +1,741 @@
|
|
|
1
|
+
// Scalar.swift
|
|
2
|
+
// NumKong
|
|
3
|
+
//
|
|
4
|
+
// Created by Ash Vardanian on March 14, 2026.
|
|
5
|
+
//
|
|
6
|
+
|
|
7
|
+
import CNumKong
|
|
8
|
+
|
|
9
|
+
// MARK: - Spatial Protocols
|
|
10
|
+
|
|
11
|
+
/// A type that can compute SIMD-accelerated dot products with output type widening.
|
|
12
|
+
public protocol NumKongDot {
|
|
13
|
+
associatedtype DotOutput
|
|
14
|
+
static func dot<A, B>(_ a: A, _ b: B) -> DotOutput?
|
|
15
|
+
where A: Sequence, B: Sequence, A.Element == Self, B.Element == Self
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
/// A type that can compute SIMD-accelerated angular (cosine) distances.
|
|
19
|
+
public protocol NumKongAngular {
|
|
20
|
+
associatedtype AngularOutput
|
|
21
|
+
static func angular<A, B>(_ a: A, _ b: B) -> AngularOutput?
|
|
22
|
+
where A: Sequence, B: Sequence, A.Element == Self, B.Element == Self
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
/// A type that can compute SIMD-accelerated squared Euclidean distances.
|
|
26
|
+
public protocol NumKongSqEuclidean {
|
|
27
|
+
associatedtype SqEuclideanOutput
|
|
28
|
+
static func sqeuclidean<A, B>(_ a: A, _ b: B) -> SqEuclideanOutput?
|
|
29
|
+
where A: Sequence, B: Sequence, A.Element == Self, B.Element == Self
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
/// A type that can compute SIMD-accelerated Euclidean distances.
|
|
33
|
+
public protocol NumKongEuclidean {
|
|
34
|
+
associatedtype EuclideanOutput
|
|
35
|
+
static func euclidean<A, B>(_ a: A, _ b: B) -> EuclideanOutput?
|
|
36
|
+
where A: Sequence, B: Sequence, A.Element == Self, B.Element == Self
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
/// Convenience alias for types supporting all four spatial distance metrics.
|
|
40
|
+
public typealias NumKongSpatial = NumKongDot & NumKongAngular & NumKongEuclidean & NumKongSqEuclidean
|
|
41
|
+
|
|
42
|
+
// MARK: - Built-in Scalars
|
|
43
|
+
|
|
44
|
+
extension Float64: NumKongDot {
|
|
45
|
+
public typealias DotOutput = Float64
|
|
46
|
+
|
|
47
|
+
@inlinable @inline(__always)
|
|
48
|
+
public static func dot<A, B>(_ a: A, _ b: B) -> Float64?
|
|
49
|
+
where A: Sequence, B: Sequence, A.Element == Float64, B.Element == Float64 {
|
|
50
|
+
_nkWithDensePair(a, b) { ap, bp, n in
|
|
51
|
+
var result: Float64 = 0
|
|
52
|
+
nk_dot_f64(ap, bp, UInt64(n), &result)
|
|
53
|
+
return result
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
extension Float64: NumKongAngular {
|
|
59
|
+
public typealias AngularOutput = Float64
|
|
60
|
+
|
|
61
|
+
@inlinable @inline(__always)
|
|
62
|
+
public static func angular<A, B>(_ a: A, _ b: B) -> Float64?
|
|
63
|
+
where A: Sequence, B: Sequence, A.Element == Float64, B.Element == Float64 {
|
|
64
|
+
_nkWithDensePair(a, b) { ap, bp, n in
|
|
65
|
+
var result: Float64 = 0
|
|
66
|
+
nk_angular_f64(ap, bp, UInt64(n), &result)
|
|
67
|
+
return result
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
extension Float64: NumKongEuclidean {
|
|
73
|
+
public typealias EuclideanOutput = Float64
|
|
74
|
+
|
|
75
|
+
@inlinable @inline(__always)
|
|
76
|
+
public static func euclidean<A, B>(_ a: A, _ b: B) -> Float64?
|
|
77
|
+
where A: Sequence, B: Sequence, A.Element == Float64, B.Element == Float64 {
|
|
78
|
+
_nkWithDensePair(a, b) { ap, bp, n in
|
|
79
|
+
var result: Float64 = 0
|
|
80
|
+
nk_euclidean_f64(ap, bp, UInt64(n), &result)
|
|
81
|
+
return result
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
extension Float64: NumKongSqEuclidean {
|
|
87
|
+
public typealias SqEuclideanOutput = Float64
|
|
88
|
+
|
|
89
|
+
@inlinable @inline(__always)
|
|
90
|
+
public static func sqeuclidean<A, B>(_ a: A, _ b: B) -> Float64?
|
|
91
|
+
where A: Sequence, B: Sequence, A.Element == Float64, B.Element == Float64 {
|
|
92
|
+
_nkWithDensePair(a, b) { ap, bp, n in
|
|
93
|
+
var result: Float64 = 0
|
|
94
|
+
nk_sqeuclidean_f64(ap, bp, UInt64(n), &result)
|
|
95
|
+
return result
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
extension Float32: NumKongDot {
|
|
101
|
+
public typealias DotOutput = Float64
|
|
102
|
+
|
|
103
|
+
@inlinable @inline(__always)
|
|
104
|
+
public static func dot<A, B>(_ a: A, _ b: B) -> Float64?
|
|
105
|
+
where A: Sequence, B: Sequence, A.Element == Float32, B.Element == Float32 {
|
|
106
|
+
_nkWithDensePair(a, b) { ap, bp, n in
|
|
107
|
+
var result: Float64 = 0
|
|
108
|
+
nk_dot_f32(ap, bp, UInt64(n), &result)
|
|
109
|
+
return result
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
extension Float32: NumKongAngular {
|
|
115
|
+
public typealias AngularOutput = Float64
|
|
116
|
+
|
|
117
|
+
@inlinable @inline(__always)
|
|
118
|
+
public static func angular<A, B>(_ a: A, _ b: B) -> Float64?
|
|
119
|
+
where A: Sequence, B: Sequence, A.Element == Float32, B.Element == Float32 {
|
|
120
|
+
_nkWithDensePair(a, b) { ap, bp, n in
|
|
121
|
+
var result: Float64 = 0
|
|
122
|
+
nk_angular_f32(ap, bp, UInt64(n), &result)
|
|
123
|
+
return result
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
|
|
128
|
+
extension Float32: NumKongEuclidean {
|
|
129
|
+
public typealias EuclideanOutput = Float64
|
|
130
|
+
|
|
131
|
+
@inlinable @inline(__always)
|
|
132
|
+
public static func euclidean<A, B>(_ a: A, _ b: B) -> Float64?
|
|
133
|
+
where A: Sequence, B: Sequence, A.Element == Float32, B.Element == Float32 {
|
|
134
|
+
_nkWithDensePair(a, b) { ap, bp, n in
|
|
135
|
+
var result: Float64 = 0
|
|
136
|
+
nk_euclidean_f32(ap, bp, UInt64(n), &result)
|
|
137
|
+
return result
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
|
|
142
|
+
extension Float32: NumKongSqEuclidean {
|
|
143
|
+
public typealias SqEuclideanOutput = Float64
|
|
144
|
+
|
|
145
|
+
@inlinable @inline(__always)
|
|
146
|
+
public static func sqeuclidean<A, B>(_ a: A, _ b: B) -> Float64?
|
|
147
|
+
where A: Sequence, B: Sequence, A.Element == Float32, B.Element == Float32 {
|
|
148
|
+
_nkWithDensePair(a, b) { ap, bp, n in
|
|
149
|
+
var result: Float64 = 0
|
|
150
|
+
nk_sqeuclidean_f32(ap, bp, UInt64(n), &result)
|
|
151
|
+
return result
|
|
152
|
+
}
|
|
153
|
+
}
|
|
154
|
+
}
|
|
155
|
+
|
|
156
|
+
// Float16 is a type-level absence on x86_64 — the compiler rejects it before
|
|
157
|
+
// @available runtime checks apply, so we need a compile-time arch guard.
|
|
158
|
+
// See: https://github.com/unum-cloud/USearch/pull/739
|
|
159
|
+
#if !arch(x86_64)
|
|
160
|
+
@available(macOS 11.0, iOS 14.0, tvOS 14.0, watchOS 7.0, *)
|
|
161
|
+
extension Float16: NumKongDot {
|
|
162
|
+
public typealias DotOutput = Float32
|
|
163
|
+
|
|
164
|
+
@inlinable @inline(__always)
|
|
165
|
+
public static func dot<A, B>(_ a: A, _ b: B) -> Float32?
|
|
166
|
+
where A: Sequence, B: Sequence, A.Element == Float16, B.Element == Float16 {
|
|
167
|
+
_nkWithDensePair(a, b) { ap, bp, n in
|
|
168
|
+
let aPtr = UnsafeRawPointer(ap).assumingMemoryBound(to: nk_f16_t.self)
|
|
169
|
+
let bPtr = UnsafeRawPointer(bp).assumingMemoryBound(to: nk_f16_t.self)
|
|
170
|
+
var result: Float32 = 0
|
|
171
|
+
nk_dot_f16(aPtr, bPtr, UInt64(n), &result)
|
|
172
|
+
return result
|
|
173
|
+
}
|
|
174
|
+
}
|
|
175
|
+
}
|
|
176
|
+
|
|
177
|
+
@available(macOS 11.0, iOS 14.0, tvOS 14.0, watchOS 7.0, *)
|
|
178
|
+
extension Float16: NumKongAngular {
|
|
179
|
+
public typealias AngularOutput = Float32
|
|
180
|
+
|
|
181
|
+
@inlinable @inline(__always)
|
|
182
|
+
public static func angular<A, B>(_ a: A, _ b: B) -> Float32?
|
|
183
|
+
where A: Sequence, B: Sequence, A.Element == Float16, B.Element == Float16 {
|
|
184
|
+
_nkWithDensePair(a, b) { ap, bp, n in
|
|
185
|
+
let aPtr = UnsafeRawPointer(ap).assumingMemoryBound(to: nk_f16_t.self)
|
|
186
|
+
let bPtr = UnsafeRawPointer(bp).assumingMemoryBound(to: nk_f16_t.self)
|
|
187
|
+
var result: Float32 = 0
|
|
188
|
+
nk_angular_f16(aPtr, bPtr, UInt64(n), &result)
|
|
189
|
+
return result
|
|
190
|
+
}
|
|
191
|
+
}
|
|
192
|
+
}
|
|
193
|
+
|
|
194
|
+
@available(macOS 11.0, iOS 14.0, tvOS 14.0, watchOS 7.0, *)
|
|
195
|
+
extension Float16: NumKongEuclidean {
|
|
196
|
+
public typealias EuclideanOutput = Float32
|
|
197
|
+
|
|
198
|
+
@inlinable @inline(__always)
|
|
199
|
+
public static func euclidean<A, B>(_ a: A, _ b: B) -> Float32?
|
|
200
|
+
where A: Sequence, B: Sequence, A.Element == Float16, B.Element == Float16 {
|
|
201
|
+
_nkWithDensePair(a, b) { ap, bp, n in
|
|
202
|
+
let aPtr = UnsafeRawPointer(ap).assumingMemoryBound(to: nk_f16_t.self)
|
|
203
|
+
let bPtr = UnsafeRawPointer(bp).assumingMemoryBound(to: nk_f16_t.self)
|
|
204
|
+
var result: Float32 = 0
|
|
205
|
+
nk_euclidean_f16(aPtr, bPtr, UInt64(n), &result)
|
|
206
|
+
return result
|
|
207
|
+
}
|
|
208
|
+
}
|
|
209
|
+
}
|
|
210
|
+
|
|
211
|
+
@available(macOS 11.0, iOS 14.0, tvOS 14.0, watchOS 7.0, *)
|
|
212
|
+
extension Float16: NumKongSqEuclidean {
|
|
213
|
+
public typealias SqEuclideanOutput = Float32
|
|
214
|
+
|
|
215
|
+
@inlinable @inline(__always)
|
|
216
|
+
public static func sqeuclidean<A, B>(_ a: A, _ b: B) -> Float32?
|
|
217
|
+
where A: Sequence, B: Sequence, A.Element == Float16, B.Element == Float16 {
|
|
218
|
+
_nkWithDensePair(a, b) { ap, bp, n in
|
|
219
|
+
let aPtr = UnsafeRawPointer(ap).assumingMemoryBound(to: nk_f16_t.self)
|
|
220
|
+
let bPtr = UnsafeRawPointer(bp).assumingMemoryBound(to: nk_f16_t.self)
|
|
221
|
+
var result: Float32 = 0
|
|
222
|
+
nk_sqeuclidean_f16(aPtr, bPtr, UInt64(n), &result)
|
|
223
|
+
return result
|
|
224
|
+
}
|
|
225
|
+
}
|
|
226
|
+
}
|
|
227
|
+
#endif // !arch(x86_64)
|
|
228
|
+
|
|
229
|
+
extension Int8: NumKongDot {
|
|
230
|
+
public typealias DotOutput = Int32
|
|
231
|
+
|
|
232
|
+
@inlinable @inline(__always)
|
|
233
|
+
public static func dot<A, B>(_ a: A, _ b: B) -> Int32?
|
|
234
|
+
where A: Sequence, B: Sequence, A.Element == Int8, B.Element == Int8 {
|
|
235
|
+
_nkWithDensePair(a, b) { ap, bp, n in
|
|
236
|
+
var result: Int32 = 0
|
|
237
|
+
nk_dot_i8(ap, bp, UInt64(n), &result)
|
|
238
|
+
return result
|
|
239
|
+
}
|
|
240
|
+
}
|
|
241
|
+
}
|
|
242
|
+
|
|
243
|
+
extension Int8: NumKongAngular {
|
|
244
|
+
public typealias AngularOutput = Float32
|
|
245
|
+
|
|
246
|
+
@inlinable @inline(__always)
|
|
247
|
+
public static func angular<A, B>(_ a: A, _ b: B) -> Float32?
|
|
248
|
+
where A: Sequence, B: Sequence, A.Element == Int8, B.Element == Int8 {
|
|
249
|
+
_nkWithDensePair(a, b) { ap, bp, n in
|
|
250
|
+
var result: Float32 = 0
|
|
251
|
+
nk_angular_i8(ap, bp, UInt64(n), &result)
|
|
252
|
+
return result
|
|
253
|
+
}
|
|
254
|
+
}
|
|
255
|
+
}
|
|
256
|
+
|
|
257
|
+
extension Int8: NumKongEuclidean {
|
|
258
|
+
public typealias EuclideanOutput = Float32
|
|
259
|
+
|
|
260
|
+
@inlinable @inline(__always)
|
|
261
|
+
public static func euclidean<A, B>(_ a: A, _ b: B) -> Float32?
|
|
262
|
+
where A: Sequence, B: Sequence, A.Element == Int8, B.Element == Int8 {
|
|
263
|
+
_nkWithDensePair(a, b) { ap, bp, n in
|
|
264
|
+
var result: Float32 = 0
|
|
265
|
+
nk_euclidean_i8(ap, bp, UInt64(n), &result)
|
|
266
|
+
return result
|
|
267
|
+
}
|
|
268
|
+
}
|
|
269
|
+
}
|
|
270
|
+
|
|
271
|
+
extension Int8: NumKongSqEuclidean {
|
|
272
|
+
public typealias SqEuclideanOutput = UInt32
|
|
273
|
+
|
|
274
|
+
@inlinable @inline(__always)
|
|
275
|
+
public static func sqeuclidean<A, B>(_ a: A, _ b: B) -> UInt32?
|
|
276
|
+
where A: Sequence, B: Sequence, A.Element == Int8, B.Element == Int8 {
|
|
277
|
+
_nkWithDensePair(a, b) { ap, bp, n in
|
|
278
|
+
var result: UInt32 = 0
|
|
279
|
+
nk_sqeuclidean_i8(ap, bp, UInt64(n), &result)
|
|
280
|
+
return result
|
|
281
|
+
}
|
|
282
|
+
}
|
|
283
|
+
}
|
|
284
|
+
|
|
285
|
+
extension UInt8: NumKongDot {
|
|
286
|
+
public typealias DotOutput = UInt32
|
|
287
|
+
|
|
288
|
+
@inlinable @inline(__always)
|
|
289
|
+
public static func dot<A, B>(_ a: A, _ b: B) -> UInt32?
|
|
290
|
+
where A: Sequence, B: Sequence, A.Element == UInt8, B.Element == UInt8 {
|
|
291
|
+
_nkWithDensePair(a, b) { ap, bp, n in
|
|
292
|
+
var result: UInt32 = 0
|
|
293
|
+
nk_dot_u8(ap, bp, UInt64(n), &result)
|
|
294
|
+
return result
|
|
295
|
+
}
|
|
296
|
+
}
|
|
297
|
+
}
|
|
298
|
+
|
|
299
|
+
extension UInt8: NumKongAngular {
|
|
300
|
+
public typealias AngularOutput = Float32
|
|
301
|
+
|
|
302
|
+
@inlinable @inline(__always)
|
|
303
|
+
public static func angular<A, B>(_ a: A, _ b: B) -> Float32?
|
|
304
|
+
where A: Sequence, B: Sequence, A.Element == UInt8, B.Element == UInt8 {
|
|
305
|
+
_nkWithDensePair(a, b) { ap, bp, n in
|
|
306
|
+
var result: Float32 = 0
|
|
307
|
+
nk_angular_u8(ap, bp, UInt64(n), &result)
|
|
308
|
+
return result
|
|
309
|
+
}
|
|
310
|
+
}
|
|
311
|
+
}
|
|
312
|
+
|
|
313
|
+
extension UInt8: NumKongEuclidean {
|
|
314
|
+
public typealias EuclideanOutput = Float32
|
|
315
|
+
|
|
316
|
+
@inlinable @inline(__always)
|
|
317
|
+
public static func euclidean<A, B>(_ a: A, _ b: B) -> Float32?
|
|
318
|
+
where A: Sequence, B: Sequence, A.Element == UInt8, B.Element == UInt8 {
|
|
319
|
+
_nkWithDensePair(a, b) { ap, bp, n in
|
|
320
|
+
var result: Float32 = 0
|
|
321
|
+
nk_euclidean_u8(ap, bp, UInt64(n), &result)
|
|
322
|
+
return result
|
|
323
|
+
}
|
|
324
|
+
}
|
|
325
|
+
}
|
|
326
|
+
|
|
327
|
+
extension UInt8: NumKongSqEuclidean {
|
|
328
|
+
public typealias SqEuclideanOutput = UInt32
|
|
329
|
+
|
|
330
|
+
@inlinable @inline(__always)
|
|
331
|
+
public static func sqeuclidean<A, B>(_ a: A, _ b: B) -> UInt32?
|
|
332
|
+
where A: Sequence, B: Sequence, A.Element == UInt8, B.Element == UInt8 {
|
|
333
|
+
_nkWithDensePair(a, b) { ap, bp, n in
|
|
334
|
+
var result: UInt32 = 0
|
|
335
|
+
nk_sqeuclidean_u8(ap, bp, UInt64(n), &result)
|
|
336
|
+
return result
|
|
337
|
+
}
|
|
338
|
+
}
|
|
339
|
+
}
|
|
340
|
+
|
|
341
|
+
// MARK: - Minifloat Scalars
|
|
342
|
+
|
|
343
|
+
extension BFloat16: NumKongDot {
|
|
344
|
+
public typealias DotOutput = Float32
|
|
345
|
+
|
|
346
|
+
@inlinable @inline(__always)
|
|
347
|
+
public static func dot<A, B>(_ a: A, _ b: B) -> Float32?
|
|
348
|
+
where A: Sequence, B: Sequence, A.Element == BFloat16, B.Element == BFloat16 {
|
|
349
|
+
_nkWithDensePairRebound(a, b, to: nk_bf16_t.self) { ap, bp, n in
|
|
350
|
+
var result: Float32 = 0
|
|
351
|
+
nk_dot_bf16(ap, bp, UInt64(n), &result)
|
|
352
|
+
return result
|
|
353
|
+
}
|
|
354
|
+
}
|
|
355
|
+
}
|
|
356
|
+
|
|
357
|
+
extension BFloat16: NumKongAngular {
|
|
358
|
+
public typealias AngularOutput = Float32
|
|
359
|
+
|
|
360
|
+
@inlinable @inline(__always)
|
|
361
|
+
public static func angular<A, B>(_ a: A, _ b: B) -> Float32?
|
|
362
|
+
where A: Sequence, B: Sequence, A.Element == BFloat16, B.Element == BFloat16 {
|
|
363
|
+
_nkWithDensePairRebound(a, b, to: nk_bf16_t.self) { ap, bp, n in
|
|
364
|
+
var result: Float32 = 0
|
|
365
|
+
nk_angular_bf16(ap, bp, UInt64(n), &result)
|
|
366
|
+
return result
|
|
367
|
+
}
|
|
368
|
+
}
|
|
369
|
+
}
|
|
370
|
+
|
|
371
|
+
extension BFloat16: NumKongEuclidean {
|
|
372
|
+
public typealias EuclideanOutput = Float32
|
|
373
|
+
|
|
374
|
+
@inlinable @inline(__always)
|
|
375
|
+
public static func euclidean<A, B>(_ a: A, _ b: B) -> Float32?
|
|
376
|
+
where A: Sequence, B: Sequence, A.Element == BFloat16, B.Element == BFloat16 {
|
|
377
|
+
_nkWithDensePairRebound(a, b, to: nk_bf16_t.self) { ap, bp, n in
|
|
378
|
+
var result: Float32 = 0
|
|
379
|
+
nk_euclidean_bf16(ap, bp, UInt64(n), &result)
|
|
380
|
+
return result
|
|
381
|
+
}
|
|
382
|
+
}
|
|
383
|
+
}
|
|
384
|
+
|
|
385
|
+
extension BFloat16: NumKongSqEuclidean {
|
|
386
|
+
public typealias SqEuclideanOutput = Float32
|
|
387
|
+
|
|
388
|
+
@inlinable @inline(__always)
|
|
389
|
+
public static func sqeuclidean<A, B>(_ a: A, _ b: B) -> Float32?
|
|
390
|
+
where A: Sequence, B: Sequence, A.Element == BFloat16, B.Element == BFloat16 {
|
|
391
|
+
_nkWithDensePairRebound(a, b, to: nk_bf16_t.self) { ap, bp, n in
|
|
392
|
+
var result: Float32 = 0
|
|
393
|
+
nk_sqeuclidean_bf16(ap, bp, UInt64(n), &result)
|
|
394
|
+
return result
|
|
395
|
+
}
|
|
396
|
+
}
|
|
397
|
+
}
|
|
398
|
+
|
|
399
|
+
extension E4M3: NumKongDot {
|
|
400
|
+
public typealias DotOutput = Float32
|
|
401
|
+
|
|
402
|
+
@inlinable @inline(__always)
|
|
403
|
+
public static func dot<A, B>(_ a: A, _ b: B) -> Float32?
|
|
404
|
+
where A: Sequence, B: Sequence, A.Element == E4M3, B.Element == E4M3 {
|
|
405
|
+
_nkWithDensePairRebound(a, b, to: nk_e4m3_t.self) { ap, bp, n in
|
|
406
|
+
var result: Float32 = 0
|
|
407
|
+
nk_dot_e4m3(ap, bp, UInt64(n), &result)
|
|
408
|
+
return result
|
|
409
|
+
}
|
|
410
|
+
}
|
|
411
|
+
}
|
|
412
|
+
|
|
413
|
+
extension E4M3: NumKongAngular {
|
|
414
|
+
public typealias AngularOutput = Float32
|
|
415
|
+
|
|
416
|
+
@inlinable @inline(__always)
|
|
417
|
+
public static func angular<A, B>(_ a: A, _ b: B) -> Float32?
|
|
418
|
+
where A: Sequence, B: Sequence, A.Element == E4M3, B.Element == E4M3 {
|
|
419
|
+
_nkWithDensePairRebound(a, b, to: nk_e4m3_t.self) { ap, bp, n in
|
|
420
|
+
var result: Float32 = 0
|
|
421
|
+
nk_angular_e4m3(ap, bp, UInt64(n), &result)
|
|
422
|
+
return result
|
|
423
|
+
}
|
|
424
|
+
}
|
|
425
|
+
}
|
|
426
|
+
|
|
427
|
+
extension E4M3: NumKongEuclidean {
|
|
428
|
+
public typealias EuclideanOutput = Float32
|
|
429
|
+
|
|
430
|
+
@inlinable @inline(__always)
|
|
431
|
+
public static func euclidean<A, B>(_ a: A, _ b: B) -> Float32?
|
|
432
|
+
where A: Sequence, B: Sequence, A.Element == E4M3, B.Element == E4M3 {
|
|
433
|
+
_nkWithDensePairRebound(a, b, to: nk_e4m3_t.self) { ap, bp, n in
|
|
434
|
+
var result: Float32 = 0
|
|
435
|
+
nk_euclidean_e4m3(ap, bp, UInt64(n), &result)
|
|
436
|
+
return result
|
|
437
|
+
}
|
|
438
|
+
}
|
|
439
|
+
}
|
|
440
|
+
|
|
441
|
+
extension E4M3: NumKongSqEuclidean {
|
|
442
|
+
public typealias SqEuclideanOutput = Float32
|
|
443
|
+
|
|
444
|
+
@inlinable @inline(__always)
|
|
445
|
+
public static func sqeuclidean<A, B>(_ a: A, _ b: B) -> Float32?
|
|
446
|
+
where A: Sequence, B: Sequence, A.Element == E4M3, B.Element == E4M3 {
|
|
447
|
+
_nkWithDensePairRebound(a, b, to: nk_e4m3_t.self) { ap, bp, n in
|
|
448
|
+
var result: Float32 = 0
|
|
449
|
+
nk_sqeuclidean_e4m3(ap, bp, UInt64(n), &result)
|
|
450
|
+
return result
|
|
451
|
+
}
|
|
452
|
+
}
|
|
453
|
+
}
|
|
454
|
+
|
|
455
|
+
extension E5M2: NumKongDot {
|
|
456
|
+
public typealias DotOutput = Float32
|
|
457
|
+
|
|
458
|
+
@inlinable @inline(__always)
|
|
459
|
+
public static func dot<A, B>(_ a: A, _ b: B) -> Float32?
|
|
460
|
+
where A: Sequence, B: Sequence, A.Element == E5M2, B.Element == E5M2 {
|
|
461
|
+
_nkWithDensePairRebound(a, b, to: nk_e5m2_t.self) { ap, bp, n in
|
|
462
|
+
var result: Float32 = 0
|
|
463
|
+
nk_dot_e5m2(ap, bp, UInt64(n), &result)
|
|
464
|
+
return result
|
|
465
|
+
}
|
|
466
|
+
}
|
|
467
|
+
}
|
|
468
|
+
|
|
469
|
+
extension E5M2: NumKongAngular {
|
|
470
|
+
public typealias AngularOutput = Float32
|
|
471
|
+
|
|
472
|
+
@inlinable @inline(__always)
|
|
473
|
+
public static func angular<A, B>(_ a: A, _ b: B) -> Float32?
|
|
474
|
+
where A: Sequence, B: Sequence, A.Element == E5M2, B.Element == E5M2 {
|
|
475
|
+
_nkWithDensePairRebound(a, b, to: nk_e5m2_t.self) { ap, bp, n in
|
|
476
|
+
var result: Float32 = 0
|
|
477
|
+
nk_angular_e5m2(ap, bp, UInt64(n), &result)
|
|
478
|
+
return result
|
|
479
|
+
}
|
|
480
|
+
}
|
|
481
|
+
}
|
|
482
|
+
|
|
483
|
+
extension E5M2: NumKongEuclidean {
|
|
484
|
+
public typealias EuclideanOutput = Float32
|
|
485
|
+
|
|
486
|
+
@inlinable @inline(__always)
|
|
487
|
+
public static func euclidean<A, B>(_ a: A, _ b: B) -> Float32?
|
|
488
|
+
where A: Sequence, B: Sequence, A.Element == E5M2, B.Element == E5M2 {
|
|
489
|
+
_nkWithDensePairRebound(a, b, to: nk_e5m2_t.self) { ap, bp, n in
|
|
490
|
+
var result: Float32 = 0
|
|
491
|
+
nk_euclidean_e5m2(ap, bp, UInt64(n), &result)
|
|
492
|
+
return result
|
|
493
|
+
}
|
|
494
|
+
}
|
|
495
|
+
}
|
|
496
|
+
|
|
497
|
+
extension E5M2: NumKongSqEuclidean {
|
|
498
|
+
public typealias SqEuclideanOutput = Float32
|
|
499
|
+
|
|
500
|
+
@inlinable @inline(__always)
|
|
501
|
+
public static func sqeuclidean<A, B>(_ a: A, _ b: B) -> Float32?
|
|
502
|
+
where A: Sequence, B: Sequence, A.Element == E5M2, B.Element == E5M2 {
|
|
503
|
+
_nkWithDensePairRebound(a, b, to: nk_e5m2_t.self) { ap, bp, n in
|
|
504
|
+
var result: Float32 = 0
|
|
505
|
+
nk_sqeuclidean_e5m2(ap, bp, UInt64(n), &result)
|
|
506
|
+
return result
|
|
507
|
+
}
|
|
508
|
+
}
|
|
509
|
+
}
|
|
510
|
+
|
|
511
|
+
extension E2M3: NumKongDot {
|
|
512
|
+
public typealias DotOutput = Float32
|
|
513
|
+
|
|
514
|
+
@inlinable @inline(__always)
|
|
515
|
+
public static func dot<A, B>(_ a: A, _ b: B) -> Float32?
|
|
516
|
+
where A: Sequence, B: Sequence, A.Element == E2M3, B.Element == E2M3 {
|
|
517
|
+
_nkWithDensePairRebound(a, b, to: nk_e2m3_t.self) { ap, bp, n in
|
|
518
|
+
var result: Float32 = 0
|
|
519
|
+
nk_dot_e2m3(ap, bp, UInt64(n), &result)
|
|
520
|
+
return result
|
|
521
|
+
}
|
|
522
|
+
}
|
|
523
|
+
}
|
|
524
|
+
|
|
525
|
+
extension E2M3: NumKongAngular {
|
|
526
|
+
public typealias AngularOutput = Float32
|
|
527
|
+
|
|
528
|
+
@inlinable @inline(__always)
|
|
529
|
+
public static func angular<A, B>(_ a: A, _ b: B) -> Float32?
|
|
530
|
+
where A: Sequence, B: Sequence, A.Element == E2M3, B.Element == E2M3 {
|
|
531
|
+
_nkWithDensePairRebound(a, b, to: nk_e2m3_t.self) { ap, bp, n in
|
|
532
|
+
var result: Float32 = 0
|
|
533
|
+
nk_angular_e2m3(ap, bp, UInt64(n), &result)
|
|
534
|
+
return result
|
|
535
|
+
}
|
|
536
|
+
}
|
|
537
|
+
}
|
|
538
|
+
|
|
539
|
+
extension E2M3: NumKongEuclidean {
|
|
540
|
+
public typealias EuclideanOutput = Float32
|
|
541
|
+
|
|
542
|
+
@inlinable @inline(__always)
|
|
543
|
+
public static func euclidean<A, B>(_ a: A, _ b: B) -> Float32?
|
|
544
|
+
where A: Sequence, B: Sequence, A.Element == E2M3, B.Element == E2M3 {
|
|
545
|
+
_nkWithDensePairRebound(a, b, to: nk_e2m3_t.self) { ap, bp, n in
|
|
546
|
+
var result: Float32 = 0
|
|
547
|
+
nk_euclidean_e2m3(ap, bp, UInt64(n), &result)
|
|
548
|
+
return result
|
|
549
|
+
}
|
|
550
|
+
}
|
|
551
|
+
}
|
|
552
|
+
|
|
553
|
+
extension E2M3: NumKongSqEuclidean {
|
|
554
|
+
public typealias SqEuclideanOutput = Float32
|
|
555
|
+
|
|
556
|
+
@inlinable @inline(__always)
|
|
557
|
+
public static func sqeuclidean<A, B>(_ a: A, _ b: B) -> Float32?
|
|
558
|
+
where A: Sequence, B: Sequence, A.Element == E2M3, B.Element == E2M3 {
|
|
559
|
+
_nkWithDensePairRebound(a, b, to: nk_e2m3_t.self) { ap, bp, n in
|
|
560
|
+
var result: Float32 = 0
|
|
561
|
+
nk_sqeuclidean_e2m3(ap, bp, UInt64(n), &result)
|
|
562
|
+
return result
|
|
563
|
+
}
|
|
564
|
+
}
|
|
565
|
+
}
|
|
566
|
+
|
|
567
|
+
extension E3M2: NumKongDot {
|
|
568
|
+
public typealias DotOutput = Float32
|
|
569
|
+
|
|
570
|
+
@inlinable @inline(__always)
|
|
571
|
+
public static func dot<A, B>(_ a: A, _ b: B) -> Float32?
|
|
572
|
+
where A: Sequence, B: Sequence, A.Element == E3M2, B.Element == E3M2 {
|
|
573
|
+
_nkWithDensePairRebound(a, b, to: nk_e3m2_t.self) { ap, bp, n in
|
|
574
|
+
var result: Float32 = 0
|
|
575
|
+
nk_dot_e3m2(ap, bp, UInt64(n), &result)
|
|
576
|
+
return result
|
|
577
|
+
}
|
|
578
|
+
}
|
|
579
|
+
}
|
|
580
|
+
|
|
581
|
+
extension E3M2: NumKongAngular {
|
|
582
|
+
public typealias AngularOutput = Float32
|
|
583
|
+
|
|
584
|
+
@inlinable @inline(__always)
|
|
585
|
+
public static func angular<A, B>(_ a: A, _ b: B) -> Float32?
|
|
586
|
+
where A: Sequence, B: Sequence, A.Element == E3M2, B.Element == E3M2 {
|
|
587
|
+
_nkWithDensePairRebound(a, b, to: nk_e3m2_t.self) { ap, bp, n in
|
|
588
|
+
var result: Float32 = 0
|
|
589
|
+
nk_angular_e3m2(ap, bp, UInt64(n), &result)
|
|
590
|
+
return result
|
|
591
|
+
}
|
|
592
|
+
}
|
|
593
|
+
}
|
|
594
|
+
|
|
595
|
+
extension E3M2: NumKongEuclidean {
|
|
596
|
+
public typealias EuclideanOutput = Float32
|
|
597
|
+
|
|
598
|
+
@inlinable @inline(__always)
|
|
599
|
+
public static func euclidean<A, B>(_ a: A, _ b: B) -> Float32?
|
|
600
|
+
where A: Sequence, B: Sequence, A.Element == E3M2, B.Element == E3M2 {
|
|
601
|
+
_nkWithDensePairRebound(a, b, to: nk_e3m2_t.self) { ap, bp, n in
|
|
602
|
+
var result: Float32 = 0
|
|
603
|
+
nk_euclidean_e3m2(ap, bp, UInt64(n), &result)
|
|
604
|
+
return result
|
|
605
|
+
}
|
|
606
|
+
}
|
|
607
|
+
}
|
|
608
|
+
|
|
609
|
+
extension E3M2: NumKongSqEuclidean {
|
|
610
|
+
public typealias SqEuclideanOutput = Float32
|
|
611
|
+
|
|
612
|
+
@inlinable @inline(__always)
|
|
613
|
+
public static func sqeuclidean<A, B>(_ a: A, _ b: B) -> Float32?
|
|
614
|
+
where A: Sequence, B: Sequence, A.Element == E3M2, B.Element == E3M2 {
|
|
615
|
+
_nkWithDensePairRebound(a, b, to: nk_e3m2_t.self) { ap, bp, n in
|
|
616
|
+
var result: Float32 = 0
|
|
617
|
+
nk_sqeuclidean_e3m2(ap, bp, UInt64(n), &result)
|
|
618
|
+
return result
|
|
619
|
+
}
|
|
620
|
+
}
|
|
621
|
+
}
|
|
622
|
+
|
|
623
|
+
// MARK: - U1x8 Dot
|
|
624
|
+
|
|
625
|
+
extension U1x8: NumKongDot {
|
|
626
|
+
public typealias DotOutput = UInt32
|
|
627
|
+
|
|
628
|
+
@inlinable @inline(__always)
|
|
629
|
+
public static func dot<A, B>(_ a: A, _ b: B) -> UInt32?
|
|
630
|
+
where A: Sequence, B: Sequence, A.Element == U1x8, B.Element == U1x8 {
|
|
631
|
+
_nkWithDensePair(a, b) { ap, bp, n in
|
|
632
|
+
let aPtr = UnsafeRawPointer(ap).assumingMemoryBound(to: nk_u1x8_t.self)
|
|
633
|
+
let bPtr = UnsafeRawPointer(bp).assumingMemoryBound(to: nk_u1x8_t.self)
|
|
634
|
+
var result: UInt32 = 0
|
|
635
|
+
nk_dot_u1(aPtr, bPtr, UInt64(n * 8), &result)
|
|
636
|
+
return result
|
|
637
|
+
}
|
|
638
|
+
}
|
|
639
|
+
}
|
|
640
|
+
|
|
641
|
+
// MARK: - Set Protocols
|
|
642
|
+
|
|
643
|
+
/// A type that can compute SIMD-accelerated Hamming distances over bit sets.
|
|
644
|
+
public protocol NumKongHamming {
|
|
645
|
+
associatedtype HammingOutput
|
|
646
|
+
static func hamming<A, B>(_ a: A, _ b: B) -> HammingOutput?
|
|
647
|
+
where A: Sequence, B: Sequence, A.Element == Self, B.Element == Self
|
|
648
|
+
}
|
|
649
|
+
|
|
650
|
+
/// A type that can compute SIMD-accelerated Jaccard distances over bit sets.
|
|
651
|
+
public protocol NumKongJaccard {
|
|
652
|
+
associatedtype JaccardOutput
|
|
653
|
+
static func jaccard<A, B>(_ a: A, _ b: B) -> JaccardOutput?
|
|
654
|
+
where A: Sequence, B: Sequence, A.Element == Self, B.Element == Self
|
|
655
|
+
}
|
|
656
|
+
|
|
657
|
+
// MARK: - U1x8 Sets
|
|
658
|
+
|
|
659
|
+
extension U1x8: NumKongHamming {
|
|
660
|
+
@inlinable @inline(__always)
|
|
661
|
+
public static func hamming<A, B>(_ a: A, _ b: B) -> UInt32?
|
|
662
|
+
where A: Sequence, B: Sequence, A.Element == U1x8, B.Element == U1x8 {
|
|
663
|
+
_nkWithDensePair(a, b) { ap, bp, n in
|
|
664
|
+
let aPtr = UnsafeRawPointer(ap).assumingMemoryBound(to: nk_u1x8_t.self)
|
|
665
|
+
let bPtr = UnsafeRawPointer(bp).assumingMemoryBound(to: nk_u1x8_t.self)
|
|
666
|
+
var result: UInt32 = 0
|
|
667
|
+
nk_hamming_u1(aPtr, bPtr, UInt64(n * 8), &result)
|
|
668
|
+
return result
|
|
669
|
+
}
|
|
670
|
+
}
|
|
671
|
+
}
|
|
672
|
+
|
|
673
|
+
extension U1x8: NumKongJaccard {
|
|
674
|
+
@inlinable @inline(__always)
|
|
675
|
+
public static func jaccard<A, B>(_ a: A, _ b: B) -> Float32?
|
|
676
|
+
where A: Sequence, B: Sequence, A.Element == U1x8, B.Element == U1x8 {
|
|
677
|
+
_nkWithDensePair(a, b) { ap, bp, n in
|
|
678
|
+
let aPtr = UnsafeRawPointer(ap).assumingMemoryBound(to: nk_u1x8_t.self)
|
|
679
|
+
let bPtr = UnsafeRawPointer(bp).assumingMemoryBound(to: nk_u1x8_t.self)
|
|
680
|
+
var result: Float32 = 0
|
|
681
|
+
nk_jaccard_u1(aPtr, bPtr, UInt64(n * 8), &result)
|
|
682
|
+
return result
|
|
683
|
+
}
|
|
684
|
+
}
|
|
685
|
+
}
|
|
686
|
+
|
|
687
|
+
// MARK: - Collection Extensions
|
|
688
|
+
|
|
689
|
+
extension RandomAccessCollection where Element: NumKongDot {
|
|
690
|
+
/// Computes the SIMD-accelerated dot product with another sequence.
|
|
691
|
+
@inlinable @inline(__always)
|
|
692
|
+
public func dot<B>(_ b: B) -> Element.DotOutput?
|
|
693
|
+
where B: Sequence, B.Element == Element {
|
|
694
|
+
Element.dot(self, b)
|
|
695
|
+
}
|
|
696
|
+
}
|
|
697
|
+
|
|
698
|
+
extension RandomAccessCollection where Element: NumKongAngular {
|
|
699
|
+
/// Computes the SIMD-accelerated angular (cosine) distance to another sequence.
|
|
700
|
+
@inlinable @inline(__always)
|
|
701
|
+
public func angular<B>(_ b: B) -> Element.AngularOutput?
|
|
702
|
+
where B: Sequence, B.Element == Element {
|
|
703
|
+
Element.angular(self, b)
|
|
704
|
+
}
|
|
705
|
+
}
|
|
706
|
+
|
|
707
|
+
extension RandomAccessCollection where Element: NumKongEuclidean {
|
|
708
|
+
/// Computes the SIMD-accelerated Euclidean distance to another sequence.
|
|
709
|
+
@inlinable @inline(__always)
|
|
710
|
+
public func euclidean<B>(_ b: B) -> Element.EuclideanOutput?
|
|
711
|
+
where B: Sequence, B.Element == Element {
|
|
712
|
+
Element.euclidean(self, b)
|
|
713
|
+
}
|
|
714
|
+
}
|
|
715
|
+
|
|
716
|
+
extension RandomAccessCollection where Element: NumKongSqEuclidean {
|
|
717
|
+
/// Computes the SIMD-accelerated squared Euclidean distance to another sequence.
|
|
718
|
+
@inlinable @inline(__always)
|
|
719
|
+
public func sqeuclidean<B>(_ b: B) -> Element.SqEuclideanOutput?
|
|
720
|
+
where B: Sequence, B.Element == Element {
|
|
721
|
+
Element.sqeuclidean(self, b)
|
|
722
|
+
}
|
|
723
|
+
}
|
|
724
|
+
|
|
725
|
+
extension RandomAccessCollection where Element: NumKongHamming {
|
|
726
|
+
/// Computes the SIMD-accelerated Hamming distance to another sequence.
|
|
727
|
+
@inlinable @inline(__always)
|
|
728
|
+
public func hamming<B>(_ b: B) -> Element.HammingOutput?
|
|
729
|
+
where B: Sequence, B.Element == Element {
|
|
730
|
+
Element.hamming(self, b)
|
|
731
|
+
}
|
|
732
|
+
}
|
|
733
|
+
|
|
734
|
+
extension RandomAccessCollection where Element: NumKongJaccard {
|
|
735
|
+
/// Computes the SIMD-accelerated Jaccard distance to another sequence.
|
|
736
|
+
@inlinable @inline(__always)
|
|
737
|
+
public func jaccard<B>(_ b: B) -> Element.JaccardOutput?
|
|
738
|
+
where B: Sequence, B.Element == Element {
|
|
739
|
+
Element.jaccard(self, b)
|
|
740
|
+
}
|
|
741
|
+
}
|