usearch 2.15.3 → 2.16.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.
Files changed (48) hide show
  1. package/README.md +1 -1
  2. package/cpp/test.cpp +16 -0
  3. package/include/usearch/index.hpp +21 -5
  4. package/include/usearch/index_dense.hpp +6 -1
  5. package/include/usearch/index_plugins.hpp +345 -8
  6. package/javascript/lib.cpp +17 -5
  7. package/javascript/usearch.test.js +190 -21
  8. package/package.json +1 -1
  9. package/prebuilds/darwin-arm64+x64/usearch.node +0 -0
  10. package/prebuilds/linux-arm64/usearch.node +0 -0
  11. package/prebuilds/linux-x64/usearch.node +0 -0
  12. package/simsimd/.git-blame-ignore-revs +2 -0
  13. package/simsimd/CONTRIBUTING.md +71 -23
  14. package/simsimd/Cargo.lock +1 -1
  15. package/simsimd/Cargo.toml +4 -4
  16. package/simsimd/MANIFEST.in +2 -1
  17. package/simsimd/Package.swift +15 -3
  18. package/simsimd/README.md +104 -35
  19. package/simsimd/binding.gyp +6 -2
  20. package/simsimd/build.rs +2 -0
  21. package/simsimd/c/lib.c +180 -99
  22. package/simsimd/include/simsimd/binary.h +311 -102
  23. package/simsimd/include/simsimd/curved.h +134 -135
  24. package/simsimd/include/simsimd/dot.h +448 -274
  25. package/simsimd/include/simsimd/elementwise.h +1437 -0
  26. package/simsimd/include/simsimd/geospatial.h +2 -2
  27. package/simsimd/include/simsimd/mesh.h +2 -2
  28. package/simsimd/include/simsimd/probability.h +88 -88
  29. package/simsimd/include/simsimd/simsimd.h +1157 -772
  30. package/simsimd/include/simsimd/sparse.h +768 -147
  31. package/simsimd/include/simsimd/spatial.h +955 -376
  32. package/simsimd/include/simsimd/types.h +145 -71
  33. package/simsimd/javascript/lib.c +1 -2
  34. package/simsimd/package.json +4 -4
  35. package/simsimd/rust/lib.rs +14 -1
  36. package/simsimd/scripts/bench.cxx +1070 -0
  37. package/simsimd/scripts/bench.ipynb +187 -0
  38. package/simsimd/{javascript → scripts}/bench.js +1 -1
  39. package/simsimd/{rust/benches/sqeuclidean.rs → scripts/bench_sqeuclidean.rs} +6 -6
  40. package/simsimd/scripts/bench_vectors.py +700 -0
  41. package/simsimd/scripts/bench_vectors_live.py +213 -0
  42. package/simsimd/scripts/test.c +155 -0
  43. package/simsimd/{javascript → scripts}/test.mjs +2 -2
  44. package/simsimd/scripts/test.py +1410 -0
  45. package/simsimd/swift/{source/SimSIMD.swift → SimSIMD.swift} +6 -2
  46. package/simsimd/swift/{tests/SimSIMDTests.swift → Test.swift} +1 -1
  47. /package/simsimd/{rust/benches/cosine.rs → scripts/bench_cosine.rs} +0 -0
  48. /package/simsimd/{rust/benches/native.rs → scripts/bench_native.rs} +0 -0
package/simsimd/c/lib.c CHANGED
@@ -38,6 +38,12 @@
38
38
  #if !defined(SIMSIMD_TARGET_SAPPHIRE) && (defined(__linux__))
39
39
  #define SIMSIMD_TARGET_SAPPHIRE 1
40
40
  #endif
41
+ #if !defined(SIMSIMD_TARGET_TURIN) && (defined(__linux__))
42
+ #define SIMSIMD_TARGET_TURIN 1
43
+ #endif
44
+ #if !defined(SIMSIMD_TARGET_SIERRA) && (defined(__linux__)) && 0 // TODO: Add target spec to GCC & Clang
45
+ #define SIMSIMD_TARGET_SIERRA 1
46
+ #endif
41
47
 
42
48
  #include <simsimd/simsimd.h>
43
49
 
