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.
Files changed (169) hide show
  1. package/README.md +50 -52
  2. package/javascript/{types → dist/cjs}/usearch.d.ts +90 -115
  3. package/javascript/dist/cjs/usearch.js +531 -0
  4. package/javascript/dist/esm/usearch.d.ts +212 -0
  5. package/javascript/{usearch.js → dist/esm/usearch.js} +202 -153
  6. package/package.json +25 -23
  7. package/prebuilds/darwin-arm64+x64/usearch.node +0 -0
  8. package/prebuilds/linux-arm64/usearch.node +0 -0
  9. package/prebuilds/linux-x64/usearch.node +0 -0
  10. package/prebuilds/win32-ia32/usearch.node +0 -0
  11. package/prebuilds/win32-x64/usearch.node +0 -0
  12. package/.clang-format +0 -10
  13. package/.clang-tidy +0 -60
  14. package/.cmake-format.py +0 -19
  15. package/.dockerignore +0 -93
  16. package/.gitattributes +0 -9
  17. package/.github/ISSUE_TEMPLATE/bug_report.yml +0 -90
  18. package/.github/ISSUE_TEMPLATE/config.yml +0 -5
  19. package/.github/ISSUE_TEMPLATE/feature_request.yml +0 -64
  20. package/.github/workflows/Dockerfile.libs +0 -36
  21. package/.github/workflows/prerelease.yml +0 -331
  22. package/.github/workflows/release.yml +0 -722
  23. package/.github/workflows/update_version.sh +0 -15
  24. package/.gitmodules +0 -9
  25. package/.releaserc +0 -90
  26. package/CITATION.cff +0 -11
  27. package/CMakeLists.txt +0 -324
  28. package/CODE_OF_CONDUCT.md +0 -128
  29. package/CONTRIBUTING.md +0 -353
  30. package/Cargo.toml +0 -19
  31. package/Dockerfile +0 -16
  32. package/VERSION +0 -1
  33. package/assets/unum.png +0 -0
  34. package/assets/usearch-approaches-transparent.png +0 -0
  35. package/assets/usearch-approaches-white.png +0 -0
  36. package/assets/usearch-neighbor-types.png +0 -0
  37. package/binding.gyp +0 -87
  38. package/build.gradle +0 -204
  39. package/build.rs +0 -18
  40. package/c/CMakeLists.txt +0 -25
  41. package/c/README.md +0 -34
  42. package/c/lib.cpp +0 -358
  43. package/c/test.c +0 -374
  44. package/c/usearch.h +0 -311
  45. package/cmake/clipp.cmake +0 -7
  46. package/cmake/config.cmake.in +0 -15
  47. package/cmake/emscripten.cmake +0 -8
  48. package/cmake/jemalloc.cmake +0 -62
  49. package/cmake/pkg-config.pc.in +0 -4
  50. package/cmake/usearchConfigVersion.cmake.in +0 -20
  51. package/conanfile.py +0 -26
  52. package/cpp/CMakeLists.txt +0 -14
  53. package/cpp/README.md +0 -161
  54. package/cpp/bench.cpp +0 -618
  55. package/cpp/test.cpp +0 -323
  56. package/fp16/CMakeLists.txt +0 -176
  57. package/fp16/LICENSE +0 -11
  58. package/fp16/README.md +0 -20
  59. package/fp16/bench/alt-element.cc +0 -89
  60. package/fp16/bench/from-alt-array.cc +0 -175
  61. package/fp16/bench/from-ieee-array.cc +0 -399
  62. package/fp16/bench/ieee-element.cc +0 -272
  63. package/fp16/bench/to-alt-array.cc +0 -91
  64. package/fp16/bench/to-ieee-array.cc +0 -303
  65. package/fp16/cmake/DownloadGoogleBenchmark.cmake +0 -15
  66. package/fp16/cmake/DownloadGoogleTest.cmake +0 -15
  67. package/fp16/cmake/DownloadPSimd.cmake +0 -15
  68. package/fp16/configure.py +0 -65
  69. package/fp16/confu.yaml +0 -8
  70. package/fp16/include/fp16/__init__.py +0 -0
  71. package/fp16/include/fp16/avx.py +0 -50
  72. package/fp16/include/fp16/avx2.py +0 -53
  73. package/fp16/include/fp16/bitcasts.h +0 -92
  74. package/fp16/include/fp16/fp16.h +0 -451
  75. package/fp16/include/fp16/psimd.h +0 -131
  76. package/fp16/include/fp16.h +0 -11
  77. package/fp16/jni/Android.mk +0 -6
  78. package/fp16/jni/Application.mk +0 -4
  79. package/fp16/test/alt-from-fp32-value.cc +0 -498
  80. package/fp16/test/alt-to-fp32-bits.cc +0 -263
  81. package/fp16/test/alt-to-fp32-psimd.cc +0 -145
  82. package/fp16/test/alt-to-fp32-value.cc +0 -348
  83. package/fp16/test/alt-to-fp32x2-psimd.cc +0 -245
  84. package/fp16/test/bitcasts.cc +0 -56
  85. package/fp16/test/ieee-from-fp32-value.cc +0 -523
  86. package/fp16/test/ieee-to-fp32-bits.cc +0 -333
  87. package/fp16/test/ieee-to-fp32-psimd.cc +0 -312
  88. package/fp16/test/ieee-to-fp32-value.cc +0 -420
  89. package/fp16/test/ieee-to-fp32x2-psimd.cc +0 -541
  90. package/fp16/test/peachpy/alt-xmm-to-fp32-xmm-avx.cc +0 -96
  91. package/fp16/test/peachpy/alt-xmm-to-fp32-ymm-avx2.cc +0 -96
  92. package/fp16/test/peachpy/stubs.py +0 -38
  93. package/fp16/test/tables.cc +0 -530
  94. package/fp16/test/tables.h +0 -13
  95. package/fp16/third-party/THHalf.h +0 -92
  96. package/fp16/third-party/eigen-half.h +0 -170
  97. package/fp16/third-party/float16-compressor.h +0 -80
  98. package/fp16/third-party/half.hpp +0 -2916
  99. package/fp16/third-party/npy-halffloat.h +0 -328
  100. package/include/usearch/index.hpp +0 -3836
  101. package/include/usearch/index_dense.hpp +0 -2004
  102. package/include/usearch/index_plugins.hpp +0 -2203
  103. package/javascript/lib.cpp +0 -341
  104. package/javascript/types/usearch.d.ts.map +0 -1
  105. package/javascript/usearch.test.js +0 -74
  106. package/package-ci.json +0 -10
  107. package/pyproject.toml +0 -51
  108. package/setup.py +0 -201
  109. package/simsimd/.releaserc +0 -86
  110. package/simsimd/Cargo.lock +0 -708
  111. package/simsimd/Cargo.toml +0 -36
  112. package/simsimd/LICENSE +0 -201
  113. package/simsimd/README.md +0 -275
  114. package/simsimd/binding.gyp +0 -36
  115. package/simsimd/build.rs +0 -20
  116. package/simsimd/include/simsimd/binary.h +0 -201
  117. package/simsimd/include/simsimd/probability.h +0 -548
  118. package/simsimd/include/simsimd/simsimd.h +0 -456
  119. package/simsimd/include/simsimd/spatial.h +0 -1175
  120. package/simsimd/include/simsimd/types.h +0 -207
  121. package/simsimd/javascript/bench.js +0 -127
  122. package/simsimd/javascript/fallback.ts +0 -193
  123. package/simsimd/javascript/lib.c +0 -102
  124. package/simsimd/javascript/node-gyp-build.d.ts +0 -1
  125. package/simsimd/javascript/simsimd.ts +0 -124
  126. package/simsimd/javascript/test.mjs +0 -153
  127. package/simsimd/javascript/tsconfig-base.json +0 -25
  128. package/simsimd/javascript/tsconfig-cjs.json +0 -8
  129. package/simsimd/javascript/tsconfig-esm.json +0 -8
  130. package/simsimd/package-lock.json +0 -1688
  131. package/simsimd/package.json +0 -61
  132. package/simsimd/rust/benches/cosine.rs +0 -27
  133. package/simsimd/rust/benches/native.rs +0 -27
  134. package/simsimd/rust/benches/sqeuclidean.rs +0 -27
  135. package/simsimd/rust/lib.c +0 -68
  136. package/simsimd/rust/lib.rs +0 -232
  137. package/sqlite/README.md +0 -178
  138. package/sqlite/lib.cpp +0 -325
  139. package/stringzilla/CONTRIBUTING.md +0 -429
  140. package/stringzilla/Cargo.lock +0 -25
  141. package/stringzilla/Cargo.toml +0 -26
  142. package/stringzilla/LICENSE +0 -201
  143. package/stringzilla/README.md +0 -1281
  144. package/stringzilla/VERSION +0 -1
  145. package/stringzilla/assets/cover-strinzilla.jpeg +0 -0
  146. package/stringzilla/assets/meme-stringzilla-v2.jpeg +0 -0
  147. package/stringzilla/assets/meme-stringzilla-v3.jpeg +0 -0
  148. package/stringzilla/binding.gyp +0 -16
  149. package/stringzilla/build.rs +0 -14
  150. package/stringzilla/c/lib.c +0 -304
  151. package/stringzilla/cli/README.md +0 -48
  152. package/stringzilla/cli/split.py +0 -72
  153. package/stringzilla/cli/wc.py +0 -37
  154. package/stringzilla/include/stringzilla/experimental.h +0 -724
  155. package/stringzilla/include/stringzilla/module.modulemap +0 -9
  156. package/stringzilla/include/stringzilla/stringzilla.h +0 -5240
  157. package/stringzilla/include/stringzilla/stringzilla.hpp +0 -3830
  158. package/stringzilla/javascript/lib.c +0 -125
  159. package/stringzilla/javascript/stringzilla.js +0 -22
  160. package/stringzilla/package-ci.json +0 -10
  161. package/stringzilla/package.json +0 -32
  162. package/stringzilla/rust/lib.rs +0 -362
  163. package/stringzilla/swift/StringProtocol+StringZilla.swift +0 -280
  164. package/stringzilla/swift/Test.swift +0 -60
  165. package/tsconfig.json +0 -21
  166. package/wasmer.toml +0 -12
  167. package/winlibinstaller.bat +0 -42
  168. /package/{simsimd/javascript/dist-package-cjs.json → javascript/dist/cjs/package.json} +0 -0
  169. /package/{simsimd/javascript/dist-package-esm.json → javascript/dist/esm/package.json} +0 -0
