usearch 0.19.2 → 0.20.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/Cargo.toml +1 -1
- package/README.md +1 -1
- package/c/lib.cpp +1 -2
- package/c/test.c +238 -126
- package/conanfile.py +1 -1
- package/cpp/bench.cpp +3 -3
- package/cpp/test.cpp +12 -12
- package/include/usearch/index.hpp +137 -49
- package/include/usearch/index_punned_dense.hpp +1 -1
- package/include/usearch/index_punned_helpers.hpp +2 -0
- package/java/cloud/unum/usearch/cloud_unum_usearch_Index.cpp +25 -23
- package/javascript/lib.cpp +10 -11
- package/javascript/test.js +1 -1
- package/objc/USearchObjective.mm +15 -12
- package/objc/include/USearchObjective.h +3 -3
- package/package.json +2 -2
- package/python/lib.cpp +43 -48
- package/python/usearch/index.py +1 -1
- package/rust/lib.cpp +13 -13
- package/rust/lib.hpp +10 -6
- package/rust/lib.rs +2 -2
- package/swift/Index+Sugar.swift +13 -9
- package/wolfram/lib.cpp +26 -19
package/wolfram/lib.cpp
CHANGED
|
@@ -2,9 +2,16 @@
|
|
|
2
2
|
#include <usearch/index_punned_dense.hpp>
|
|
3
3
|
|
|
4
4
|
using namespace unum::usearch;
|
|
5
|
+
|
|
6
|
+
using metric_t = index_punned_dense_metric_t;
|
|
5
7
|
using distance_t = punned_distance_t;
|
|
6
|
-
using
|
|
7
|
-
using
|
|
8
|
+
using index_t = punned_small_t;
|
|
9
|
+
using vector_view_t = span_gt<float>;
|
|
10
|
+
|
|
11
|
+
using add_result_t = typename index_t::add_result_t;
|
|
12
|
+
using search_result_t = typename index_t::search_result_t;
|
|
13
|
+
using label_t = typename index_t::label_t;
|
|
14
|
+
using id_t = typename index_t::id_t;
|
|
8
15
|
|
|
9
16
|
EXTERN_C DLLEXPORT int WolframLibrary_initialize(WolframLibraryData libData) { return LIBRARY_NO_ERROR; }
|
|
10
17
|
EXTERN_C DLLEXPORT void WolframLibrary_uninitialize(WolframLibraryData libData) { return; }
|
|
@@ -24,10 +31,10 @@ EXTERN_C DLLEXPORT int IndexCreate(WolframLibraryData libData, mint Argc, MArgum
|
|
|
24
31
|
|
|
25
32
|
scalar_kind_t accuracy = scalar_kind_from_name(accuracy_cstr, std::strlen(accuracy_cstr));
|
|
26
33
|
metric_kind_t metric_kind = metric_from_name(metric_cstr, std::strlen(metric_cstr));
|
|
27
|
-
|
|
34
|
+
index_t index = make_punned<index_t>(metric_kind, dimensions, accuracy, config);
|
|
28
35
|
index.reserve(capacity);
|
|
29
36
|
|
|
30
|
-
|
|
37
|
+
index_t* result_ptr = new index_t(std::move(index));
|
|
31
38
|
MArgument_setInteger(Res, (long)result_ptr);
|
|
32
39
|
|
|
33
40
|
} catch (...) {
|
|
@@ -41,7 +48,7 @@ EXTERN_C DLLEXPORT int IndexCreate(WolframLibraryData libData, mint Argc, MArgum
|
|
|
41
48
|
|
|
42
49
|
EXTERN_C DLLEXPORT int IndexSave(WolframLibraryData libData, mint Argc, MArgument* Args, MArgument Res) {
|
|
43
50
|
char* path_cstr = nullptr;
|
|
44
|
-
|
|
51
|
+
index_t* c_ptr = (index_t*)MArgument_getUTF8String(Args[0]);
|
|
45
52
|
try {
|
|
46
53
|
path_cstr = MArgument_getUTF8String(Args[1]);
|
|
47
54
|
c_ptr->save(path_cstr);
|
|
@@ -54,7 +61,7 @@ EXTERN_C DLLEXPORT int IndexSave(WolframLibraryData libData, mint Argc, MArgumen
|
|
|
54
61
|
|
|
55
62
|
EXTERN_C DLLEXPORT int IndexLoad(WolframLibraryData libData, mint Argc, MArgument* Args, MArgument Res) {
|
|
56
63
|
char* path_cstr = nullptr;
|
|
57
|
-
|
|
64
|
+
index_t* c_ptr = (index_t*)MArgument_getUTF8String(Args[0]);
|
|
58
65
|
try {
|
|
59
66
|
path_cstr = MArgument_getUTF8String(Args[1]);
|
|
60
67
|
c_ptr->load(path_cstr);
|
|
@@ -67,7 +74,7 @@ EXTERN_C DLLEXPORT int IndexLoad(WolframLibraryData libData, mint Argc, MArgumen
|
|
|
67
74
|
|
|
68
75
|
EXTERN_C DLLEXPORT int IndexView(WolframLibraryData libData, mint Argc, MArgument* Args, MArgument Res) {
|
|
69
76
|
char* path_cstr = nullptr;
|
|
70
|
-
|
|
77
|
+
index_t* c_ptr = (index_t*)MArgument_getUTF8String(Args[0]);
|
|
71
78
|
try {
|
|
72
79
|
path_cstr = MArgument_getUTF8String(Args[1]);
|
|
73
80
|
c_ptr->view(path_cstr);
|
|
@@ -79,44 +86,44 @@ EXTERN_C DLLEXPORT int IndexView(WolframLibraryData libData, mint Argc, MArgumen
|
|
|
79
86
|
}
|
|
80
87
|
|
|
81
88
|
EXTERN_C DLLEXPORT int IndexDestroy(WolframLibraryData libData, mint Argc, MArgument* Args, MArgument Res) {
|
|
82
|
-
delete (
|
|
89
|
+
delete (index_t*)MArgument_getUTF8String(Args[0]);
|
|
83
90
|
return LIBRARY_NO_ERROR;
|
|
84
91
|
}
|
|
85
92
|
|
|
86
93
|
EXTERN_C DLLEXPORT int IndexSize(WolframLibraryData libData, mint Argc, MArgument* Args, MArgument Res) {
|
|
87
|
-
size_t res = ((
|
|
94
|
+
std::size_t res = ((index_t*)MArgument_getUTF8String(Args[0]))->size();
|
|
88
95
|
MArgument_setInteger(Res, res);
|
|
89
96
|
return LIBRARY_NO_ERROR;
|
|
90
97
|
}
|
|
91
98
|
|
|
92
99
|
EXTERN_C DLLEXPORT int IndexConnectivity(WolframLibraryData libData, mint Argc, MArgument* Args, MArgument Res) {
|
|
93
|
-
size_t res = ((
|
|
100
|
+
std::size_t res = ((index_t*)MArgument_getUTF8String(Args[0]))->connectivity();
|
|
94
101
|
MArgument_setInteger(Res, res);
|
|
95
102
|
return LIBRARY_NO_ERROR;
|
|
96
103
|
}
|
|
97
104
|
|
|
98
105
|
EXTERN_C DLLEXPORT int IndexDimensions(WolframLibraryData libData, mint Argc, MArgument* Args, MArgument Res) {
|
|
99
|
-
size_t res = ((
|
|
106
|
+
std::size_t res = ((index_t*)MArgument_getUTF8String(Args[0]))->dimensions();
|
|
100
107
|
MArgument_setInteger(Res, res);
|
|
101
108
|
return LIBRARY_NO_ERROR;
|
|
102
109
|
}
|
|
103
110
|
|
|
104
111
|
EXTERN_C DLLEXPORT int IndexCapacity(WolframLibraryData libData, mint Argc, MArgument* Args, MArgument Res) {
|
|
105
|
-
size_t res = ((
|
|
112
|
+
std::size_t res = ((index_t*)MArgument_getUTF8String(Args[0]))->capacity();
|
|
106
113
|
MArgument_setInteger(Res, res);
|
|
107
114
|
return LIBRARY_NO_ERROR;
|
|
108
115
|
}
|
|
109
116
|
|
|
110
117
|
EXTERN_C DLLEXPORT int IndexAdd(WolframLibraryData libData, mint Argc, MArgument* Args, MArgument Res) {
|
|
111
118
|
char* path_cstr = nullptr;
|
|
112
|
-
|
|
119
|
+
index_t* c_ptr = (index_t*)MArgument_getUTF8String(Args[0]);
|
|
113
120
|
float* vector_data = nullptr;
|
|
114
121
|
try {
|
|
115
122
|
int label = MArgument_getInteger(Args[1]);
|
|
116
123
|
MTensor tens = MArgument_getMTensor(Args[2]);
|
|
117
|
-
size_t len = libData->MTensor_getFlattenedLength(tens);
|
|
124
|
+
std::size_t len = libData->MTensor_getFlattenedLength(tens);
|
|
118
125
|
vector_data = (float*)libData->MTensor_getRealData(tens);
|
|
119
|
-
|
|
126
|
+
vector_view_t vector_span = vector_view_t{vector_data, len};
|
|
120
127
|
c_ptr->add(label, vector_span);
|
|
121
128
|
} catch (...) {
|
|
122
129
|
return LIBRARY_FUNCTION_ERROR;
|
|
@@ -125,7 +132,7 @@ EXTERN_C DLLEXPORT int IndexAdd(WolframLibraryData libData, mint Argc, MArgument
|
|
|
125
132
|
}
|
|
126
133
|
|
|
127
134
|
EXTERN_C DLLEXPORT int IndexSearch(WolframLibraryData libData, mint Argc, MArgument* Args, MArgument Res) {
|
|
128
|
-
|
|
135
|
+
index_t* c_ptr = (index_t*)MArgument_getUTF8String(Args[0]);
|
|
129
136
|
MTensor matches;
|
|
130
137
|
mint dims[] = {1};
|
|
131
138
|
int wanted = MArgument_getInteger(Args[2]);
|
|
@@ -137,12 +144,12 @@ EXTERN_C DLLEXPORT int IndexSearch(WolframLibraryData libData, mint Argc, MArgum
|
|
|
137
144
|
libData->MTensor_new(MType_Integer, 1, dims, &matches);
|
|
138
145
|
|
|
139
146
|
MTensor tens = MArgument_getMTensor(Args[1]);
|
|
140
|
-
size_t len = libData->MTensor_getFlattenedLength(tens);
|
|
147
|
+
std::size_t len = libData->MTensor_getFlattenedLength(tens);
|
|
141
148
|
vector_data = (float*)libData->MTensor_getRealData(tens);
|
|
142
|
-
|
|
149
|
+
vector_view_t vector_span = vector_view_t{vector_data, len};
|
|
143
150
|
|
|
144
151
|
matches_data = (int*)std::malloc(sizeof(int) * wanted);
|
|
145
|
-
found = c_ptr->search(vector_span, (
|
|
152
|
+
found = c_ptr->search(vector_span, static_cast<std::size_t>(wanted), matches_data, nullptr);
|
|
146
153
|
for (mint i = 0; i < found; i++)
|
|
147
154
|
libData->MTensor_setInteger(matches, &i, matches_data[i]);
|
|
148
155
|
|