@@ -49,59 +55,89 @@ extern "C" {
49
55
  // If no metric is found, it returns NaN. We can obtain NaN by dividing 0.0 by 0.0, but that annoys
50
56
  // the MSVC compiler. Instead we can directly write-in the signaling NaN (0x7FF0000000000001)
51
57
  // or the qNaN (0x7FF8000000000000).
52
- #define SIMSIMD_DECLARATION_DENSE(name, extension, type) \
53
- SIMSIMD_DYNAMIC void simsimd_##name##_##extension(simsimd_##type##_t const* a, simsimd_##type##_t const* b, \
54
- simsimd_size_t n, simsimd_distance_t* results) { \
55
- static simsimd_metric_punned_t metric = 0; \
56
- if (metric == 0) { \
57
- simsimd_capability_t used_capability; \
58
- simsimd_find_metric_punned(simsimd_metric_##name##_k, simsimd_datatype_##extension##_k, \
59
- simsimd_capabilities(), simsimd_cap_any_k, &metric, &used_capability); \
60
- if (!metric) { \
61
- *(simsimd_u64_t*)results = 0x7FF0000000000001ull; \
62
- return; \
63
- } \
64
- } \
65
- metric(a, b, n, results); \
58
+ #define SIMSIMD_DECLARATION_DENSE(name, extension, type) \
59
+ SIMSIMD_DYNAMIC void simsimd_##name##_##extension(simsimd_##type##_t const *a, simsimd_##type##_t const *b, \
60
+ simsimd_size_t n, simsimd_distance_t *results) { \
61
+ static simsimd_metric_punned_t metric = 0; \
62
+ if (metric == 0) { \
63
+ simsimd_capability_t used_capability; \
64
+ simsimd_find_metric_punned(simsimd_metric_##name##_k, simsimd_datatype_##extension##_k, \
65
+ simsimd_capabilities(), simsimd_cap_any_k, &metric, &used_capability); \
66
+ if (!metric) { \
67
+ *(simsimd_u64_t *)results = 0x7FF0000000000001ull; \
68
+ return; \
69
+ } \
70
+ } \
71
+ metric(a, b, n, results); \
72
+ }
73
+
74
+ #define SIMSIMD_DECLARATION_SPARSE(name, extension, type) \
75
+ SIMSIMD_DYNAMIC void simsimd_##name##_##extension(simsimd_##type##_t const *a, simsimd_##type##_t const *b, \
76
+ simsimd_size_t a_length, simsimd_size_t b_length, \
77
+ simsimd_distance_t *result) { \
78
+ static simsimd_metric_sparse_punned_t metric = 0; \
79
+ if (metric == 0) { \
80
+ simsimd_capability_t used_capability; \
81
+ simsimd_find_metric_punned(simsimd_metric_##name##_k, simsimd_datatype_##extension##_k, \
82
+ simsimd_capabilities(), simsimd_cap_any_k, \
83
+ (simsimd_metric_punned_t *)(&metric), &used_capability); \
84
+ if (!metric) { \
85
+ *(simsimd_u64_t *)result = 0x7FF0000000000001ull; \
86
+ return; \
87
+ } \
88
+ } \
89
+ metric(a, b, a_length, b_length, result); \
66
90
  }
67
91
 
68
- #define SIMSIMD_DECLARATION_SPARSE(name, extension, type) \
69
- SIMSIMD_DYNAMIC void simsimd_##name##_##extension(simsimd_##type##_t const* a, simsimd_##type##_t const* b, \
70
- simsimd_size_t a_length, simsimd_size_t b_length, \
71
- simsimd_distance_t* result) { \
72
- static simsimd_metric_sparse_punned_t metric = 0; \
73
- if (metric == 0) { \
74
- simsimd_capability_t used_capability; \
75
- simsimd_find_metric_punned(simsimd_metric_##name##_k, simsimd_datatype_##extension##_k, \
76
- simsimd_capabilities(), simsimd_cap_any_k, (simsimd_metric_punned_t*)(&metric), \
77
- &used_capability); \
78
- if (!metric) { \
79
- *(simsimd_u64_t*)result = 0x7FF0000000000001ull; \
80
- return; \
81
- } \
82
- } \
83
- metric(a, b, a_length, b_length, result); \
92
+ #define SIMSIMD_DECLARATION_CURVED(name, extension, type) \
93
+ SIMSIMD_DYNAMIC void simsimd_##name##_##extension(simsimd_##type##_t const *a, simsimd_##type##_t const *b, \
94
+ simsimd_##type##_t const *c, simsimd_size_t n, \
95
+ simsimd_distance_t *result) { \
96
+ static simsimd_metric_curved_punned_t metric = 0; \
97
+ if (metric == 0) { \
98
+ simsimd_capability_t used_capability; \
99
+ simsimd_find_metric_punned(simsimd_metric_##name##_k, simsimd_datatype_##extension##_k, \
100
+ simsimd_capabilities(), simsimd_cap_any_k, \
101
+ (simsimd_metric_punned_t *)(&metric), &used_capability); \
102
+ if (!metric) { \
103
+ *(simsimd_u64_t *)result = 0x7FF0000000000001ull; \
104
+ return; \
105
+ } \
106
+ } \
107
+ metric(a, b, c, n, result); \
84
108
  }
