usearch 2.11.1 → 2.13.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +100 -30
- package/binding.gyp +11 -12
- package/c/README.md +3 -0
- package/c/lib.cpp +50 -13
- package/c/test.c +60 -55
- package/c/usearch.h +16 -0
- package/cpp/CMakeLists.txt +6 -0
- package/cpp/README.md +34 -13
- package/cpp/bench.cpp +99 -47
- package/cpp/test.cpp +947 -132
- package/include/usearch/index.hpp +894 -272
- package/include/usearch/index_dense.hpp +418 -156
- package/include/usearch/index_plugins.hpp +99 -49
- package/javascript/dist/cjs/usearch.d.ts +39 -1
- package/javascript/dist/cjs/usearch.js +11 -1
- package/javascript/dist/esm/usearch.d.ts +39 -1
- package/javascript/dist/esm/usearch.js +11 -1
- package/javascript/tsconfig-esm.json +3 -2
- package/javascript/usearch.ts +18 -7
- package/package.json +2 -2
- 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/simsimd/.cmake-format.py +19 -0
- package/simsimd/CONTRIBUTING.md +49 -8
- package/simsimd/Cargo.lock +1 -1
- package/simsimd/Cargo.toml +10 -5
- package/simsimd/Package.swift +16 -0
- package/simsimd/README.md +69 -15
- package/simsimd/binding.gyp +14 -19
- package/simsimd/build.rs +2 -0
- package/simsimd/c/lib.c +18 -0
- package/simsimd/include/module.modulemap +4 -0
- package/simsimd/include/simsimd/binary.h +2 -0
- package/simsimd/include/simsimd/dot.h +466 -32
- package/simsimd/include/simsimd/probability.h +20 -10
- package/simsimd/include/simsimd/simsimd.h +444 -98
- package/simsimd/include/simsimd/spatial.h +480 -44
- package/simsimd/include/simsimd/types.h +161 -39
- package/simsimd/javascript/simsimd.ts +26 -2
- package/simsimd/package.json +1 -1
- package/simsimd/rust/benches/cosine.rs +8 -2
- package/simsimd/rust/benches/native.rs +240 -2
- package/simsimd/rust/benches/sqeuclidean.rs +8 -2
- package/simsimd/rust/lib.rs +50 -13
- package/simsimd/swift/source/SimSIMD.swift +123 -0
- package/simsimd/swift/tests/SimSIMDTests.swift +92 -0
- package/prebuilds/win32-ia32/usearch.node +0 -0
- package/prebuilds/win32-x64/usearch.node +0 -0
- package/simsimd/.releaserc +0 -87
|
@@ -40,6 +40,8 @@ SIMSIMD_PUBLIC void simsimd_kl_f32_serial(simsimd_f32_t const* a, simsimd_f32_t
|
|
|
40
40
|
SIMSIMD_PUBLIC void simsimd_js_f32_serial(simsimd_f32_t const* a, simsimd_f32_t const* b, simsimd_size_t n, simsimd_distance_t* divergence);
|
|
41
41
|
SIMSIMD_PUBLIC void simsimd_kl_f16_serial(simsimd_f16_t const* a, simsimd_f16_t const* b, simsimd_size_t n, simsimd_distance_t* divergence);
|
|
42
42
|
SIMSIMD_PUBLIC void simsimd_js_f16_serial(simsimd_f16_t const* a, simsimd_f16_t const* b, simsimd_size_t n, simsimd_distance_t* divergence);
|
|
43
|
+
SIMSIMD_PUBLIC void simsimd_kl_bf16_serial(simsimd_bf16_t const* a, simsimd_bf16_t const* b, simsimd_size_t n, simsimd_distance_t* divergence);
|
|
44
|
+
SIMSIMD_PUBLIC void simsimd_js_bf16_serial(simsimd_bf16_t const* a, simsimd_bf16_t const* b, simsimd_size_t n, simsimd_distance_t* divergence);
|
|
43
45
|
|
|
44
46
|
/* Double-precision serial backends for all numeric types.
|
|
45
47
|
* For single-precision computation check out the "*_serial" counterparts of those "*_accurate" functions.
|
|
@@ -48,6 +50,8 @@ SIMSIMD_PUBLIC void simsimd_kl_f32_accurate(simsimd_f32_t const* a, simsimd_f32_
|
|
|
48
50
|
SIMSIMD_PUBLIC void simsimd_js_f32_accurate(simsimd_f32_t const* a, simsimd_f32_t const* b, simsimd_size_t n, simsimd_distance_t* divergence);
|
|
49
51
|
SIMSIMD_PUBLIC void simsimd_kl_f16_accurate(simsimd_f16_t const* a, simsimd_f16_t const* b, simsimd_size_t n, simsimd_distance_t* divergence);
|
|
50
52
|
SIMSIMD_PUBLIC void simsimd_js_f16_accurate(simsimd_f16_t const* a, simsimd_f16_t const* b, simsimd_size_t n, simsimd_distance_t* divergence);
|
|
53
|
+
SIMSIMD_PUBLIC void simsimd_kl_bf16_accurate(simsimd_bf16_t const* a, simsimd_bf16_t const* b, simsimd_size_t n, simsimd_distance_t* divergence);
|
|
54
|
+
SIMSIMD_PUBLIC void simsimd_js_bf16_accurate(simsimd_bf16_t const* a, simsimd_bf16_t const* b, simsimd_size_t n, simsimd_distance_t* divergence);
|
|
51
55
|
|
|
52
56
|
/* SIMD-powered backends for Arm NEON, mostly using 32-bit arithmetic over 128-bit words.
|
|
53
57
|
* By far the most portable backend, covering most Arm v8 devices, over a billion phones, and almost all
|
|
@@ -115,12 +119,18 @@ SIMSIMD_MAKE_JS(serial, f32, f32, SIMSIMD_IDENTIFY, SIMSIMD_F32_DIVISION_EPSILON
|
|
|
115
119
|
SIMSIMD_MAKE_KL(serial, f16, f32, SIMSIMD_UNCOMPRESS_F16, SIMSIMD_F32_DIVISION_EPSILON) // simsimd_kl_f16_serial
|
|
116
120
|
SIMSIMD_MAKE_JS(serial, f16, f32, SIMSIMD_UNCOMPRESS_F16, SIMSIMD_F32_DIVISION_EPSILON) // simsimd_js_f16_serial
|
|
117
121
|
|
|
122
|
+
SIMSIMD_MAKE_KL(serial, bf16, f32, SIMSIMD_UNCOMPRESS_BF16, SIMSIMD_F32_DIVISION_EPSILON) // simsimd_kl_bf16_serial
|
|
123
|
+
SIMSIMD_MAKE_JS(serial, bf16, f32, SIMSIMD_UNCOMPRESS_BF16, SIMSIMD_F32_DIVISION_EPSILON) // simsimd_js_bf16_serial
|
|
124
|
+
|
|
118
125
|
SIMSIMD_MAKE_KL(accurate, f32, f64, SIMSIMD_IDENTIFY, SIMSIMD_F32_DIVISION_EPSILON) // simsimd_kl_f32_accurate
|
|
119
126
|
SIMSIMD_MAKE_JS(accurate, f32, f64, SIMSIMD_IDENTIFY, SIMSIMD_F32_DIVISION_EPSILON) // simsimd_js_f32_accurate
|
|
120
127
|
|
|
121
128
|
SIMSIMD_MAKE_KL(accurate, f16, f64, SIMSIMD_UNCOMPRESS_F16, SIMSIMD_F32_DIVISION_EPSILON) // simsimd_kl_f16_accurate
|
|
122
129
|
SIMSIMD_MAKE_JS(accurate, f16, f64, SIMSIMD_UNCOMPRESS_F16, SIMSIMD_F32_DIVISION_EPSILON) // simsimd_js_f16_accurate
|
|
123
130
|
|
|
131
|
+
SIMSIMD_MAKE_KL(accurate, bf16, f64, SIMSIMD_UNCOMPRESS_BF16, SIMSIMD_F32_DIVISION_EPSILON) // simsimd_kl_bf16_accurate
|
|
132
|
+
SIMSIMD_MAKE_JS(accurate, bf16, f64, SIMSIMD_UNCOMPRESS_BF16, SIMSIMD_F32_DIVISION_EPSILON) // simsimd_js_bf16_accurate
|
|
133
|
+
|
|
124
134
|
#if SIMSIMD_TARGET_ARM
|
|
125
135
|
#if SIMSIMD_TARGET_NEON
|
|
126
136
|
#pragma GCC push_options
|
|
@@ -472,17 +482,17 @@ simsimd_js_f32_skylake_cycle:
|
|
|
472
482
|
|
|
473
483
|
inline __m512h simsimd_log2_f16_sapphire(__m512h x) {
|
|
474
484
|
// Extract the exponent and mantissa
|
|
475
|
-
__m512h one = _mm512_set1_ph((
|
|
485
|
+
__m512h one = _mm512_set1_ph((simsimd_f16_t)1);
|
|
476
486
|
__m512h e = _mm512_getexp_ph(x);
|
|
477
487
|
__m512h m = _mm512_getmant_ph(x, _MM_MANT_NORM_1_2, _MM_MANT_SIGN_src);
|
|
478
488
|
|
|
479
489
|
// Compute the polynomial using Horner's method
|
|
480
|
-
__m512h p = _mm512_set1_ph((
|
|
481
|
-
p = _mm512_fmadd_ph(m, p, _mm512_set1_ph((
|
|
482
|
-
p = _mm512_fmadd_ph(m, p, _mm512_set1_ph((
|
|
483
|
-
p = _mm512_fmadd_ph(m, p, _mm512_set1_ph((
|
|
484
|
-
p = _mm512_fmadd_ph(m, p, _mm512_set1_ph((
|
|
485
|
-
p = _mm512_fmadd_ph(m, p, _mm512_set1_ph((
|
|
490
|
+
__m512h p = _mm512_set1_ph((simsimd_f16_t)-3.4436006e-2f);
|
|
491
|
+
p = _mm512_fmadd_ph(m, p, _mm512_set1_ph((simsimd_f16_t)3.1821337e-1f));
|
|
492
|
+
p = _mm512_fmadd_ph(m, p, _mm512_set1_ph((simsimd_f16_t)-1.2315303f));
|
|
493
|
+
p = _mm512_fmadd_ph(m, p, _mm512_set1_ph((simsimd_f16_t)2.5988452f));
|
|
494
|
+
p = _mm512_fmadd_ph(m, p, _mm512_set1_ph((simsimd_f16_t)-3.3241990f));
|
|
495
|
+
p = _mm512_fmadd_ph(m, p, _mm512_set1_ph((simsimd_f16_t)3.1157899f));
|
|
486
496
|
|
|
487
497
|
return _mm512_add_ph(_mm512_mul_ph(p, _mm512_sub_ph(m, one)), e);
|
|
488
498
|
}
|
|
@@ -490,7 +500,7 @@ inline __m512h simsimd_log2_f16_sapphire(__m512h x) {
|
|
|
490
500
|
SIMSIMD_PUBLIC void simsimd_kl_f16_sapphire(simsimd_f16_t const* a, simsimd_f16_t const* b, simsimd_size_t n,
|
|
491
501
|
simsimd_distance_t* result) {
|
|
492
502
|
__m512h sum_vec = _mm512_setzero_ph();
|
|
493
|
-
__m512h epsilon_vec = _mm512_set1_ph((
|
|
503
|
+
__m512h epsilon_vec = _mm512_set1_ph((simsimd_f16_t)SIMSIMD_F16_DIVISION_EPSILON);
|
|
494
504
|
__m512h a_vec, b_vec;
|
|
495
505
|
|
|
496
506
|
simsimd_kl_f16_sapphire_cycle:
|
|
@@ -519,7 +529,7 @@ SIMSIMD_PUBLIC void simsimd_js_f16_sapphire(simsimd_f16_t const* a, simsimd_f16_
|
|
|
519
529
|
simsimd_distance_t* result) {
|
|
520
530
|
__m512h sum_a_vec = _mm512_setzero_ph();
|
|
521
531
|
__m512h sum_b_vec = _mm512_setzero_ph();
|
|
522
|
-
__m512h epsilon_vec = _mm512_set1_ph((
|
|
532
|
+
__m512h epsilon_vec = _mm512_set1_ph((simsimd_f16_t)SIMSIMD_F16_DIVISION_EPSILON);
|
|
523
533
|
__m512h a_vec, b_vec;
|
|
524
534
|
|
|
525
535
|
simsimd_js_f16_sapphire_cycle:
|
|
@@ -533,7 +543,7 @@ simsimd_js_f16_sapphire_cycle:
|
|
|
533
543
|
b_vec = _mm512_castsi512_ph(_mm512_loadu_epi16(b));
|
|
534
544
|
a += 32, b += 32, n -= 32;
|
|
535
545
|
}
|
|
536
|
-
__m512h m_vec = _mm512_mul_ph(_mm512_add_ph(a_vec, b_vec), _mm512_set1_ph((
|
|
546
|
+
__m512h m_vec = _mm512_mul_ph(_mm512_add_ph(a_vec, b_vec), _mm512_set1_ph((simsimd_f16_t)0.5f));
|
|
537
547
|
__mmask32 nonzero_mask_a = _mm512_cmp_ph_mask(a_vec, epsilon_vec, _CMP_GE_OQ);
|
|
538
548
|
__mmask32 nonzero_mask_b = _mm512_cmp_ph_mask(b_vec, epsilon_vec, _CMP_GE_OQ);
|
|
539
549
|
__mmask32 nonzero_mask = nonzero_mask_a & nonzero_mask_b;
|