package/build.rs DELETED
@@ -1,18 +0,0 @@
1
- fn main() {
2
- cxx_build::bridge("rust/lib.rs")
3
- .file("rust/lib.cpp")
4
- .flag_if_supported("-std=c++11")
5
- .flag_if_supported("-Wno-unknown-pragmas")
6
- .include("include")
7
- .include("rust")
8
- .include("fp16/include")
9
- .include("simsimd/include")
10
- .compile("usearch");
11
-
12
- println!("cargo:rerun-if-changed=rust/lib.rs");
13
- println!("cargo:rerun-if-changed=rust/lib.cpp");
14
- println!("cargo:rerun-if-changed=rust/lib.hpp");
15
- println!("cargo:rerun-if-changed=include/index_plugins.hpp");
16
- println!("cargo:rerun-if-changed=include/index_dense.hpp");
17
- println!("cargo:rerun-if-changed=include/usearch/index.hpp");
18
- }
package/c/CMakeLists.txt DELETED
@@ -1,25 +0,0 @@
1
- if (USEARCH_BUILD_TEST_C)
2
- add_executable(test_c test.c lib.cpp)
3
- setup_target(test_c)
4
- include(CTest)
5
- enable_testing()
6
- add_test(NAME test_c COMMAND test_c)
7
- endif ()
8
-
9
- # This article discusses a better way to allow building either static or shared libraries:
10
- # https://alexreinking.com/blog/building-a-dual-shared-and-static-library-with-cmake.html
11
- if (USEARCH_BUILD_LIB_C)
12
- add_library(usearch_c SHARED lib.cpp)
13
- add_library(usearch_static_c STATIC lib.cpp)
14
-
15
- # Set the compile options for the static library
16
- if (CMAKE_CXX_COMPILER_ID STREQUAL "GNU")
17
- target_compile_options(usearch_static_c PRIVATE -static-libstdc++)
18
- elseif (CMAKE_CXX_COMPILER_ID MATCHES "Clang")
19
- target_compile_options(usearch_static_c PRIVATE -static)
20
- endif ()
21
-
22
- setup_target(usearch_c)
23
- setup_target(usearch_static_c)
24
-
25
- endif ()
package/c/README.md DELETED
@@ -1,34 +0,0 @@
1
- # USearch for C
2
-
3
- ## Installation
4
-
5
- The simplest form to integrate is to copy the contents of `usearch/c/` into your project.
6
- To build the library `libusearch_static_c` and `libusearch_c`, pass enable the `USEARCH_BUILD_LIB_C` CMake option:
7
-
8
- ```bash
9
- cmake -DCMAKE_BUILD_TYPE=Release -DUSEARCH_BUILD_LIB_C=1 -DUSEARCH_BUILD_TEST_C=1 -DUSEARCH_BUILD_TEST_CPP=0 -DUSEARCH_BUILD_BENCH_CPP=0 -B ./build_release
10
- cmake --build ./build_release --config Release
11
- ./build_release/test_c
12
- ```
13
-
14
- ## Quickstart
15
-
16
- ```c
17
- usearch_error_t error = NULL;
18
- usearch_init_options_t opts = create_options(dimensions);
19
- usearch_index_t index = usearch_init(&opts, &error);
20
- usearch_reserve(index, vectors_count, &error);
21
-
22
- float vector[dimensions] = {...};
23
- usearch_add(index, 42, &vector[0], usearch_scalar_f32_k, &error);
24
-
25
- ASSERT(!error, error);
26
- ASSERT(usearch_size(index, &error) == vectors_count, error);
27
- ASSERT(usearch_capacity(index, &error) == vectors_count, error);
28
-
29
- usearch_key_t found_keys[10];
30
- float found_distances[10];
31
- size_t found_count = usearch_search(index, &vector[0], usearch_scalar_f32_k, 10, &found_keys[0], &found_distances[0], &error);
32
-
33
- usearch_free(index, &error);
34
- ```
package/c/lib.cpp DELETED
@@ -1,358 +0,0 @@
1
- #include <cassert>
2
-
3
- #include <usearch/index_dense.hpp>
4
-
5
- extern "C" {
6
- #include "usearch.h"
7
- }
8
-
9
- using namespace unum::usearch;
10
- using namespace unum;
11
-
12
- using add_result_t = typename index_dense_t::add_result_t;
13
- using search_result_t = typename index_dense_t::search_result_t;
14
- using labeling_result_t = typename index_dense_t::labeling_result_t;
15
-
16
- static_assert(std::is_same<usearch_key_t, index_dense_t::vector_key_t>::value, "Type mismatch between C and C++");
17
- static_assert(std::is_same<usearch_distance_t, index_dense_t::distance_t>::value, "Type mismatch between C and C++");
18
-
19
- metric_kind_t metric_kind_to_cpp(usearch_metric_kind_t kind) {
20
- switch (kind) {
21
- case usearch_metric_ip_k: return metric_kind_t::ip_k;
22
- case usearch_metric_l2sq_k: return metric_kind_t::l2sq_k;
23
- case usearch_metric_cos_k: return metric_kind_t::cos_k;
24
- case usearch_metric_haversine_k: return metric_kind_t::haversine_k;
25
- case usearch_metric_divergence_k: return metric_kind_t::divergence_k;
26
- case usearch_metric_pearson_k: return metric_kind_t::pearson_k;
27
- case usearch_metric_jaccard_k: return metric_kind_t::jaccard_k;
28
- case usearch_metric_hamming_k: return metric_kind_t::hamming_k;
29
- case usearch_metric_tanimoto_k: return metric_kind_t::tanimoto_k;
30
- case usearch_metric_sorensen_k: return metric_kind_t::sorensen_k;
31
- default: return metric_kind_t::unknown_k;
32
- }
33
- }
34
-
35
- usearch_metric_kind_t metric_kind_to_c(metric_kind_t kind) {
36
- switch (kind) {
37
- case metric_kind_t::ip_k: return usearch_metric_ip_k;
38
- case metric_kind_t::l2sq_k: return usearch_metric_l2sq_k;
39
- case metric_kind_t::cos_k: return usearch_metric_cos_k;
40
- case metric_kind_t::haversine_k: return usearch_metric_haversine_k;
41
- case metric_kind_t::divergence_k: return usearch_metric_divergence_k;
42
- case metric_kind_t::pearson_k: return usearch_metric_pearson_k;
43
- case metric_kind_t::jaccard_k: return usearch_metric_jaccard_k;
44
- case metric_kind_t::hamming_k: return usearch_metric_hamming_k;
45
- case metric_kind_t::tanimoto_k: return usearch_metric_tanimoto_k;
46
- case metric_kind_t::sorensen_k: return usearch_metric_sorensen_k;
47
- default: return usearch_metric_unknown_k;
48
- }
49
- }
50
- scalar_kind_t scalar_kind_to_cpp(usearch_scalar_kind_t kind) {
51
- switch (kind) {
52
- case usearch_scalar_f32_k: return scalar_kind_t::f32_k;
53
- case usearch_scalar_f64_k: return scalar_kind_t::f64_k;
54
- case usearch_scalar_f16_k: return scalar_kind_t::f16_k;
55
- case usearch_scalar_i8_k: return scalar_kind_t::i8_k;
56
- case usearch_scalar_b1_k: return scalar_kind_t::b1x8_k;
57
- default: return scalar_kind_t::unknown_k;
58
- }
59
- }
60
-
61
- usearch_scalar_kind_t scalar_kind_to_c(scalar_kind_t kind) {
62
- switch (kind) {
63
- case scalar_kind_t::f32_k: return usearch_scalar_f32_k;
64
- case scalar_kind_t::f64_k: return usearch_scalar_f64_k;
65
- case scalar_kind_t::f16_k: return usearch_scalar_f16_k;
66
- case scalar_kind_t::i8_k: return usearch_scalar_i8_k;
67
- case scalar_kind_t::b1x8_k: return usearch_scalar_b1_k;
68
- default: return usearch_scalar_unknown_k;
69
- }
70
- }
71
-
72
- add_result_t add_(index_dense_t* index, usearch_key_t key, void const* vector, scalar_kind_t kind) {
73
- switch (kind) {
74
- case scalar_kind_t::f32_k: return index->add(key, (f32_t const*)vector);
75
- case scalar_kind_t::f64_k: return index->add(key, (f64_t const*)vector);
76
- case scalar_kind_t::f16_k: return index->add(key, (f16_t const*)vector);
77
- case scalar_kind_t::i8_k: return index->add(key, (i8_t const*)vector);
78
- case scalar_kind_t::b1x8_k: return index->add(key, (b1x8_t const*)vector);
79
- default: return add_result_t{}.failed("Unknown scalar kind!");
80
- }
81
- }
82
-
83
- std::size_t get_(index_dense_t* index, usearch_key_t key, size_t count, void* vector, scalar_kind_t kind) {
84
- switch (kind) {
85
- case scalar_kind_t::f32_k: return index->get(key, (f32_t*)vector, count);
86
- case scalar_kind_t::f64_k: return index->get(key, (f64_t*)vector, count);
87
- case scalar_kind_t::f16_k: return index->get(key, (f16_t*)vector, count);
88
- case scalar_kind_t::i8_k: return index->get(key, (i8_t*)vector, count);
89
- case scalar_kind_t::b1x8_k: return index->get(key, (b1x8_t*)vector, count);
90
- default: return search_result_t().failed("Unknown scalar kind!");
91
- }
92
- }
93
-
94
- search_result_t search_(index_dense_t* index, void const* vector, scalar_kind_t kind, size_t n) {
95
- switch (kind) {
96
- case scalar_kind_t::f32_k: return index->search((f32_t const*)vector, n);
97
- case scalar_kind_t::f64_k: return index->search((f64_t const*)vector, n);
98
- case scalar_kind_t::f16_k: return index->search((f16_t const*)vector, n);
99
- case scalar_kind_t::i8_k: return index->search((i8_t const*)vector, n);
100
- case scalar_kind_t::b1x8_k: return index->search((b1x8_t const*)vector, n);
101
- default: return search_result_t().failed("Unknown scalar kind!");
102
- }
103
- }
104
-
105
- extern "C" {
106
-
107
- USEARCH_EXPORT usearch_index_t usearch_init(usearch_init_options_t* options, usearch_error_t* error) {
108
-
109
- assert(options && error && "Missing arguments");
110
-
111
- index_dense_config_t config(options->connectivity, options->expansion_add, options->expansion_search);
112
- config.multi = options->multi;
113
- metric_kind_t metric_kind = metric_kind_to_cpp(options->metric_kind);
114
- scalar_kind_t scalar_kind = scalar_kind_to_cpp(options->quantization);
115
-
116
- metric_punned_t metric = //
117
- !options->metric ? metric_punned_t(options->dimensions, metric_kind, scalar_kind)
118
- : metric_punned_t(options->dimensions, //
119
- reinterpret_cast<std::uintptr_t>(options->metric), //
120
- metric_punned_signature_t::array_array_k, //
121
- metric_kind, scalar_kind);
122
-
123
- index_dense_t index = index_dense_t::make(metric, config);
124
- index_dense_t* result_ptr = new index_dense_t(std::move(index));
125
- if (!result_ptr || !*result_ptr)
126
- *error = "Out of memory!";
127
- return result_ptr;
128
- }
129
-
130
- USEARCH_EXPORT void usearch_free(usearch_index_t index, usearch_error_t*) {
131
- delete reinterpret_cast<index_dense_t*>(index);
132
- }
133
-
134
- USEARCH_EXPORT size_t usearch_serialized_length(usearch_index_t index, usearch_error_t*) {
135
- assert(index && "Missing arguments");
136
- return reinterpret_cast<index_dense_t*>(index)->serialized_length();
137
- }
138
-
139
- USEARCH_EXPORT void usearch_save(usearch_index_t index, char const* path, usearch_error_t* error) {
140
-
141
- assert(index && path && error && "Missing arguments");
142
- serialization_result_t result = reinterpret_cast<index_dense_t*>(index)->save(path);
143
- if (!result)
144
- *error = result.error.release();
145
- }
146
-
147
- USEARCH_EXPORT void usearch_load(usearch_index_t index, char const* path, usearch_error_t* error) {
148
-
149
- assert(index && path && error && "Missing arguments");
150
- serialization_result_t result = reinterpret_cast<index_dense_t*>(index)->load(path);
151
- if (!result)
152
- *error = result.error.release();
153
- }
154
-
155
- USEARCH_EXPORT void usearch_view(usearch_index_t index, char const* path, usearch_error_t* error) {
156
-
157
- assert(index && path && error && "Missing arguments");
158
- serialization_result_t result = reinterpret_cast<index_dense_t*>(index)->view(path);
159
- if (!result)
160
- *error = result.error.release();
161
- }
162
-
163
- USEARCH_EXPORT void usearch_metadata(char const* path, usearch_init_options_t* options, usearch_error_t* error) {
164
-
165
- assert(path && options && error && "Missing arguments");
166
- index_dense_metadata_result_t result = index_dense_metadata_from_path(path);
167
- if (!result)
168
- *error = result.error.release();
169
-
170
- options->metric_kind = metric_kind_to_c(result.head.kind_metric);
171
- options->quantization = scalar_kind_to_c(result.head.kind_scalar);
172
- options->dimensions = result.head.dimensions;
173
- options->multi = result.head.multi;
174
-
175
- options->connectivity = 0;
176
- options->expansion_add = 0;
177
- options->expansion_search = 0;
178
- options->metric = NULL;
179
- }
180
-
181
- USEARCH_EXPORT void usearch_save_buffer(usearch_index_t index, void* buffer, size_t length, usearch_error_t* error) {
182
-
183
- assert(index && buffer && length && error && "Missing arguments");
184
- memory_mapped_file_t memory_map((byte_t*)buffer, length);
185
- serialization_result_t result = reinterpret_cast<index_dense_t*>(index)->save(std::move(memory_map));
186
- if (!result)
187
- *error = result.error.release();
188
- }
189
-
190
- USEARCH_EXPORT void usearch_load_buffer(usearch_index_t index, void const* buffer, size_t length,
191
- usearch_error_t* error) {
192
-
193
- assert(index && buffer && length && error && "Missing arguments");
194
- memory_mapped_file_t memory_map((byte_t*)buffer, length);
195
- serialization_result_t result = reinterpret_cast<index_dense_t*>(index)->load(std::move(memory_map));
196
- if (!result)
197
- *error = result.error.release();
198
- }
199
-
200
- USEARCH_EXPORT void usearch_view_buffer(usearch_index_t index, void const* buffer, size_t length,
201
- usearch_error_t* error) {
202
-
203
- assert(index && buffer && length && error && "Missing arguments");
204
- memory_mapped_file_t memory_map((byte_t*)buffer, length);
205
- serialization_result_t result = reinterpret_cast<index_dense_t*>(index)->view(std::move(memory_map));
206
- if (!result)
207
- *error = result.error.release();
208
- }
209
-
210
- USEARCH_EXPORT void usearch_metadata_buffer(void const* buffer, size_t length, usearch_init_options_t* options,
211
- usearch_error_t* error) {
212
-
213
- assert(buffer && length && options && error && "Missing arguments");
214
- index_dense_metadata_result_t result =
215
- index_dense_metadata_from_buffer(memory_mapped_file_t((byte_t*)(buffer), length));
216
- if (!result)
217
- *error = result.error.release();
218
-
219
- options->metric_kind = metric_kind_to_c(result.head.kind_metric);
220
- options->quantization = scalar_kind_to_c(result.head.kind_scalar);
221
- options->dimensions = result.head.dimensions;
222
- options->multi = result.head.multi;
223
-
224
- options->connectivity = 0;
225
- options->expansion_add = 0;
226
- options->expansion_search = 0;
227
- options->metric = NULL;
228
- }
229
-
230
- USEARCH_EXPORT size_t usearch_size(usearch_index_t index, usearch_error_t*) { //
231
- return reinterpret_cast<index_dense_t*>(index)->size();
232
- }
233
-
234
- USEARCH_EXPORT size_t usearch_capacity(usearch_index_t index, usearch_error_t*) {
235
- return reinterpret_cast<index_dense_t*>(index)->capacity();
236
- }
237
-
238
- USEARCH_EXPORT size_t usearch_dimensions(usearch_index_t index, usearch_error_t*) {
239
- return reinterpret_cast<index_dense_t*>(index)->dimensions();
240
- }
241
-
242
- USEARCH_EXPORT size_t usearch_connectivity(usearch_index_t index, usearch_error_t*) {
243
- return reinterpret_cast<index_dense_t*>(index)->connectivity();
244
- }
245
-
246
- USEARCH_EXPORT void usearch_reserve(usearch_index_t index, size_t capacity, usearch_error_t* error) {
247
- assert(index && error && "Missing arguments");
248
- if (!reinterpret_cast<index_dense_t*>(index)->reserve(capacity))
249
- *error = "Out of memory!";
250
- }
251
-
252
- USEARCH_EXPORT void usearch_add( //
253
- usearch_index_t index, usearch_key_t key, void const* vector, usearch_scalar_kind_t kind, //
254
- usearch_error_t* error) {
255
-
256
- assert(index && vector && error && "Missing arguments");
257
- add_result_t result = add_(reinterpret_cast<index_dense_t*>(index), key, vector, scalar_kind_to_cpp(kind));
258
- if (!result)
259
- *error = result.error.release();
260
- }
261
-
262
- USEARCH_EXPORT bool usearch_contains(usearch_index_t index, usearch_key_t key, usearch_error_t*) {
263
- assert(index && "Missing arguments");
264
- return reinterpret_cast<index_dense_t*>(index)->contains(key);
265
- }
266
-
267
- USEARCH_EXPORT size_t usearch_count(usearch_index_t index, usearch_key_t key, usearch_error_t*) {
268
- assert(index && "Missing arguments");
269
- return reinterpret_cast<index_dense_t*>(index)->count(key);
270
- }
271
-
272
- USEARCH_EXPORT size_t usearch_search( //
273
- usearch_index_t index, void const* vector, usearch_scalar_kind_t kind, size_t results_limit, //
274
- usearch_key_t* found_keys, usearch_distance_t* found_distances, usearch_error_t* error) {
275
-
276
- assert(index && vector && error && "Missing arguments");
277
- search_result_t result =
278
- search_(reinterpret_cast<index_dense_t*>(index), vector, scalar_kind_to_cpp(kind), results_limit);
279
- if (!result) {
280
- *error = result.error.release();
281
- return 0;
282
- }
283
-
284
- return result.dump_to(found_keys, found_distances);
285
- }
286
-
287
- USEARCH_EXPORT size_t usearch_get( //
288
- usearch_index_t index, usearch_key_t key, size_t count, //
289
- void* vectors, usearch_scalar_kind_t kind, usearch_error_t*) {
290
-
291
- assert(index && vectors);
292
- return get_(reinterpret_cast<index_dense_t*>(index), key, count, vectors, scalar_kind_to_cpp(kind));
293
- }
294
-
295
- USEARCH_EXPORT size_t usearch_remove(usearch_index_t index, usearch_key_t key, usearch_error_t* error) {
296
-
297
- assert(index && error && "Missing arguments");
298
- labeling_result_t result = reinterpret_cast<index_dense_t*>(index)->remove(key);
299
- if (!result)
300
- *error = result.error.release();
301
- return result.completed;
302
- }
303
-
304
- USEARCH_EXPORT size_t usearch_rename( //
305
- usearch_index_t index, usearch_key_t from, usearch_key_t to, usearch_error_t* error) {
306
-
307
- assert(index && error && "Missing arguments");
308
- labeling_result_t result = reinterpret_cast<index_dense_t*>(index)->rename(from, to);
309
- if (!result)
310
- *error = result.error.release();
311
- return result.completed;
312
- }
313
-
314
- USEARCH_EXPORT usearch_distance_t usearch_distance( //
315
- void const* vector_first, void const* vector_second, //
316
- usearch_scalar_kind_t scalar_kind, size_t dimensions, //
317
- usearch_metric_kind_t metric_kind, usearch_error_t* error) {
318
-
319
- (void)error;
320
- metric_punned_t metric(dimensions, metric_kind_to_cpp(metric_kind), scalar_kind_to_cpp(scalar_kind));
321
- return metric((byte_t const*)vector_first, (byte_t const*)vector_second);
322
- }
323
-
324
- USEARCH_EXPORT void usearch_exact_search( //
325
- void const* dataset, size_t dataset_count, size_t dataset_stride, //
326
- void const* queries, size_t queries_count, size_t queries_stride, //
327
- usearch_scalar_kind_t scalar_kind, size_t dimensions, //
328
- usearch_metric_kind_t metric_kind, size_t count, size_t threads, //
329
- usearch_key_t* keys, size_t keys_stride, //
330
- usearch_distance_t* distances, size_t distances_stride, //
331
- usearch_error_t* error) {
332
-
333
- assert(dataset && queries && keys && distances && error && "Missing arguments");
334
-
335
- metric_punned_t metric(dimensions, metric_kind_to_cpp(metric_kind), scalar_kind_to_cpp(scalar_kind));
336
- executor_default_t executor(threads);
337
- static exact_search_t search;
338
- exact_search_results_t result = search( //
339
- (byte_t const*)dataset, dataset_count, dataset_stride, //
340
- (byte_t const*)queries, queries_count, queries_stride, //
341
- count, metric);
342
-
343
- if (!result) {
344
- *error = "Out of memory, allocating a temporary buffer for batch results";
345
- return;
346
- }
347
-
348
- // Export results into the output buffer
349
- for (std::size_t query_idx = 0; query_idx != queries_count; ++query_idx) {
350
- auto query_result = result.at(query_idx);
351
- auto query_keys = (usearch_key_t*)((byte_t*)keys + query_idx * keys_stride);
352
- auto query_distances = (usearch_distance_t*)((byte_t*)distances + query_idx * distances_stride);
353
- for (std::size_t i = 0; i != count; ++i)
354
- query_keys[i] = static_cast<usearch_key_t>(query_result[i].offset),
355
- query_distances[i] = static_cast<usearch_distance_t>(query_result[i].distance);
356
- }
357
- }
358
- }