85
109
 
86
- #define SIMSIMD_DECLARATION_CURVED(name, extension, type) \
87
- SIMSIMD_DYNAMIC void simsimd_##name##_##extension(simsimd_##type##_t const* a, simsimd_##type##_t const* b, \
88
- simsimd_##type##_t const* c, simsimd_size_t n, \
89
- simsimd_distance_t* result) { \
90
- static simsimd_metric_curved_punned_t metric = 0; \
91
- if (metric == 0) { \
92
- simsimd_capability_t used_capability; \
93
- simsimd_find_metric_punned(simsimd_metric_##name##_k, simsimd_datatype_##extension##_k, \
94
- simsimd_capabilities(), simsimd_cap_any_k, (simsimd_metric_punned_t*)(&metric), \
95
- &used_capability); \
96
- if (!metric) { \
97
- *(simsimd_u64_t*)result = 0x7FF0000000000001ull; \
98
- return; \
99
- } \
100
- } \
101
- metric(a, b, c, n, result); \
110
+ #define SIMSIMD_DECLARATION_FMA(name, extension, type) \
111
+ SIMSIMD_DYNAMIC void simsimd_##name##_##extension( \
112
+ simsimd_##type##_t const *a, simsimd_##type##_t const *b, simsimd_##type##_t const *c, simsimd_size_t n, \
113
+ simsimd_distance_t alpha, simsimd_distance_t beta, simsimd_##type##_t *result) { \
114
+ static simsimd_kernel_fma_punned_t metric = 0; \
115
+ if (metric == 0) { \
116
+ simsimd_capability_t used_capability; \
117
+ simsimd_find_metric_punned(simsimd_metric_##name##_k, simsimd_datatype_##extension##_k, \
118
+ simsimd_capabilities(), simsimd_cap_any_k, \
119
+ (simsimd_metric_punned_t *)(&metric), &used_capability); \
120
+ } \
121
+ metric(a, b, c, n, alpha, beta, result); \
122
+ }
123
+
124
+ #define SIMSIMD_DECLARATION_WSUM(name, extension, type) \
125
+ SIMSIMD_DYNAMIC void simsimd_##name##_##extension(simsimd_##type##_t const *a, simsimd_##type##_t const *b, \
126
+ simsimd_size_t n, simsimd_distance_t alpha, \
127
+ simsimd_distance_t beta, simsimd_##type##_t *result) { \
128
+ static simsimd_kernel_wsum_punned_t metric = 0; \
129
+ if (metric == 0) { \
130
+ simsimd_capability_t used_capability; \
131
+ simsimd_find_metric_punned(simsimd_metric_##name##_k, simsimd_datatype_##extension##_k, \
132
+ simsimd_capabilities(), simsimd_cap_any_k, \
133
+ (simsimd_metric_punned_t *)(&metric), &used_capability); \
134
+ } \
135
+ metric(a, b, n, alpha, beta, result); \
102
136
  }
103
137
 
104
138
  // Dot products
139
+ SIMSIMD_DECLARATION_DENSE(dot, i8, i8)
140
+ SIMSIMD_DECLARATION_DENSE(dot, u8, u8)
105
141
  SIMSIMD_DECLARATION_DENSE(dot, f16, f16)
106
142
  SIMSIMD_DECLARATION_DENSE(dot, bf16, bf16)
107
143
  SIMSIMD_DECLARATION_DENSE(dot, f32, f32)
@@ -117,16 +153,19 @@ SIMSIMD_DECLARATION_DENSE(vdot, f64c, f64)
117
153
 
118
154
  // Spatial distances
119
155
  SIMSIMD_DECLARATION_DENSE(cos, i8, i8)
156
+ SIMSIMD_DECLARATION_DENSE(cos, u8, u8)
120
157
  SIMSIMD_DECLARATION_DENSE(cos, f16, f16)
121
158
  SIMSIMD_DECLARATION_DENSE(cos, bf16, bf16)
122
159
  SIMSIMD_DECLARATION_DENSE(cos, f32, f32)
123
160
  SIMSIMD_DECLARATION_DENSE(cos, f64, f64)
124
161
  SIMSIMD_DECLARATION_DENSE(l2sq, i8, i8)
