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,96 @@
|
|
|
1
|
+
//! Runtime CPU capability detection.
|
|
2
|
+
//!
|
|
3
|
+
//! Capability bits (`cap::*`) are probed at library load time by examining
|
|
4
|
+
//! CPUID / `getauxval` / HWCAP records on the host CPU; [`available`] returns the
|
|
5
|
+
//! resulting bitmask so downstream code can select the best kernel without
|
|
6
|
+
//! recompiling.
|
|
7
|
+
//!
|
|
8
|
+
//! This module provides:
|
|
9
|
+
//!
|
|
10
|
+
//! - [`available`]: Query the bitmask of supported SIMD instruction sets
|
|
11
|
+
//! - [`configure_thread`]: Enable optimal SIMD settings for the current thread
|
|
12
|
+
//! - [`uses_dynamic_dispatch`]: Check if the library selects kernels at runtime
|
|
13
|
+
//! - [`cap`]: Constants for individual capability bits (NEON, SKYLAKE, etc.)
|
|
14
|
+
|
|
15
|
+
#[link(name = "numkong")]
|
|
16
|
+
extern "C" {
|
|
17
|
+
fn nk_configure_thread(capabilities: u64) -> i32;
|
|
18
|
+
fn nk_uses_dynamic_dispatch() -> i32;
|
|
19
|
+
fn nk_capabilities() -> u64;
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
/// Returns the bitmask of available CPU capabilities.
|
|
23
|
+
/// Use with `cap::*` constants to check for specific features.
|
|
24
|
+
///
|
|
25
|
+
/// # Example
|
|
26
|
+
/// ```
|
|
27
|
+
/// use numkong::{capabilities, cap};
|
|
28
|
+
///
|
|
29
|
+
/// let caps = capabilities::available();
|
|
30
|
+
/// if caps & cap::NEON != 0 {
|
|
31
|
+
/// println!("NEON is available");
|
|
32
|
+
/// }
|
|
33
|
+
/// if caps & cap::SKYLAKE != 0 {
|
|
34
|
+
/// println!("AVX-512 (Skylake) is available");
|
|
35
|
+
/// }
|
|
36
|
+
/// ```
|
|
37
|
+
pub fn available() -> u64 {
|
|
38
|
+
unsafe { nk_capabilities() }
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
/// Configures the current thread for optimal SIMD performance.
|
|
42
|
+
/// On x86, this enables AMX tile state via `arch_prctl`. On other platforms this is a no-op.
|
|
43
|
+
/// Must be called once per thread before using AMX (Advanced Matrix Extensions) operations.
|
|
44
|
+
pub fn configure_thread() -> bool {
|
|
45
|
+
// Pass !0 to enable all capabilities including AMX
|
|
46
|
+
unsafe { nk_configure_thread(!0) != 0 }
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
/// Returns `true` if the library uses dynamic dispatch for function selection.
|
|
50
|
+
pub fn uses_dynamic_dispatch() -> bool {
|
|
51
|
+
unsafe { nk_uses_dynamic_dispatch() != 0 }
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
/// Capability bit masks in chronological order (by first commercial silicon).
|
|
55
|
+
pub mod cap {
|
|
56
|
+
pub const SERIAL: u64 = 1 << 0; // Always: Fallback
|
|
57
|
+
pub const NEON: u64 = 1 << 1; // ARM NEON
|
|
58
|
+
pub const HASWELL: u64 = 1 << 2; // Intel AVX2
|
|
59
|
+
pub const SKYLAKE: u64 = 1 << 3; // Intel AVX-512
|
|
60
|
+
pub const NEONHALF: u64 = 1 << 4; // ARM NEON FP16
|
|
61
|
+
pub const NEONSDOT: u64 = 1 << 5; // ARM NEON i8 dot
|
|
62
|
+
pub const NEONFHM: u64 = 1 << 6; // ARM NEON FP16 FML
|
|
63
|
+
pub const ICELAKE: u64 = 1 << 7; // Intel AVX-512 VNNI
|
|
64
|
+
pub const GENOA: u64 = 1 << 8; // AMD AVX-512 BF16
|
|
65
|
+
pub const NEONBFDOT: u64 = 1 << 9; // ARM NEON BF16
|
|
66
|
+
pub const SVE: u64 = 1 << 10; // ARM SVE
|
|
67
|
+
pub const SVEHALF: u64 = 1 << 11; // ARM SVE FP16
|
|
68
|
+
pub const SVESDOT: u64 = 1 << 12; // ARM SVE i8 dot
|
|
69
|
+
pub const ALDER: u64 = 1 << 13; // Intel AVX2+VNNI
|
|
70
|
+
pub const SVEBFDOT: u64 = 1 << 14; // ARM SVE BF16
|
|
71
|
+
pub const SVE2: u64 = 1 << 15; // ARM SVE2
|
|
72
|
+
pub const V128RELAXED: u64 = 1 << 16; // WASM Relaxed SIMD
|
|
73
|
+
pub const SAPPHIRE: u64 = 1 << 17; // Intel AVX-512 FP16
|
|
74
|
+
pub const SAPPHIREAMX: u64 = 1 << 18; // Intel Sapphire AMX
|
|
75
|
+
pub const RVV: u64 = 1 << 19; // RISC-V Vector
|
|
76
|
+
pub const RVVHALF: u64 = 1 << 20; // RISC-V Zvfh
|
|
77
|
+
pub const RVVBF16: u64 = 1 << 21; // RISC-V Zvfbfwma
|
|
78
|
+
pub const GRANITEAMX: u64 = 1 << 22; // Intel Granite AMX FP16
|
|
79
|
+
pub const TURIN: u64 = 1 << 23; // AMD Turin AVX-512 CD
|
|
80
|
+
pub const SME: u64 = 1 << 24; // ARM SME
|
|
81
|
+
pub const SME2: u64 = 1 << 25; // ARM SME2
|
|
82
|
+
pub const SMEF64: u64 = 1 << 26; // ARM SME F64
|
|
83
|
+
pub const SMEFA64: u64 = 1 << 27; // ARM SME FA64
|
|
84
|
+
pub const SVE2P1: u64 = 1 << 28; // ARM SVE2.1
|
|
85
|
+
pub const SME2P1: u64 = 1 << 29; // ARM SME2.1
|
|
86
|
+
pub const SMEHALF: u64 = 1 << 30; // ARM SME F16F16
|
|
87
|
+
pub const SMEBF16: u64 = 1 << 31; // ARM SME B16B16
|
|
88
|
+
pub const SMELUT2: u64 = 1 << 32; // ARM SME LUTv2
|
|
89
|
+
pub const RVVBB: u64 = 1 << 33; // RISC-V Zvbb
|
|
90
|
+
pub const SIERRA: u64 = 1 << 34; // Intel AVXVNNIINT8
|
|
91
|
+
pub const SMEBI32: u64 = 1 << 35; // ARM SME BI32I32
|
|
92
|
+
pub const LOONGSONASX: u64 = 1 << 36; // LoongArch LASX 256-bit SIMD
|
|
93
|
+
pub const POWERVSX: u64 = 1 << 37; // Power VSX 128-bit SIMD
|
|
94
|
+
pub const DIAMOND: u64 = 1 << 38; // Intel AVX10.2
|
|
95
|
+
pub const NEONFP8: u64 = 1 << 39; // ARM NEON FP8
|
|
96
|
+
}
|
|
@@ -0,0 +1,314 @@
|
|
|
1
|
+
//! Type casting between scalar formats.
|
|
2
|
+
//!
|
|
3
|
+
//! This module provides:
|
|
4
|
+
//!
|
|
5
|
+
//! - [`CastDtype`]: Trait marking types eligible for bulk casting
|
|
6
|
+
//! - [`cast`]: Bulk-converts a slice from one scalar format to another
|
|
7
|
+
|
|
8
|
+
use crate::types::{bf16, bf16c, e2m3, e3m2, e4m3, e5m2, f16, f16c, f32c, f64c, StorageElement};
|
|
9
|
+
|
|
10
|
+
#[link(name = "numkong")]
|
|
11
|
+
extern "C" {
|
|
12
|
+
fn nk_cast(
|
|
13
|
+
from: *const core::ffi::c_void,
|
|
14
|
+
from_type: u32,
|
|
15
|
+
n: usize,
|
|
16
|
+
to: *mut core::ffi::c_void,
|
|
17
|
+
to_type: u32,
|
|
18
|
+
);
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
/// Internal dtype codes matching `nk_dtype_t` from C.
|
|
22
|
+
/// Not exposed to users.
|
|
23
|
+
mod dtype {
|
|
24
|
+
pub(crate) const F64: u32 = 1 << 10;
|
|
25
|
+
pub(crate) const F32: u32 = 1 << 11;
|
|
26
|
+
pub(crate) const F16: u32 = 1 << 12;
|
|
27
|
+
pub(crate) const BF16: u32 = 1 << 13;
|
|
28
|
+
pub(crate) const E4M3: u32 = 1 << 14;
|
|
29
|
+
pub(crate) const E5M2: u32 = 1 << 15;
|
|
30
|
+
pub(crate) const E2M3: u32 = 1 << 18;
|
|
31
|
+
pub(crate) const E3M2: u32 = 1 << 19;
|
|
32
|
+
pub(crate) const F64C: u32 = 1 << 20;
|
|
33
|
+
pub(crate) const F32C: u32 = 1 << 21;
|
|
34
|
+
pub(crate) const F16C: u32 = 1 << 22;
|
|
35
|
+
pub(crate) const BF16C: u32 = 1 << 23;
|
|
36
|
+
pub(crate) const I8: u32 = 1 << 2;
|
|
37
|
+
pub(crate) const I16: u32 = 1 << 3;
|
|
38
|
+
pub(crate) const I32: u32 = 1 << 4;
|
|
39
|
+
pub(crate) const I64: u32 = 1 << 5;
|
|
40
|
+
pub(crate) const U8: u32 = 1 << 6;
|
|
41
|
+
pub(crate) const U16: u32 = 1 << 7;
|
|
42
|
+
pub(crate) const U32: u32 = 1 << 8;
|
|
43
|
+
pub(crate) const U64: u32 = 1 << 9;
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
// Sealed trait pattern to prevent external implementations
|
|
47
|
+
mod private {
|
|
48
|
+
pub trait Sealed {}
|
|
49
|
+
impl Sealed for f64 {}
|
|
50
|
+
impl Sealed for f32 {}
|
|
51
|
+
impl Sealed for super::f16 {}
|
|
52
|
+
impl Sealed for super::bf16 {}
|
|
53
|
+
impl Sealed for super::e4m3 {}
|
|
54
|
+
impl Sealed for super::e5m2 {}
|
|
55
|
+
impl Sealed for super::e2m3 {}
|
|
56
|
+
impl Sealed for super::e3m2 {}
|
|
57
|
+
impl Sealed for super::f64c {}
|
|
58
|
+
impl Sealed for super::f32c {}
|
|
59
|
+
impl Sealed for super::f16c {}
|
|
60
|
+
impl Sealed for super::bf16c {}
|
|
61
|
+
impl Sealed for i8 {}
|
|
62
|
+
impl Sealed for i16 {}
|
|
63
|
+
impl Sealed for i32 {}
|
|
64
|
+
impl Sealed for i64 {}
|
|
65
|
+
impl Sealed for u8 {}
|
|
66
|
+
impl Sealed for u16 {}
|
|
67
|
+
impl Sealed for u32 {}
|
|
68
|
+
impl Sealed for u64 {}
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
/// Trait for types that can participate in cast operations.
|
|
72
|
+
///
|
|
73
|
+
/// This trait is sealed - users cannot implement it for their own types.
|
|
74
|
+
pub trait CastDtype: private::Sealed + StorageElement {
|
|
75
|
+
#[doc(hidden)]
|
|
76
|
+
fn dtype_code() -> u32;
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
impl CastDtype for f64 {
|
|
80
|
+
fn dtype_code() -> u32 {
|
|
81
|
+
dtype::F64
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
impl CastDtype for f32 {
|
|
85
|
+
fn dtype_code() -> u32 {
|
|
86
|
+
dtype::F32
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
impl CastDtype for f16 {
|
|
90
|
+
fn dtype_code() -> u32 {
|
|
91
|
+
dtype::F16
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
impl CastDtype for bf16 {
|
|
95
|
+
fn dtype_code() -> u32 {
|
|
96
|
+
dtype::BF16
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
impl CastDtype for e4m3 {
|
|
100
|
+
fn dtype_code() -> u32 {
|
|
101
|
+
dtype::E4M3
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
impl CastDtype for e5m2 {
|
|
105
|
+
fn dtype_code() -> u32 {
|
|
106
|
+
dtype::E5M2
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
impl CastDtype for e2m3 {
|
|
110
|
+
fn dtype_code() -> u32 {
|
|
111
|
+
dtype::E2M3
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
impl CastDtype for e3m2 {
|
|
115
|
+
fn dtype_code() -> u32 {
|
|
116
|
+
dtype::E3M2
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
impl CastDtype for f64c {
|
|
120
|
+
fn dtype_code() -> u32 {
|
|
121
|
+
dtype::F64C
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
impl CastDtype for f32c {
|
|
125
|
+
fn dtype_code() -> u32 {
|
|
126
|
+
dtype::F32C
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
impl CastDtype for f16c {
|
|
130
|
+
fn dtype_code() -> u32 {
|
|
131
|
+
dtype::F16C
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
impl CastDtype for bf16c {
|
|
135
|
+
fn dtype_code() -> u32 {
|
|
136
|
+
dtype::BF16C
|
|
137
|
+
}
|
|
138
|
+
}
|
|
139
|
+
impl CastDtype for i8 {
|
|
140
|
+
fn dtype_code() -> u32 {
|
|
141
|
+
dtype::I8
|
|
142
|
+
}
|
|
143
|
+
}
|
|
144
|
+
impl CastDtype for i16 {
|
|
145
|
+
fn dtype_code() -> u32 {
|
|
146
|
+
dtype::I16
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
impl CastDtype for i32 {
|
|
150
|
+
fn dtype_code() -> u32 {
|
|
151
|
+
dtype::I32
|
|
152
|
+
}
|
|
153
|
+
}
|
|
154
|
+
impl CastDtype for i64 {
|
|
155
|
+
fn dtype_code() -> u32 {
|
|
156
|
+
dtype::I64
|
|
157
|
+
}
|
|
158
|
+
}
|
|
159
|
+
impl CastDtype for u8 {
|
|
160
|
+
fn dtype_code() -> u32 {
|
|
161
|
+
dtype::U8
|
|
162
|
+
}
|
|
163
|
+
}
|
|
164
|
+
impl CastDtype for u16 {
|
|
165
|
+
fn dtype_code() -> u32 {
|
|
166
|
+
dtype::U16
|
|
167
|
+
}
|
|
168
|
+
}
|
|
169
|
+
impl CastDtype for u32 {
|
|
170
|
+
fn dtype_code() -> u32 {
|
|
171
|
+
dtype::U32
|
|
172
|
+
}
|
|
173
|
+
}
|
|
174
|
+
impl CastDtype for u64 {
|
|
175
|
+
fn dtype_code() -> u32 {
|
|
176
|
+
dtype::U64
|
|
177
|
+
}
|
|
178
|
+
}
|
|
179
|
+
|
|
180
|
+
/// Cast source slice elements to destination slice.
|
|
181
|
+
///
|
|
182
|
+
/// Converts elements from source type `S` to destination type `D` using
|
|
183
|
+
/// hardware-accelerated SIMD operations when available.
|
|
184
|
+
///
|
|
185
|
+
/// # Arguments
|
|
186
|
+
/// * `source` - Source slice of elements to cast
|
|
187
|
+
/// * `dest` - Destination slice to receive cast elements (must be same length as source)
|
|
188
|
+
///
|
|
189
|
+
/// # Returns
|
|
190
|
+
/// * `Some(())` if successful
|
|
191
|
+
/// * `None` if slices have different lengths
|
|
192
|
+
///
|
|
193
|
+
/// # Example
|
|
194
|
+
/// ```ignore
|
|
195
|
+
/// use numkong::{f16, cast};
|
|
196
|
+
///
|
|
197
|
+
/// let f16_data: Vec<f16> = vec![f16::from_f32(1.0), f16::from_f32(2.0)];
|
|
198
|
+
/// let mut f32_data: Vec<f32> = vec![0.0; f16_data.len()];
|
|
199
|
+
/// cast(&f16_data, &mut f32_data);
|
|
200
|
+
/// ```
|
|
201
|
+
pub fn cast<S: CastDtype, D: CastDtype>(source: &[S], dest: &mut [D]) -> Option<()> {
|
|
202
|
+
if source.len() != dest.len() {
|
|
203
|
+
return None;
|
|
204
|
+
}
|
|
205
|
+
unsafe {
|
|
206
|
+
nk_cast(
|
|
207
|
+
source.as_ptr() as *const core::ffi::c_void,
|
|
208
|
+
S::dtype_code(),
|
|
209
|
+
source.len(),
|
|
210
|
+
dest.as_mut_ptr() as *mut core::ffi::c_void,
|
|
211
|
+
D::dtype_code(),
|
|
212
|
+
);
|
|
213
|
+
}
|
|
214
|
+
Some(())
|
|
215
|
+
}
|
|
216
|
+
|
|
217
|
+
#[cfg(test)]
|
|
218
|
+
mod tests {
|
|
219
|
+
use super::*;
|
|
220
|
+
use crate::types::{
|
|
221
|
+
assert_close, bf16, bf16c, e2m3, e3m2, e4m3, e5m2, f16, f16c, f32c, f64c, FloatLike,
|
|
222
|
+
StorageElement, TestableType,
|
|
223
|
+
};
|
|
224
|
+
|
|
225
|
+
fn check_cast_roundtrip<T: FloatLike + TestableType + CastDtype>(values: &[f32]) {
|
|
226
|
+
let src: Vec<T> = values.iter().map(|&v| T::from_f32(v)).collect();
|
|
227
|
+
let mut dst = vec![0.0f32; src.len()];
|
|
228
|
+
cast(&src, &mut dst).unwrap();
|
|
229
|
+
for (i, (&expected, &actual)) in values.iter().zip(dst.iter()).enumerate() {
|
|
230
|
+
assert_close(
|
|
231
|
+
actual as f64,
|
|
232
|
+
expected as f64,
|
|
233
|
+
T::atol(),
|
|
234
|
+
T::rtol(),
|
|
235
|
+
&format!("cast_roundtrip<{}>[{i}]", core::any::type_name::<T>()),
|
|
236
|
+
);
|
|
237
|
+
}
|
|
238
|
+
}
|
|
239
|
+
|
|
240
|
+
#[test]
|
|
241
|
+
fn cast_roundtrip() {
|
|
242
|
+
check_cast_roundtrip::<f16>(&[1.0, 0.5, -1.0]);
|
|
243
|
+
check_cast_roundtrip::<bf16>(&[1.0, 0.5, -1.0]);
|
|
244
|
+
check_cast_roundtrip::<e4m3>(&[1.0, 0.5, -1.0]);
|
|
245
|
+
check_cast_roundtrip::<e5m2>(&[1.0, 0.5, -1.0]);
|
|
246
|
+
check_cast_roundtrip::<e2m3>(&[1.0, 0.5, -1.0]);
|
|
247
|
+
check_cast_roundtrip::<e3m2>(&[1.0, 0.5, -1.0]);
|
|
248
|
+
}
|
|
249
|
+
|
|
250
|
+
#[test]
|
|
251
|
+
fn cast_f32_to_f16() {
|
|
252
|
+
let src = [1.0f32, -1.0];
|
|
253
|
+
let mut dst = [f16(0); 2];
|
|
254
|
+
cast(&src, &mut dst).unwrap();
|
|
255
|
+
assert_eq!([dst[0].0, dst[1].0], [0x3C00, 0xBC00]);
|
|
256
|
+
}
|
|
257
|
+
|
|
258
|
+
#[test]
|
|
259
|
+
fn cast_length_mismatch() {
|
|
260
|
+
let src = [f16(0x3C00)];
|
|
261
|
+
let mut dst = [0.0f32; 2];
|
|
262
|
+
assert!(cast(&src, &mut dst).is_none());
|
|
263
|
+
}
|
|
264
|
+
|
|
265
|
+
#[test]
|
|
266
|
+
fn cast_real_to_complex() {
|
|
267
|
+
let src = [1.25f32, -2.5];
|
|
268
|
+
let mut dst = [f32c::zero(); 2];
|
|
269
|
+
cast(&src, &mut dst).unwrap();
|
|
270
|
+
assert_eq!(dst[0], f32c::from_real_imag(1.25, 0.0));
|
|
271
|
+
assert_eq!(dst[1], f32c::from_real_imag(-2.5, 0.0));
|
|
272
|
+
|
|
273
|
+
let src = [f16::from_f32(3.0), f16::from_f32(-4.0)];
|
|
274
|
+
let mut dst = [f16c::zero(); 2];
|
|
275
|
+
cast(&src, &mut dst).unwrap();
|
|
276
|
+
assert_eq!(
|
|
277
|
+
dst,
|
|
278
|
+
[
|
|
279
|
+
f16c::from_real_imag(f16::from_f32(3.0), f16::ZERO),
|
|
280
|
+
f16c::from_real_imag(f16::from_f32(-4.0), f16::ZERO),
|
|
281
|
+
]
|
|
282
|
+
);
|
|
283
|
+
}
|
|
284
|
+
|
|
285
|
+
#[test]
|
|
286
|
+
fn cast_complex_to_real() {
|
|
287
|
+
let src = [
|
|
288
|
+
f64c::from_real_imag(1.25, 9.0),
|
|
289
|
+
f64c::from_real_imag(-2.5, -7.0),
|
|
290
|
+
];
|
|
291
|
+
let mut dst = [0.0f64; 2];
|
|
292
|
+
cast(&src, &mut dst).unwrap();
|
|
293
|
+
assert_eq!(dst, [1.25, -2.5]);
|
|
294
|
+
}
|
|
295
|
+
|
|
296
|
+
#[test]
|
|
297
|
+
fn cast_complex_to_complex() {
|
|
298
|
+
let src = [
|
|
299
|
+
f32c::from_real_imag(1.25, -2.5),
|
|
300
|
+
f32c::from_real_imag(-3.5, 4.25),
|
|
301
|
+
];
|
|
302
|
+
let mut widened = [f64c::zero(); 2];
|
|
303
|
+
cast(&src, &mut widened).unwrap();
|
|
304
|
+
assert_eq!(widened[0], f64c::from_real_imag(1.25, -2.5));
|
|
305
|
+
assert_eq!(widened[1], f64c::from_real_imag(-3.5, 4.25));
|
|
306
|
+
|
|
307
|
+
let mut narrowed = [bf16c::zero(); 2];
|
|
308
|
+
cast(&widened, &mut narrowed).unwrap();
|
|
309
|
+
assert_eq!(narrowed[0].re.to_f32(), bf16::from_f32(1.25).to_f32());
|
|
310
|
+
assert_eq!(narrowed[0].im.to_f32(), bf16::from_f32(-2.5).to_f32());
|
|
311
|
+
assert_eq!(narrowed[1].re.to_f32(), bf16::from_f32(-3.5).to_f32());
|
|
312
|
+
assert_eq!(narrowed[1].im.to_f32(), bf16::from_f32(4.25).to_f32());
|
|
313
|
+
}
|
|
314
|
+
}
|