usearch 2.10.2 → 2.10.5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (112) hide show
  1. package/README.md +1 -1
  2. package/binding.gyp +101 -0
  3. package/c/CMakeLists.txt +27 -0
  4. package/c/README.md +34 -0
  5. package/c/lib.cpp +362 -0
  6. package/c/test.c +382 -0
  7. package/c/usearch.h +356 -0
  8. package/cmake/clipp.cmake +7 -0
  9. package/cmake/config.cmake.in +15 -0
  10. package/cmake/emscripten.cmake +8 -0
  11. package/cmake/jemalloc.cmake +62 -0
  12. package/cmake/pkg-config.pc.in +4 -0
  13. package/cmake/usearchConfigVersion.cmake.in +20 -0
  14. package/cpp/CMakeLists.txt +14 -0
  15. package/cpp/README.md +161 -0
  16. package/cpp/bench.cpp +616 -0
  17. package/cpp/test.cpp +324 -0
  18. package/fp16/CMakeLists.txt +176 -0
  19. package/fp16/LICENSE +11 -0
  20. package/fp16/README.md +20 -0
  21. package/fp16/bench/alt-element.cc +89 -0
  22. package/fp16/bench/from-alt-array.cc +175 -0
  23. package/fp16/bench/from-ieee-array.cc +399 -0
  24. package/fp16/bench/ieee-element.cc +272 -0
  25. package/fp16/bench/to-alt-array.cc +91 -0
  26. package/fp16/bench/to-ieee-array.cc +303 -0
  27. package/fp16/cmake/DownloadGoogleBenchmark.cmake +15 -0
  28. package/fp16/cmake/DownloadGoogleTest.cmake +15 -0
  29. package/fp16/cmake/DownloadPSimd.cmake +15 -0
  30. package/fp16/configure.py +65 -0
  31. package/fp16/confu.yaml +8 -0
  32. package/fp16/include/fp16/__init__.py +0 -0
  33. package/fp16/include/fp16/avx.py +50 -0
  34. package/fp16/include/fp16/avx2.py +53 -0
  35. package/fp16/include/fp16/bitcasts.h +92 -0
  36. package/fp16/include/fp16/fp16.h +451 -0
  37. package/fp16/include/fp16/psimd.h +131 -0
  38. package/fp16/include/fp16.h +11 -0
  39. package/fp16/jni/Android.mk +6 -0
  40. package/fp16/jni/Application.mk +4 -0
  41. package/fp16/test/alt-from-fp32-value.cc +498 -0
  42. package/fp16/test/alt-to-fp32-bits.cc +263 -0
  43. package/fp16/test/alt-to-fp32-psimd.cc +145 -0
  44. package/fp16/test/alt-to-fp32-value.cc +348 -0
  45. package/fp16/test/alt-to-fp32x2-psimd.cc +245 -0
  46. package/fp16/test/bitcasts.cc +56 -0
  47. package/fp16/test/ieee-from-fp32-value.cc +523 -0
  48. package/fp16/test/ieee-to-fp32-bits.cc +333 -0
  49. package/fp16/test/ieee-to-fp32-psimd.cc +312 -0
  50. package/fp16/test/ieee-to-fp32-value.cc +420 -0
  51. package/fp16/test/ieee-to-fp32x2-psimd.cc +541 -0
  52. package/fp16/test/peachpy/alt-xmm-to-fp32-xmm-avx.cc +96 -0
  53. package/fp16/test/peachpy/alt-xmm-to-fp32-ymm-avx2.cc +96 -0
  54. package/fp16/test/peachpy/stubs.py +38 -0
  55. package/fp16/test/tables.cc +530 -0
  56. package/fp16/test/tables.h +13 -0
  57. package/fp16/third-party/THHalf.h +92 -0
  58. package/fp16/third-party/eigen-half.h +170 -0
  59. package/fp16/third-party/float16-compressor.h +80 -0
  60. package/fp16/third-party/half.hpp +2916 -0
  61. package/fp16/third-party/npy-halffloat.h +328 -0
  62. package/include/usearch/index.hpp +3838 -0
  63. package/include/usearch/index_dense.hpp +2004 -0
  64. package/include/usearch/index_plugins.hpp +2255 -0
  65. package/javascript/dist-package-cjs.json +3 -0
  66. package/javascript/dist-package-esm.json +3 -0
  67. package/javascript/lib.cpp +350 -0
  68. package/javascript/node-gyp-build.d.ts +1 -0
  69. package/javascript/tsconfig-base.json +25 -0
  70. package/javascript/tsconfig-cjs.json +8 -0
  71. package/javascript/tsconfig-esm.json +8 -0
  72. package/javascript/usearch.test.js +84 -0
  73. package/javascript/usearch.ts +640 -0
  74. package/package.json +10 -3
  75. package/prebuilds/darwin-arm64+x64/usearch.node +0 -0
  76. package/prebuilds/linux-arm64/usearch.node +0 -0
  77. package/prebuilds/linux-x64/usearch.node +0 -0
  78. package/prebuilds/win32-ia32/usearch.node +0 -0
  79. package/prebuilds/win32-x64/usearch.node +0 -0
  80. package/simsimd/.releaserc +87 -0
  81. package/simsimd/CONTRIBUTING.md +114 -0
  82. package/simsimd/Cargo.lock +709 -0
  83. package/simsimd/Cargo.toml +44 -0
  84. package/simsimd/LICENSE +201 -0
  85. package/simsimd/README.md +708 -0
  86. package/simsimd/binding.gyp +36 -0
  87. package/simsimd/build.rs +51 -0
  88. package/simsimd/c/lib.c +110 -0
  89. package/simsimd/include/simsimd/binary.h +258 -0
  90. package/simsimd/include/simsimd/dot.h +1237 -0
  91. package/simsimd/include/simsimd/geospatial.h +37 -0
  92. package/simsimd/include/simsimd/probability.h +563 -0
  93. package/simsimd/include/simsimd/simsimd.h +1129 -0
  94. package/simsimd/include/simsimd/spatial.h +1019 -0
  95. package/simsimd/include/simsimd/types.h +309 -0
  96. package/simsimd/javascript/bench.js +127 -0
  97. package/simsimd/javascript/dist-package-cjs.json +3 -0
  98. package/simsimd/javascript/dist-package-esm.json +3 -0
  99. package/simsimd/javascript/fallback.ts +203 -0
  100. package/simsimd/javascript/lib.c +107 -0
  101. package/simsimd/javascript/node-gyp-build.d.ts +1 -0
  102. package/simsimd/javascript/simsimd.ts +135 -0
  103. package/simsimd/javascript/test.mjs +179 -0
  104. package/simsimd/javascript/tsconfig-base.json +37 -0
  105. package/simsimd/javascript/tsconfig-cjs.json +8 -0
  106. package/simsimd/javascript/tsconfig-esm.json +8 -0
  107. package/simsimd/package-lock.json +1709 -0
  108. package/simsimd/package.json +61 -0
  109. package/simsimd/rust/benches/cosine.rs +27 -0
  110. package/simsimd/rust/benches/native.rs +30 -0
  111. package/simsimd/rust/benches/sqeuclidean.rs +27 -0
  112. package/simsimd/rust/lib.rs +778 -0