162
+ SIMSIMD_DECLARATION_DENSE(l2sq, u8, u8)
125
163
  SIMSIMD_DECLARATION_DENSE(l2sq, f16, f16)
126
164
  SIMSIMD_DECLARATION_DENSE(l2sq, bf16, bf16)
127
165
  SIMSIMD_DECLARATION_DENSE(l2sq, f32, f32)
128
166
  SIMSIMD_DECLARATION_DENSE(l2sq, f64, f64)
129
167
  SIMSIMD_DECLARATION_DENSE(l2, i8, i8)
168
+ SIMSIMD_DECLARATION_DENSE(l2, u8, u8)
130
169
  SIMSIMD_DECLARATION_DENSE(l2, f16, f16)
131
170
  SIMSIMD_DECLARATION_DENSE(l2, bf16, bf16)
132
171
  SIMSIMD_DECLARATION_DENSE(l2, f32, f32)
@@ -160,6 +199,20 @@ SIMSIMD_DECLARATION_CURVED(mahalanobis, f16, f16)
160
199
  SIMSIMD_DECLARATION_CURVED(bilinear, bf16, bf16)
161
200
  SIMSIMD_DECLARATION_CURVED(mahalanobis, bf16, bf16)
162
201
 
202
+ // Element-wise operations
203
+ SIMSIMD_DECLARATION_FMA(fma, f64, f64)
204
+ SIMSIMD_DECLARATION_FMA(fma, f32, f32)
205
+ SIMSIMD_DECLARATION_FMA(fma, f16, f16)
206
+ SIMSIMD_DECLARATION_FMA(fma, bf16, bf16)
207
+ SIMSIMD_DECLARATION_FMA(fma, i8, i8)
208
+ SIMSIMD_DECLARATION_FMA(fma, u8, u8)
209
+ SIMSIMD_DECLARATION_WSUM(wsum, f64, f64)
210
+ SIMSIMD_DECLARATION_WSUM(wsum, f32, f32)
211
+ SIMSIMD_DECLARATION_WSUM(wsum, f16, f16)
212
+ SIMSIMD_DECLARATION_WSUM(wsum, bf16, bf16)
213
+ SIMSIMD_DECLARATION_WSUM(wsum, i8, i8)
214
+ SIMSIMD_DECLARATION_WSUM(wsum, u8, u8)
215
+
163
216
  SIMSIMD_DYNAMIC int simsimd_uses_neon(void) { return (simsimd_capabilities() & simsimd_cap_neon_k) != 0; }
164
217
  SIMSIMD_DYNAMIC int simsimd_uses_neon_f16(void) { return (simsimd_capabilities() & simsimd_cap_neon_f16_k) != 0; }
165
218
  SIMSIMD_DYNAMIC int simsimd_uses_neon_bf16(void) { return (simsimd_capabilities() & simsimd_cap_neon_bf16_k) != 0; }
