usearch 2.9.1 → 2.10.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 +50 -52
- package/javascript/{types → dist/cjs}/usearch.d.ts +90 -115
- package/javascript/dist/cjs/usearch.js +531 -0
- package/javascript/dist/esm/usearch.d.ts +212 -0
- package/javascript/{usearch.js → dist/esm/usearch.js} +202 -153
- package/package.json +25 -23
- 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/prebuilds/win32-ia32/usearch.node +0 -0
- package/prebuilds/win32-x64/usearch.node +0 -0
- package/.clang-format +0 -10
- package/.clang-tidy +0 -60
- package/.cmake-format.py +0 -19
- package/.dockerignore +0 -93
- package/.gitattributes +0 -9
- package/.github/ISSUE_TEMPLATE/bug_report.yml +0 -90
- package/.github/ISSUE_TEMPLATE/config.yml +0 -5
- package/.github/ISSUE_TEMPLATE/feature_request.yml +0 -64
- package/.github/workflows/Dockerfile.libs +0 -36
- package/.github/workflows/prerelease.yml +0 -331
- package/.github/workflows/release.yml +0 -722
- package/.github/workflows/update_version.sh +0 -15
- package/.gitmodules +0 -9
- package/.releaserc +0 -90
- package/CITATION.cff +0 -11
- package/CMakeLists.txt +0 -324
- package/CODE_OF_CONDUCT.md +0 -128
- package/CONTRIBUTING.md +0 -353
- package/Cargo.toml +0 -19
- package/Dockerfile +0 -16
- package/VERSION +0 -1
- package/assets/unum.png +0 -0
- package/assets/usearch-approaches-transparent.png +0 -0
- package/assets/usearch-approaches-white.png +0 -0
- package/assets/usearch-neighbor-types.png +0 -0
- package/binding.gyp +0 -87
- package/build.gradle +0 -204
- package/build.rs +0 -18
- package/c/CMakeLists.txt +0 -25
- package/c/README.md +0 -34
- package/c/lib.cpp +0 -358
- package/c/test.c +0 -374
- package/c/usearch.h +0 -311
- package/cmake/clipp.cmake +0 -7
- package/cmake/config.cmake.in +0 -15
- package/cmake/emscripten.cmake +0 -8
- package/cmake/jemalloc.cmake +0 -62
- package/cmake/pkg-config.pc.in +0 -4
- package/cmake/usearchConfigVersion.cmake.in +0 -20
- package/conanfile.py +0 -26
- package/cpp/CMakeLists.txt +0 -14
- package/cpp/README.md +0 -161
- package/cpp/bench.cpp +0 -618
- package/cpp/test.cpp +0 -323
- 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/include/usearch/index.hpp +0 -3836
- package/include/usearch/index_dense.hpp +0 -2004
- package/include/usearch/index_plugins.hpp +0 -2203
- package/javascript/lib.cpp +0 -341
- package/javascript/types/usearch.d.ts.map +0 -1
- package/javascript/usearch.test.js +0 -74
- package/package-ci.json +0 -10
- package/pyproject.toml +0 -51
- package/setup.py +0 -201
- package/simsimd/.releaserc +0 -86
- package/simsimd/Cargo.lock +0 -708
- package/simsimd/Cargo.toml +0 -36
- package/simsimd/LICENSE +0 -201
- package/simsimd/README.md +0 -275
- package/simsimd/binding.gyp +0 -36
- package/simsimd/build.rs +0 -20
- package/simsimd/include/simsimd/binary.h +0 -201
- package/simsimd/include/simsimd/probability.h +0 -548
- package/simsimd/include/simsimd/simsimd.h +0 -456
- package/simsimd/include/simsimd/spatial.h +0 -1175
- package/simsimd/include/simsimd/types.h +0 -207
- package/simsimd/javascript/bench.js +0 -127
- package/simsimd/javascript/fallback.ts +0 -193
- package/simsimd/javascript/lib.c +0 -102
- package/simsimd/javascript/node-gyp-build.d.ts +0 -1
- package/simsimd/javascript/simsimd.ts +0 -124
- package/simsimd/javascript/test.mjs +0 -153
- package/simsimd/javascript/tsconfig-base.json +0 -25
- package/simsimd/javascript/tsconfig-cjs.json +0 -8
- package/simsimd/javascript/tsconfig-esm.json +0 -8
- package/simsimd/package-lock.json +0 -1688
- package/simsimd/package.json +0 -61
- package/simsimd/rust/benches/cosine.rs +0 -27
- package/simsimd/rust/benches/native.rs +0 -27
- package/simsimd/rust/benches/sqeuclidean.rs +0 -27
- package/simsimd/rust/lib.c +0 -68
- package/simsimd/rust/lib.rs +0 -232
- package/sqlite/README.md +0 -178
- package/sqlite/lib.cpp +0 -325
- package/stringzilla/CONTRIBUTING.md +0 -429
- package/stringzilla/Cargo.lock +0 -25
- package/stringzilla/Cargo.toml +0 -26
- package/stringzilla/LICENSE +0 -201
- package/stringzilla/README.md +0 -1281
- package/stringzilla/VERSION +0 -1
- package/stringzilla/assets/cover-strinzilla.jpeg +0 -0
- package/stringzilla/assets/meme-stringzilla-v2.jpeg +0 -0
- package/stringzilla/assets/meme-stringzilla-v3.jpeg +0 -0
- package/stringzilla/binding.gyp +0 -16
- package/stringzilla/build.rs +0 -14
- package/stringzilla/c/lib.c +0 -304
- package/stringzilla/cli/README.md +0 -48
- package/stringzilla/cli/split.py +0 -72
- package/stringzilla/cli/wc.py +0 -37
- package/stringzilla/include/stringzilla/experimental.h +0 -724
- package/stringzilla/include/stringzilla/module.modulemap +0 -9
- package/stringzilla/include/stringzilla/stringzilla.h +0 -5240
- package/stringzilla/include/stringzilla/stringzilla.hpp +0 -3830
- package/stringzilla/javascript/lib.c +0 -125
- package/stringzilla/javascript/stringzilla.js +0 -22
- package/stringzilla/package-ci.json +0 -10
- package/stringzilla/package.json +0 -32
- package/stringzilla/rust/lib.rs +0 -362
- package/stringzilla/swift/StringProtocol+StringZilla.swift +0 -280
- package/stringzilla/swift/Test.swift +0 -60
- package/tsconfig.json +0 -21
- package/wasmer.toml +0 -12
- package/winlibinstaller.bat +0 -42
- /package/{simsimd/javascript/dist-package-cjs.json → javascript/dist/cjs/package.json} +0 -0
- /package/{simsimd/javascript/dist-package-esm.json → javascript/dist/esm/package.json} +0 -0
|
@@ -1,201 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* @brief SIMD-accelerated Binary Similarity Measures.
|
|
3
|
-
* @author Ash Vardanian
|
|
4
|
-
* @date July 1, 2023
|
|
5
|
-
*
|
|
6
|
-
* Contains:
|
|
7
|
-
* - Hamming distance
|
|
8
|
-
* - Jaccard similarity (Tanimoto coefficient)
|
|
9
|
-
*
|
|
10
|
-
* For datatypes:
|
|
11
|
-
* - 8-bit bitsets
|
|
12
|
-
*
|
|
13
|
-
* For hardware architectures:
|
|
14
|
-
* - Arm (NEON, SVE)
|
|
15
|
-
* - x86 (AVX512)
|
|
16
|
-
*
|
|
17
|
-
* x86 intrinsics: https://www.intel.com/content/www/us/en/docs/intrinsics-guide/
|
|
18
|
-
* Arm intrinsics: https://developer.arm.com/architectures/instruction-sets/intrinsics/
|
|
19
|
-
*/
|
|
20
|
-
#ifndef SIMSIMD_BINARY_H
|
|
21
|
-
#define SIMSIMD_BINARY_H
|
|
22
|
-
|
|
23
|
-
#include "types.h"
|
|
24
|
-
|
|
25
|
-
#ifdef __cplusplus
|
|
26
|
-
extern "C" {
|
|
27
|
-
#endif
|
|
28
|
-
|
|
29
|
-
inline static unsigned char simsimd_popcount_b8(simsimd_b8_t x) {
|
|
30
|
-
static unsigned char lookup_table[] = {
|
|
31
|
-
0, 1, 1, 2, 1, 2, 2, 3, 1, 2, 2, 3, 2, 3, 3, 4, 1, 2, 2, 3, 2, 3, 3, 4, 2, 3, 3, 4, 3, 4, 4, 5, //
|
|
32
|
-
1, 2, 2, 3, 2, 3, 3, 4, 2, 3, 3, 4, 3, 4, 4, 5, 2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6,
|
|
33
|
-
1, 2, 2, 3, 2, 3, 3, 4, 2, 3, 3, 4, 3, 4, 4, 5, 2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6,
|
|
34
|
-
2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6, 3, 4, 4, 5, 4, 5, 5, 6, 4, 5, 5, 6, 5, 6, 6, 7,
|
|
35
|
-
1, 2, 2, 3, 2, 3, 3, 4, 2, 3, 3, 4, 3, 4, 4, 5, 2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6,
|
|
36
|
-
2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6, 3, 4, 4, 5, 4, 5, 5, 6, 4, 5, 5, 6, 5, 6, 6, 7,
|
|
37
|
-
2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6, 3, 4, 4, 5, 4, 5, 5, 6, 4, 5, 5, 6, 5, 6, 6, 7,
|
|
38
|
-
3, 4, 4, 5, 4, 5, 5, 6, 4, 5, 5, 6, 5, 6, 6, 7, 4, 5, 5, 6, 5, 6, 6, 7, 5, 6, 6, 7, 6, 7, 7, 8};
|
|
39
|
-
return lookup_table[x];
|
|
40
|
-
}
|
|
41
|
-
|
|
42
|
-
inline static simsimd_f32_t simsimd_serial_b8_hamming( //
|
|
43
|
-
simsimd_b8_t const* a, simsimd_b8_t const* b, simsimd_size_t n_words) {
|
|
44
|
-
simsimd_i32_t differences = 0;
|
|
45
|
-
for (simsimd_size_t i = 0; i != n_words; ++i)
|
|
46
|
-
differences += simsimd_popcount_b8(a[i] ^ b[i]);
|
|
47
|
-
return (simsimd_f32_t)differences;
|
|
48
|
-
}
|
|
49
|
-
|
|
50
|
-
inline static simsimd_f32_t simsimd_serial_b8_jaccard( //
|
|
51
|
-
simsimd_b8_t const* a, simsimd_b8_t const* b, simsimd_size_t n_words) {
|
|
52
|
-
simsimd_i32_t intersection = 0, union_ = 0;
|
|
53
|
-
for (simsimd_size_t i = 0; i != n_words; ++i)
|
|
54
|
-
intersection += simsimd_popcount_b8(a[i] & b[i]), union_ += simsimd_popcount_b8(a[i] | b[i]);
|
|
55
|
-
return (union_ != 0) ? 1 - (simsimd_f32_t)intersection / (simsimd_f32_t)union_ : 0;
|
|
56
|
-
}
|
|
57
|
-
|
|
58
|
-
#if SIMSIMD_TARGET_ARM
|
|
59
|
-
#if SIMSIMD_TARGET_ARM_NEON
|
|
60
|
-
|
|
61
|
-
__attribute__((target("+simd"))) //
|
|
62
|
-
inline static simsimd_f32_t
|
|
63
|
-
simsimd_neon_b8_hamming(simsimd_b8_t const* a, simsimd_b8_t const* b, simsimd_size_t n_words) {
|
|
64
|
-
simsimd_i32_t differences = 0;
|
|
65
|
-
simsimd_size_t i = 0;
|
|
66
|
-
for (; i + 16 <= n_words; i += 16) {
|
|
67
|
-
uint8x16_t a_first = vld1q_u8(a + i);
|
|
68
|
-
uint8x16_t b_first = vld1q_u8(b + i);
|
|
69
|
-
differences += vaddvq_u8(vcntq_u8(veorq_u8(a_first, b_first)));
|
|
70
|
-
}
|
|
71
|
-
// Handle the tail
|
|
72
|
-
for (; i != n_words; ++i)
|
|
73
|
-
differences += simsimd_popcount_b8(a[i] ^ b[i]);
|
|
74
|
-
return (simsimd_f32_t)differences;
|
|
75
|
-
}
|
|
76
|
-
|
|
77
|
-
__attribute__((target("+simd"))) //
|
|
78
|
-
inline static simsimd_f32_t
|
|
79
|
-
simsimd_neon_b8_jaccard(simsimd_b8_t const* a, simsimd_b8_t const* b, simsimd_size_t n_words) {
|
|
80
|
-
simsimd_i32_t intersection = 0, union_ = 0;
|
|
81
|
-
simsimd_size_t i = 0;
|
|
82
|
-
for (; i + 16 <= n_words; i += 16) {
|
|
83
|
-
uint8x16_t a_first = vld1q_u8(a + i);
|
|
84
|
-
uint8x16_t b_first = vld1q_u8(b + i);
|
|
85
|
-
intersection += vaddvq_u8(vcntq_u8(vandq_u8(a_first, b_first)));
|
|
86
|
-
union_ += vaddvq_u8(vcntq_u8(vorrq_u8(a_first, b_first)));
|
|
87
|
-
}
|
|
88
|
-
// Handle the tail
|
|
89
|
-
for (; i != n_words; ++i)
|
|
90
|
-
intersection += simsimd_popcount_b8(a[i] & b[i]), union_ += simsimd_popcount_b8(a[i] | b[i]);
|
|
91
|
-
return (union_ != 0) ? 1 - (simsimd_f32_t)intersection / (simsimd_f32_t)union_ : 0;
|
|
92
|
-
}
|
|
93
|
-
|
|
94
|
-
#endif // SIMSIMD_TARGET_ARM_NEON
|
|
95
|
-
|
|
96
|
-
#if SIMSIMD_TARGET_ARM_SVE
|
|
97
|
-
|
|
98
|
-
__attribute__((target("+sve"))) //
|
|
99
|
-
inline static simsimd_f32_t
|
|
100
|
-
simsimd_sve_b8_hamming(simsimd_b8_t const* a, simsimd_b8_t const* b, simsimd_size_t n_words) {
|
|
101
|
-
simsimd_size_t i = 0;
|
|
102
|
-
simsimd_i32_t differences = 0;
|
|
103
|
-
do {
|
|
104
|
-
svbool_t pg_vec = svwhilelt_b8((unsigned int)i, (unsigned int)n_words);
|
|
105
|
-
svuint8_t a_vec = svld1_u8(pg_vec, a + i);
|
|
106
|
-
svuint8_t b_vec = svld1_u8(pg_vec, b + i);
|
|
107
|
-
differences += svaddv_u8(svptrue_b8(), svcnt_u8_x(svptrue_b8(), sveor_u8_m(svptrue_b8(), a_vec, b_vec)));
|
|
108
|
-
i += svcntb();
|
|
109
|
-
} while (i < n_words);
|
|
110
|
-
return (simsimd_f32_t)differences;
|
|
111
|
-
}
|
|
112
|
-
|
|
113
|
-
__attribute__((target("+sve"))) //
|
|
114
|
-
inline static simsimd_f32_t
|
|
115
|
-
simsimd_sve_b8_jaccard(simsimd_b8_t const* a, simsimd_b8_t const* b, simsimd_size_t n_words) {
|
|
116
|
-
simsimd_size_t i = 0;
|
|
117
|
-
simsimd_i32_t intersection = 0, union_ = 0;
|
|
118
|
-
do {
|
|
119
|
-
svbool_t pg_vec = svwhilelt_b8((unsigned int)i, (unsigned int)n_words);
|
|
120
|
-
svuint8_t a_vec = svld1_u8(pg_vec, a + i);
|
|
121
|
-
svuint8_t b_vec = svld1_u8(pg_vec, b + i);
|
|
122
|
-
intersection += svaddv_u8(svptrue_b8(), svcnt_u8_x(svptrue_b8(), svand_u8_m(svptrue_b8(), a_vec, b_vec)));
|
|
123
|
-
union_ += svaddv_u8(svptrue_b8(), svcnt_u8_x(svptrue_b8(), svorr_u8_m(svptrue_b8(), a_vec, b_vec)));
|
|
124
|
-
i += svcntb();
|
|
125
|
-
} while (i < n_words);
|
|
126
|
-
return (union_ != 0) ? 1 - (simsimd_f32_t)intersection / (simsimd_f32_t)union_ : 0;
|
|
127
|
-
}
|
|
128
|
-
|
|
129
|
-
#endif // SIMSIMD_TARGET_ARM_SVE
|
|
130
|
-
|
|
131
|
-
#endif // SIMSIMD_TARGET_ARM
|
|
132
|
-
|
|
133
|
-
#if SIMSIMD_TARGET_X86
|
|
134
|
-
|
|
135
|
-
#if SIMSIMD_TARGET_X86_AVX512
|
|
136
|
-
|
|
137
|
-
__attribute__((target("avx512vpopcntdq,avx512vl,avx512bw,avx512f,bmi2"))) //
|
|
138
|
-
inline static simsimd_f32_t
|
|
139
|
-
simsimd_avx512_b8_hamming(simsimd_b8_t const* a, simsimd_b8_t const* b, simsimd_size_t n_words) {
|
|
140
|
-
__m512i differences_vec = _mm512_setzero_si512();
|
|
141
|
-
__m512i a_vec, b_vec;
|
|
142
|
-
|
|
143
|
-
simsimd_avx512_b8_hamming_cycle:
|
|
144
|
-
if (n_words < 64) {
|
|
145
|
-
__mmask64 mask = _bzhi_u64(0xFFFFFFFFFFFFFFFF, n_words);
|
|
146
|
-
a_vec = _mm512_maskz_loadu_epi8(mask, a);
|
|
147
|
-
b_vec = _mm512_maskz_loadu_epi8(mask, b);
|
|
148
|
-
n_words = 0;
|
|
149
|
-
} else {
|
|
150
|
-
a_vec = _mm512_loadu_epi8(a);
|
|
151
|
-
b_vec = _mm512_loadu_epi8(b);
|
|
152
|
-
a += 64, b += 64, n_words -= 64;
|
|
153
|
-
}
|
|
154
|
-
__m512i xor_vec = _mm512_xor_si512(a_vec, b_vec);
|
|
155
|
-
differences_vec = _mm512_add_epi64(differences_vec, _mm512_popcnt_epi64(xor_vec));
|
|
156
|
-
if (n_words)
|
|
157
|
-
goto simsimd_avx512_b8_hamming_cycle;
|
|
158
|
-
|
|
159
|
-
simsimd_size_t differences = _mm512_reduce_add_epi64(differences_vec);
|
|
160
|
-
return (simsimd_f32_t)differences;
|
|
161
|
-
}
|
|
162
|
-
|
|
163
|
-
__attribute__((target("avx512vpopcntdq,avx512vl,avx512bw,avx512f,bmi2"))) //
|
|
164
|
-
inline static simsimd_f32_t
|
|
165
|
-
simsimd_avx512_b8_jaccard(simsimd_b8_t const* a, simsimd_b8_t const* b, simsimd_size_t n_words) {
|
|
166
|
-
__m512i intersection_vec = _mm512_setzero_si512(), union_vec = _mm512_setzero_si512();
|
|
167
|
-
__m512i a_vec, b_vec;
|
|
168
|
-
|
|
169
|
-
simsimd_avx512_b8_jaccard_cycle:
|
|
170
|
-
if (n_words < 64) {
|
|
171
|
-
__mmask64 mask = _bzhi_u64(0xFFFFFFFFFFFFFFFF, n_words);
|
|
172
|
-
a_vec = _mm512_maskz_loadu_epi8(mask, a);
|
|
173
|
-
b_vec = _mm512_maskz_loadu_epi8(mask, b);
|
|
174
|
-
n_words = 0;
|
|
175
|
-
} else {
|
|
176
|
-
a_vec = _mm512_loadu_epi8(a);
|
|
177
|
-
b_vec = _mm512_loadu_epi8(b);
|
|
178
|
-
a += 64, b += 64, n_words -= 64;
|
|
179
|
-
}
|
|
180
|
-
__m512i and_vec = _mm512_and_si512(a_vec, b_vec);
|
|
181
|
-
__m512i or_vec = _mm512_or_si512(a_vec, b_vec);
|
|
182
|
-
intersection_vec = _mm512_add_epi64(intersection_vec, _mm512_popcnt_epi64(and_vec));
|
|
183
|
-
union_vec = _mm512_add_epi64(union_vec, _mm512_popcnt_epi64(or_vec));
|
|
184
|
-
if (n_words)
|
|
185
|
-
goto simsimd_avx512_b8_jaccard_cycle;
|
|
186
|
-
|
|
187
|
-
simsimd_size_t intersection = _mm512_reduce_add_epi64(intersection_vec),
|
|
188
|
-
union_ = _mm512_reduce_add_epi64(union_vec);
|
|
189
|
-
return (union_ != 0) ? 1 - (simsimd_f32_t)intersection / (simsimd_f32_t)union_ : 0;
|
|
190
|
-
}
|
|
191
|
-
|
|
192
|
-
#endif // SIMSIMD_TARGET_X86_AVX512
|
|
193
|
-
#endif // SIMSIMD_TARGET_X86
|
|
194
|
-
|
|
195
|
-
#undef popcount64
|
|
196
|
-
|
|
197
|
-
#ifdef __cplusplus
|
|
198
|
-
}
|
|
199
|
-
#endif
|
|
200
|
-
|
|
201
|
-
#endif
|