@@ -0,0 +1,96 @@
1
+ #include <gtest/gtest.h>
2
+
3
+ #include <cstdint>
4
+
5
+ #include <fp16.h>
6
+
7
+
8
+ extern "C" void fp16_alt_xmm_to_fp32_ymm_peachpy__avx2(const uint16_t* fp16, uint32_t* fp32);
9
+ const size_t vector_elements = 8;
10
+
11
+
12
+ TEST(FP16_ALT_XMM_TO_FP32_YMM, positive_normalized_values) {
13
+ const uint32_t exponentBias = 15;
14
+ for (int32_t e = -14; e <= 16; e++) {
15
+ for (uint16_t h = 0; h < 0x0400; h += vector_elements) {
16
+ uint16_t fp16[vector_elements];
17
+ for (size_t i = 0; i < vector_elements; i++) {
18
+ fp16[i] = h + ((e + exponentBias) << 10) + i;
19
+ }
20
+ uint32_t fp32[vector_elements];
21
+ fp16_alt_xmm_to_fp32_ymm_peachpy__avx2(fp16, fp32);
22
+
23
+ for (size_t i = 0; i < vector_elements; i++) {
24
+ EXPECT_EQ(fp16_alt_to_fp32_bits(fp16[i]), fp32[i]) <<
25
+ std::hex << std::uppercase << std::setfill('0') <<
26
+ "F16 = 0x" << std::setw(4) << fp16[i] << ", " <<
27
+ "F32(F16) = 0x" << std::setw(8) << fp32[i] << ", " <<
28
+ "F32 = 0x" << std::setw(8) << fp16_alt_to_fp32_bits(fp16[i]) <<
29
+ ", lane " << i << "/" << vector_elements;
30
+ }
31
+ }
32
+ }
33
+ }
34
+
35
+ TEST(FP16_ALT_XMM_TO_FP32_YMM, negative_normalized_values) {
36
+ const uint32_t exponentBias = 15;
37
+ for (int32_t e = -14; e <= 16; e++) {
38
+ for (uint16_t h = 0; h < 0x0400; h += vector_elements) {
39
+ uint16_t fp16[vector_elements];
40
+ for (size_t i = 0; i < vector_elements; i++) {
41
+ fp16[i] = 0x8000 + h + ((e + exponentBias) << 10) + i;
42
+ }
43
+ uint32_t fp32[vector_elements];
44
+ fp16_alt_xmm_to_fp32_ymm_peachpy__avx2(fp16, fp32);
45
+
46
+ for (size_t i = 0; i < vector_elements; i++) {
47
+ EXPECT_EQ(fp16_alt_to_fp32_bits(fp16[i]), fp32[i]) <<
48
+ std::hex << std::uppercase << std::setfill('0') <<
49
+ "F16 = 0x" << std::setw(4) << fp16[i] << ", " <<
50
+ "F32(F16) = 0x" << std::setw(8) << fp32[i] << ", " <<
51
+ "F32 = 0x" << std::setw(8) << fp16_alt_to_fp32_bits(fp16[i]) <<
52
+ ", lane " << i << "/" << vector_elements;
53
+ }
54
+ }
55
+ }
56
+ }
57
+
58
+ TEST(FP16_ALT_XMM_TO_FP32_YMM, positive_denormalized_values) {
59
+ for (uint16_t h = 0; h < 0x0400; h += vector_elements) {
60
+ uint16_t fp16[vector_elements];
61
+ for (size_t i = 0; i < vector_elements; i++) {
62
+ fp16[i] = h + i;
63
+ }
64
+ uint32_t fp32[vector_elements];
65
+ fp16_alt_xmm_to_fp32_ymm_peachpy__avx2(fp16, fp32);
66
+
67
+ for (size_t i = 0; i < vector_elements; i++) {
68
+ EXPECT_EQ(fp16_alt_to_fp32_bits(fp16[i]), fp32[i]) <<
69
+ std::hex << std::uppercase << std::setfill('0') <<
70
+ "F16 = 0x" << std::setw(4) << fp16[i] << ", " <<
71
+ "F32(F16) = 0x" << std::setw(8) << fp32[i] << ", " <<
72
+ "F32 = 0x" << std::setw(8) << fp16_alt_to_fp32_bits(fp16[i]) <<
73
+ ", lane " << i << "/" << vector_elements;
74
+ }
75
+ }
76
+ }
77
+
78
+ TEST(FP16_ALT_XMM_TO_FP32_YMM, negative_denormalized_values) {
79
+ for (uint16_t h = 0; h < 0x0400; h += vector_elements) {
80
+ uint16_t fp16[vector_elements];
81
+ for (size_t i = 0; i < vector_elements; i++) {
82
+ fp16[i] = 0x8000 + h + i;
83
+ }
84
+ uint32_t fp32[vector_elements];
85
+ fp16_alt_xmm_to_fp32_ymm_peachpy__avx2(fp16, fp32);
86
+
87
+ for (size_t i = 0; i < vector_elements; i++) {
88
+ EXPECT_EQ(fp16_alt_to_fp32_bits(fp16[i]), fp32[i]) <<
89
+ std::hex << std::uppercase << std::setfill('0') <<
90
+ "F16 = 0x" << std::setw(4) << fp16[i] << ", " <<
91
+ "F32(F16) = 0x" << std::setw(8) << fp32[i] << ", " <<
92
+ "F32 = 0x" << std::setw(8) << fp16_alt_to_fp32_bits(fp16[i]) <<
93
+ ", lane " << i << "/" << vector_elements;
94
+ }
95
+ }
96
+ }
@@ -0,0 +1,38 @@
1
+ from peachpy import *
2
+ from peachpy.x86_64 import *
3
+
4
+ import fp16.avx, fp16.avx2
5
+
6
+
7
+ arg_fp16 = Argument(ptr(const_uint16_t), name="fp16")
8
+ arg_fp32 = Argument(ptr(uint32_t), name="fp32")
9
+
10
+ with Function("fp16_alt_xmm_to_fp32_ymm_peachpy__avx2", (arg_fp16, arg_fp32), target=uarch.default + isa.avx2):
11
+
12
+ reg_fp16 = GeneralPurposeRegister64()
13
+ LOAD.ARGUMENT(reg_fp16, arg_fp16)
14
+
15
+ reg_fp32 = GeneralPurposeRegister64()
16
+ LOAD.ARGUMENT(reg_fp32, arg_fp32)
17
+
18
+ xmm_fp16 = XMMRegister()
19
+ VMOVUPS(xmm_fp16, [reg_fp16])
20
+ ymm_fp32 = fp16.avx2.fp16_alt_xmm_to_fp32_ymm(xmm_fp16)
21
+ VMOVUPS([reg_fp32], ymm_fp32)
22
+
23
+ RETURN()
24
+
25
+ with Function("fp16_alt_xmm_to_fp32_xmm_peachpy__avx", (arg_fp16, arg_fp32), target=uarch.default + isa.avx):
26
+
27
+ reg_fp16 = GeneralPurposeRegister64()
28
+ LOAD.ARGUMENT(reg_fp16, arg_fp16)
29
+
30
+ reg_fp32 = GeneralPurposeRegister64()
31
+ LOAD.ARGUMENT(reg_fp32, arg_fp32)
32
+
33
+ xmm_fp16 = XMMRegister()
34
+ VMOVUPS(xmm_fp16, [reg_fp16])
35
+ xmm_fp32 = fp16.avx.fp16_alt_xmm_to_fp32_xmm(xmm_fp16)
36
+ VMOVUPS([reg_fp32], xmm_fp32)
37
+
38
+ RETURN()