@@ -173,12 +226,14 @@ SIMSIMD_DYNAMIC int simsimd_uses_skylake(void) { return (simsimd_capabilities()
173
226
  SIMSIMD_DYNAMIC int simsimd_uses_ice(void) { return (simsimd_capabilities() & simsimd_cap_ice_k) != 0; }
174
227
  SIMSIMD_DYNAMIC int simsimd_uses_genoa(void) { return (simsimd_capabilities() & simsimd_cap_genoa_k) != 0; }
175
228
  SIMSIMD_DYNAMIC int simsimd_uses_sapphire(void) { return (simsimd_capabilities() & simsimd_cap_sapphire_k) != 0; }
229
+ SIMSIMD_DYNAMIC int simsimd_uses_turin(void) { return (simsimd_capabilities() & simsimd_cap_turin_k) != 0; }
230
+ SIMSIMD_DYNAMIC int simsimd_uses_sierra(void) { return (simsimd_capabilities() & simsimd_cap_sierra_k) != 0; }
176
231
  SIMSIMD_DYNAMIC int simsimd_uses_dynamic_dispatch(void) { return 1; }
177
232
 
178
233
  SIMSIMD_DYNAMIC simsimd_capability_t simsimd_capabilities(void) {
234
+ //! The latency of the CPUID instruction can be over 100 cycles, so we cache the result.
179
235
  static simsimd_capability_t static_capabilities = simsimd_cap_any_k;
180
- if (static_capabilities != simsimd_cap_any_k)
181
- return static_capabilities;
236
+ if (static_capabilities != simsimd_cap_any_k) return static_capabilities;
182
237
 
183
238
  static_capabilities = _simsimd_capabilities_implementation();
184
239
 
@@ -186,61 +241,87 @@ SIMSIMD_DYNAMIC simsimd_capability_t simsimd_capabilities(void) {
186
241
  // so the first time we are probing for capabilities, we should also probe all of our metrics
187
242
  // with dummy inputs:
188
243
  simsimd_distance_t dummy_results_buffer[2];
189
- simsimd_distance_t* dummy_results = &dummy_results_buffer[0];
190
- void* dummy = 0;
244
+ simsimd_distance_t *dummy_results = &dummy_results_buffer[0];
245
+ void *x = 0;
191
246
 
192
247
  // Dense:
193
- simsimd_dot_f16((simsimd_f16_t*)dummy, (simsimd_f16_t*)dummy, 0, dummy_results);
194
- simsimd_dot_bf16((simsimd_bf16_t*)dummy, (simsimd_bf16_t*)dummy, 0, dummy_results);
195
- simsimd_dot_f32((simsimd_f32_t*)dummy, (simsimd_f32_t*)dummy, 0, dummy_results);
196
- simsimd_dot_f64((simsimd_f64_t*)dummy, (simsimd_f64_t*)dummy, 0, dummy_results);
197
- simsimd_dot_f16c((simsimd_f16_t*)dummy, (simsimd_f16_t*)dummy, 0, dummy_results);
198
- simsimd_dot_bf16c((simsimd_bf16_t*)dummy, (simsimd_bf16_t*)dummy, 0, dummy_results);
199
- simsimd_dot_f32c((simsimd_f32_t*)dummy, (simsimd_f32_t*)dummy, 0, dummy_results);
200
- simsimd_dot_f64c((simsimd_f64_t*)dummy, (simsimd_f64_t*)dummy, 0, dummy_results);
201
- simsimd_vdot_f16c((simsimd_f16_t*)dummy, (simsimd_f16_t*)dummy, 0, dummy_results);
202
- simsimd_vdot_bf16c((simsimd_bf16_t*)dummy, (simsimd_bf16_t*)dummy, 0, dummy_results);
203
- simsimd_vdot_f32c((simsimd_f32_t*)dummy, (simsimd_f32_t*)dummy, 0, dummy_results);
204
- simsimd_vdot_f64c((simsimd_f64_t*)dummy, (simsimd_f64_t*)dummy, 0, dummy_results);
205
- simsimd_cos_i8((simsimd_i8_t*)dummy, (simsimd_i8_t*)dummy, 0, dummy_results);
206
- simsimd_cos_f16((simsimd_f16_t*)dummy, (simsimd_f16_t*)dummy, 0, dummy_results);
207
- simsimd_cos_bf16((simsimd_bf16_t*)dummy, (simsimd_bf16_t*)dummy, 0, dummy_results);
208
- simsimd_cos_f32((simsimd_f32_t*)dummy, (simsimd_f32_t*)dummy, 0, dummy_results);
209
- simsimd_cos_f64((simsimd_f64_t*)dummy, (simsimd_f64_t*)dummy, 0, dummy_results);
210
- simsimd_l2sq_i8((simsimd_i8_t*)dummy, (simsimd_i8_t*)dummy, 0, dummy_results);
211
- simsimd_l2sq_f16((simsimd_f16_t*)dummy, (simsimd_f16_t*)dummy, 0, dummy_results);
212
- simsimd_l2sq_bf16((simsimd_bf16_t*)dummy, (simsimd_bf16_t*)dummy, 0, dummy_results);
213
- simsimd_l2sq_f32((simsimd_f32_t*)dummy, (simsimd_f32_t*)dummy, 0, dummy_results);
214
- simsimd_l2sq_f64((simsimd_f64_t*)dummy, (simsimd_f64_t*)dummy, 0, dummy_results);
215
- simsimd_l2_i8((simsimd_i8_t*)dummy, (simsimd_i8_t*)dummy, 0, dummy_results);
216
- simsimd_l2_f16((simsimd_f16_t*)dummy, (simsimd_f16_t*)dummy, 0, dummy_results);
217
- simsimd_l2_bf16((simsimd_bf16_t*)dummy, (simsimd_bf16_t*)dummy, 0, dummy_results);
218
- simsimd_l2_f32((simsimd_f32_t*)dummy, (simsimd_f32_t*)dummy, 0, dummy_results);
219
- simsimd_l2_f64((simsimd_f64_t*)dummy, (simsimd_f64_t*)dummy, 0, dummy_results);
220
- simsimd_hamming_b8((simsimd_b8_t*)dummy, (simsimd_b8_t*)dummy, 0, dummy_results);
221
- simsimd_jaccard_b8((simsimd_b8_t*)dummy, (simsimd_b8_t*)dummy, 0, dummy_results);
222
- simsimd_kl_f16((simsimd_f16_t*)dummy, (simsimd_f16_t*)dummy, 0, dummy_results);
223
- simsimd_kl_bf16((simsimd_bf16_t*)dummy, (simsimd_bf16_t*)dummy, 0, dummy_results);
224
- simsimd_kl_f32((simsimd_f32_t*)dummy, (simsimd_f32_t*)dummy, 0, dummy_results);
225
- simsimd_kl_f64((simsimd_f64_t*)dummy, (simsimd_f64_t*)dummy, 0, dummy_results);
226
- simsimd_js_f16((simsimd_f16_t*)dummy, (simsimd_f16_t*)dummy, 0, dummy_results);
227
- simsimd_js_bf16((simsimd_bf16_t*)dummy, (simsimd_bf16_t*)dummy, 0, dummy_results);
228
- simsimd_js_f32((simsimd_f32_t*)dummy, (simsimd_f32_t*)dummy, 0, dummy_results);
229
- simsimd_js_f64((simsimd_f64_t*)dummy, (simsimd_f64_t*)dummy, 0, dummy_results);
248
+ simsimd_dot_i8((simsimd_i8_t *)x, (simsimd_i8_t *)x, 0, dummy_results);
249
+ simsimd_dot_u8((simsimd_u8_t *)x, (simsimd_u8_t *)x, 0, dummy_results);
250
+ simsimd_dot_f16((simsimd_f16_t *)x, (simsimd_f16_t *)x, 0, dummy_results);
251
+ simsimd_dot_bf16((simsimd_bf16_t *)x, (simsimd_bf16_t *)x, 0, dummy_results);
252
+ simsimd_dot_f32((simsimd_f32_t *)x, (simsimd_f32_t *)x, 0, dummy_results);
253
+ simsimd_dot_f64((simsimd_f64_t *)x, (simsimd_f64_t *)x, 0, dummy_results);
254
+
255
+ simsimd_dot_f16c((simsimd_f16_t *)x, (simsimd_f16_t *)x, 0, dummy_results);
256
+ simsimd_dot_bf16c((simsimd_bf16_t *)x, (simsimd_bf16_t *)x, 0, dummy_results);
257
+ simsimd_dot_f32c((simsimd_f32_t *)x, (simsimd_f32_t *)x, 0, dummy_results);
258
+ simsimd_dot_f64c((simsimd_f64_t *)x, (simsimd_f64_t *)x, 0, dummy_results);
259
+ simsimd_vdot_f16c((simsimd_f16_t *)x, (simsimd_f16_t *)x, 0, dummy_results);
260
+ simsimd_vdot_bf16c((simsimd_bf16_t *)x, (simsimd_bf16_t *)x, 0, dummy_results);
261
+ simsimd_vdot_f32c((simsimd_f32_t *)x, (simsimd_f32_t *)x, 0, dummy_results);
262
+ simsimd_vdot_f64c((simsimd_f64_t *)x, (simsimd_f64_t *)x, 0, dummy_results);
263
+
264
+ simsimd_cos_i8((simsimd_i8_t *)x, (simsimd_i8_t *)x, 0, dummy_results);
265
+ simsimd_cos_u8((simsimd_u8_t *)x, (simsimd_u8_t *)x, 0, dummy_results);
266
+ simsimd_cos_f16((simsimd_f16_t *)x, (simsimd_f16_t *)x, 0, dummy_results);
267
+ simsimd_cos_bf16((simsimd_bf16_t *)x, (simsimd_bf16_t *)x, 0, dummy_results);
268
+ simsimd_cos_f32((simsimd_f32_t *)x, (simsimd_f32_t *)x, 0, dummy_results);
269
+ simsimd_cos_f64((simsimd_f64_t *)x, (simsimd_f64_t *)x, 0, dummy_results);
270
+
271
+ simsimd_l2sq_i8((simsimd_i8_t *)x, (simsimd_i8_t *)x, 0, dummy_results);
272
+ simsimd_l2sq_u8((simsimd_u8_t *)x, (simsimd_u8_t *)x, 0, dummy_results);
273
+ simsimd_l2sq_f16((simsimd_f16_t *)x, (simsimd_f16_t *)x, 0, dummy_results);
274
+ simsimd_l2sq_bf16((simsimd_bf16_t *)x, (simsimd_bf16_t *)x, 0, dummy_results);
275
+ simsimd_l2sq_f32((simsimd_f32_t *)x, (simsimd_f32_t *)x, 0, dummy_results);
276
+ simsimd_l2sq_f64((simsimd_f64_t *)x, (simsimd_f64_t *)x, 0, dummy_results);
277
+
278
+ simsimd_l2_i8((simsimd_i8_t *)x, (simsimd_i8_t *)x, 0, dummy_results);
279
+ simsimd_l2_i8((simsimd_i8_t *)x, (simsimd_i8_t *)x, 0, dummy_results);
280
+ simsimd_l2_u8((simsimd_u8_t *)x, (simsimd_u8_t *)x, 0, dummy_results);
281
+ simsimd_l2_f16((simsimd_f16_t *)x, (simsimd_f16_t *)x, 0, dummy_results);
282
+ simsimd_l2_bf16((simsimd_bf16_t *)x, (simsimd_bf16_t *)x, 0, dummy_results);
283
+ simsimd_l2_f32((simsimd_f32_t *)x, (simsimd_f32_t *)x, 0, dummy_results);
284
+ simsimd_l2_f64((simsimd_f64_t *)x, (simsimd_f64_t *)x, 0, dummy_results);
285
+
286
+ simsimd_hamming_b8((simsimd_b8_t *)x, (simsimd_b8_t *)x, 0, dummy_results);
287
+ simsimd_jaccard_b8((simsimd_b8_t *)x, (simsimd_b8_t *)x, 0, dummy_results);
288
+
289
+ simsimd_kl_f16((simsimd_f16_t *)x, (simsimd_f16_t *)x, 0, dummy_results);
290
+ simsimd_kl_bf16((simsimd_bf16_t *)x, (simsimd_bf16_t *)x, 0, dummy_results);
291
+ simsimd_kl_f32((simsimd_f32_t *)x, (simsimd_f32_t *)x, 0, dummy_results);
292
+ simsimd_kl_f64((simsimd_f64_t *)x, (simsimd_f64_t *)x, 0, dummy_results);
293
+ simsimd_js_f16((simsimd_f16_t *)x, (simsimd_f16_t *)x, 0, dummy_results);
294
+ simsimd_js_bf16((simsimd_bf16_t *)x, (simsimd_bf16_t *)x, 0, dummy_results);
295
+ simsimd_js_f32((simsimd_f32_t *)x, (simsimd_f32_t *)x, 0, dummy_results);
296
+ simsimd_js_f64((simsimd_f64_t *)x, (simsimd_f64_t *)x, 0, dummy_results);
230
297
 
231
298
  // Sparse
232
- simsimd_intersect_u16((simsimd_u16_t*)dummy, (simsimd_u16_t*)dummy, 0, 0, dummy_results);
233
- simsimd_intersect_u32((simsimd_u32_t*)dummy, (simsimd_u32_t*)dummy, 0, 0, dummy_results);
299
+ simsimd_intersect_u16((simsimd_u16_t *)x, (simsimd_u16_t *)x, 0, 0, dummy_results);
300
+ simsimd_intersect_u32((simsimd_u32_t *)x, (simsimd_u32_t *)x, 0, 0, dummy_results);
234
301
 
235
302
  // Curved:
236
- simsimd_bilinear_f64((simsimd_f64_t*)dummy, (simsimd_f64_t*)dummy, (simsimd_f64_t*)dummy, 0, dummy_results);
237
- simsimd_mahalanobis_f64((simsimd_f64_t*)dummy, (simsimd_f64_t*)dummy, (simsimd_f64_t*)dummy, 0, dummy_results);
238
- simsimd_bilinear_f32((simsimd_f32_t*)dummy, (simsimd_f32_t*)dummy, (simsimd_f32_t*)dummy, 0, dummy_results);
239
- simsimd_mahalanobis_f32((simsimd_f32_t*)dummy, (simsimd_f32_t*)dummy, (simsimd_f32_t*)dummy, 0, dummy_results);
240
- simsimd_bilinear_f16((simsimd_f16_t*)dummy, (simsimd_f16_t*)dummy, (simsimd_f16_t*)dummy, 0, dummy_results);
241
- simsimd_mahalanobis_f16((simsimd_f16_t*)dummy, (simsimd_f16_t*)dummy, (simsimd_f16_t*)dummy, 0, dummy_results);
242
- simsimd_bilinear_bf16((simsimd_bf16_t*)dummy, (simsimd_bf16_t*)dummy, (simsimd_bf16_t*)dummy, 0, dummy_results);
243
- simsimd_mahalanobis_bf16((simsimd_bf16_t*)dummy, (simsimd_bf16_t*)dummy, (simsimd_bf16_t*)dummy, 0, dummy_results);
303
+ simsimd_bilinear_f64((simsimd_f64_t *)x, (simsimd_f64_t *)x, (simsimd_f64_t *)x, 0, dummy_results);
304
+ simsimd_mahalanobis_f64((simsimd_f64_t *)x, (simsimd_f64_t *)x, (simsimd_f64_t *)x, 0, dummy_results);
305
+ simsimd_bilinear_f32((simsimd_f32_t *)x, (simsimd_f32_t *)x, (simsimd_f32_t *)x, 0, dummy_results);
306
+ simsimd_mahalanobis_f32((simsimd_f32_t *)x, (simsimd_f32_t *)x, (simsimd_f32_t *)x, 0, dummy_results);
307
+ simsimd_bilinear_f16((simsimd_f16_t *)x, (simsimd_f16_t *)x, (simsimd_f16_t *)x, 0, dummy_results);
308
+ simsimd_mahalanobis_f16((simsimd_f16_t *)x, (simsimd_f16_t *)x, (simsimd_f16_t *)x, 0, dummy_results);
309
+ simsimd_bilinear_bf16((simsimd_bf16_t *)x, (simsimd_bf16_t *)x, (simsimd_bf16_t *)x, 0, dummy_results);
310
+ simsimd_mahalanobis_bf16((simsimd_bf16_t *)x, (simsimd_bf16_t *)x, (simsimd_bf16_t *)x, 0, dummy_results);
311
+
312
+ // Elementwise
313
+ simsimd_wsum_f64((simsimd_f64_t *)x, (simsimd_f64_t *)x, 0, 0, 0, (simsimd_f64_t *)x);
314
+ simsimd_wsum_f32((simsimd_f32_t *)x, (simsimd_f32_t *)x, 0, 0, 0, (simsimd_f32_t *)x);
315
+ simsimd_wsum_f16((simsimd_f16_t *)x, (simsimd_f16_t *)x, 0, 0, 0, (simsimd_f16_t *)x);
316
+ simsimd_wsum_bf16((simsimd_bf16_t *)x, (simsimd_bf16_t *)x, 0, 0, 0, (simsimd_bf16_t *)x);
317
+ simsimd_wsum_i8((simsimd_i8_t *)x, (simsimd_i8_t *)x, 0, 0, 0, (simsimd_i8_t *)x);
318
+ simsimd_wsum_u8((simsimd_u8_t *)x, (simsimd_u8_t *)x, 0, 0, 0, (simsimd_u8_t *)x);
319
+ simsimd_fma_f64((simsimd_f64_t *)x, (simsimd_f64_t *)x, (simsimd_f64_t *)x, 0, 0, 0, (simsimd_f64_t *)x);
320
+ simsimd_fma_f32((simsimd_f32_t *)x, (simsimd_f32_t *)x, (simsimd_f32_t *)x, 0, 0, 0, (simsimd_f32_t *)x);
321
+ simsimd_fma_f16((simsimd_f16_t *)x, (simsimd_f16_t *)x, (simsimd_f16_t *)x, 0, 0, 0, (simsimd_f16_t *)x);
322
+ simsimd_fma_bf16((simsimd_bf16_t *)x, (simsimd_bf16_t *)x, (simsimd_bf16_t *)x, 0, 0, 0, (simsimd_bf16_t *)x);
323
+ simsimd_fma_i8((simsimd_i8_t *)x, (simsimd_i8_t *)x, (simsimd_i8_t *)x, 0, 0, 0, (simsimd_i8_t *)x);
324
+ simsimd_fma_u8((simsimd_u8_t *)x, (simsimd_u8_t *)x, (simsimd_u8_t *)x, 0, 0, 0, (simsimd_u8_t *)x);
244
325
 
245
326
  return static_capabilities;
246
327
  }
@@ -250,8 +331,8 @@ SIMSIMD_DYNAMIC void simsimd_find_metric_punned( //
250
331
  simsimd_datatype_t datatype, //
251
332
  simsimd_capability_t supported, //
252
333
  simsimd_capability_t allowed, //
253
- simsimd_metric_punned_t* metric_output, //
254
- simsimd_capability_t* capability_output) {
334
+ simsimd_metric_punned_t *metric_output, //
335
+ simsimd_capability_t *capability_output) {
255
336
  _simsimd_find_metric_punned_implementation(kind, datatype, supported, allowed, metric_output, capability_output);
256
337
  }
257
338