usearch 2.8.2 → 2.8.3
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/.github/workflows/release.yml +1 -1
- package/CITATION.cff +1 -1
- package/Cargo.toml +1 -1
- package/README.md +1 -1
- package/conanfile.py +1 -1
- package/csharp/nuget/nuget-package.props +1 -1
- package/include/usearch/index.hpp +7 -6
- package/javascript/usearch.js +4 -4
- package/javascript/usearch.test.js +22 -0
- package/package-ci.json +10 -0
- package/package.json +1 -5
- package/wasmer.toml +1 -1
|
@@ -25,7 +25,7 @@ jobs:
|
|
|
25
25
|
with:
|
|
26
26
|
persist-credentials: false
|
|
27
27
|
- uses: actions/setup-node@v3
|
|
28
|
-
- run: npm install --save-dev @semantic-release/exec @semantic-release/git conventional-changelog-eslint semantic-release && npx semantic-release
|
|
28
|
+
- run: npm install --save-dev --prefix ./package-ci @semantic-release/exec @semantic-release/git conventional-changelog-eslint semantic-release && npx --prefix ./package-ci semantic-release
|
|
29
29
|
|
|
30
30
|
rebase:
|
|
31
31
|
name: Rebase Dev. Branch
|
package/CITATION.cff
CHANGED
package/Cargo.toml
CHANGED
package/README.md
CHANGED
package/conanfile.py
CHANGED
|
@@ -7,7 +7,7 @@ required_conan_version = ">=1.53.0"
|
|
|
7
7
|
class USearchConan(ConanFile):
|
|
8
8
|
|
|
9
9
|
name = "usearch"
|
|
10
|
-
version = '2.8.
|
|
10
|
+
version = '2.8.3'
|
|
11
11
|
license = "Apache-2.0"
|
|
12
12
|
description = "Smaller & Faster Single-File Vector Search Engine from Unum"
|
|
13
13
|
homepage = "https://github.com/unum-cloud/usearch"
|
|
@@ -11,7 +11,7 @@
|
|
|
11
11
|
|
|
12
12
|
#define USEARCH_VERSION_MAJOR 2
|
|
13
13
|
#define USEARCH_VERSION_MINOR 8
|
|
14
|
-
#define USEARCH_VERSION_PATCH
|
|
14
|
+
#define USEARCH_VERSION_PATCH 3
|
|
15
15
|
|
|
16
16
|
// Inferring C++ version
|
|
17
17
|
// https://stackoverflow.com/a/61552074
|
|
@@ -547,6 +547,7 @@ class max_heap_gt {
|
|
|
547
547
|
inline bool empty() const noexcept { return !size_; }
|
|
548
548
|
inline std::size_t size() const noexcept { return size_; }
|
|
549
549
|
inline std::size_t capacity() const noexcept { return capacity_; }
|
|
550
|
+
|
|
550
551
|
/// @brief Selects the largest element in the heap.
|
|
551
552
|
/// @return Reference to the stored element.
|
|
552
553
|
inline element_t const& top() const noexcept { return elements_[0]; }
|
|
@@ -2205,7 +2206,7 @@ class index_gt {
|
|
|
2205
2206
|
node_t node = nodes_[candidate.slot];
|
|
2206
2207
|
return {member_cref_t{node.ckey(), candidate.slot}, candidate.distance};
|
|
2207
2208
|
}
|
|
2208
|
-
inline std::size_t merge_into(
|
|
2209
|
+
inline std::size_t merge_into( //
|
|
2209
2210
|
vector_key_t* keys, distance_t* distances, //
|
|
2210
2211
|
std::size_t old_count, std::size_t max_count) const noexcept {
|
|
2211
2212
|
|
|
@@ -2279,10 +2280,10 @@ class index_gt {
|
|
|
2279
2280
|
typename callback_at = dummy_callback_t, //
|
|
2280
2281
|
typename prefetch_at = dummy_prefetch_t //
|
|
2281
2282
|
>
|
|
2282
|
-
add_result_t add(
|
|
2283
|
+
add_result_t add( //
|
|
2283
2284
|
vector_key_t key, value_at&& value, metric_at&& metric, //
|
|
2284
|
-
index_update_config_t config = {},
|
|
2285
|
-
callback_at&& callback = callback_at{},
|
|
2285
|
+
index_update_config_t config = {}, //
|
|
2286
|
+
callback_at&& callback = callback_at{}, //
|
|
2286
2287
|
prefetch_at&& prefetch = prefetch_at{}) usearch_noexcept_m {
|
|
2287
2288
|
|
|
2288
2289
|
add_result_t result;
|
|
@@ -2389,7 +2390,7 @@ class index_gt {
|
|
|
2389
2390
|
>
|
|
2390
2391
|
add_result_t update( //
|
|
2391
2392
|
member_iterator_t iterator, //
|
|
2392
|
-
vector_key_t key,
|
|
2393
|
+
vector_key_t key, //
|
|
2393
2394
|
value_at&& value, //
|
|
2394
2395
|
metric_at&& metric, //
|
|
2395
2396
|
index_update_config_t config = {}, //
|
package/javascript/usearch.js
CHANGED
|
@@ -84,7 +84,7 @@ class BatchMatches {
|
|
|
84
84
|
}
|
|
85
85
|
|
|
86
86
|
function isOneKey(keys) {
|
|
87
|
-
return typeof keys === 'number' || typeof keys === 'bigint';
|
|
87
|
+
return (!Number.isNaN(keys) && typeof keys === 'number') || typeof keys === 'bigint';
|
|
88
88
|
}
|
|
89
89
|
|
|
90
90
|
function normalizeKeys(keys) {
|
|
@@ -92,7 +92,7 @@ function normalizeKeys(keys) {
|
|
|
92
92
|
keys = BigUint64Array.of(BigInt(keys));
|
|
93
93
|
} else if (Array.isArray(keys)) {
|
|
94
94
|
keys = keys.map(key => {
|
|
95
|
-
if (typeof key !== 'bigint' && typeof key !== 'number')
|
|
95
|
+
if ((typeof key !== 'bigint' && typeof key !== 'number') || Number.isNaN(key))
|
|
96
96
|
throw new Error("All keys must be integers or bigints.");
|
|
97
97
|
return BigInt(key);
|
|
98
98
|
});
|
|
@@ -151,7 +151,7 @@ class Index {
|
|
|
151
151
|
if (typeof dimensionsOrConfigs === 'object' && dimensionsOrConfigs !== null) {
|
|
152
152
|
// Parameters are provided as an object
|
|
153
153
|
({ dimensions, metric = MetricKind.Cos, quantization = ScalarKind.F32, connectivity = 0, expansion_add = 0, expansion_search = 0, multi = false } = dimensionsOrConfigs);
|
|
154
|
-
} else if (typeof dimensionsOrConfigs === 'number' || typeof dimensionsOrConfigs === 'bigint') {
|
|
154
|
+
} else if ((typeof dimensionsOrConfigs === 'number' && !Number.isNaN(dimensionsOrConfigs)) || typeof dimensionsOrConfigs === 'bigint') {
|
|
155
155
|
// Parameters are provided as individual arguments
|
|
156
156
|
dimensions = dimensionsOrConfigs;
|
|
157
157
|
} else {
|
|
@@ -238,7 +238,7 @@ class Index {
|
|
|
238
238
|
* @throws Will throw an error if `vectors` is not a valid input type (TypedArray or an array of arrays) or if its flattened size is not a multiple of dimensions.
|
|
239
239
|
*/
|
|
240
240
|
search(vectors, k) {
|
|
241
|
-
if (typeof k !== 'number' || k <= 0) {
|
|
241
|
+
if ((!Number.isNaN(k) && typeof k !== 'number') || k <= 0) {
|
|
242
242
|
throw new Error("`k` must be a positive integer representing the number of nearest neighbors to search for.");
|
|
243
243
|
}
|
|
244
244
|
|
|
@@ -35,3 +35,25 @@ test('Batch operations', () => {
|
|
|
35
35
|
assert.deepEqual(results.keys, new BigUint64Array([15n, 16n]), 'keys should be 15 and 16');
|
|
36
36
|
assert.deepEqual(results.distances, new Float32Array([45, 130]), 'distances should be 45 and 130');
|
|
37
37
|
});
|
|
38
|
+
|
|
39
|
+
|
|
40
|
+
test('Operations with invalid values', () => {
|
|
41
|
+
const indexBatch = new usearch.Index(2, 'l2sq');
|
|
42
|
+
|
|
43
|
+
const keys = [NaN, 16n];
|
|
44
|
+
const vectors = [new Float32Array([10, 30]), new Float32Array([1, 5])];
|
|
45
|
+
|
|
46
|
+
try {
|
|
47
|
+
indexBatch.add(keys, vectors);
|
|
48
|
+
throw new Error('indexBatch.add should have thrown an error.');
|
|
49
|
+
} catch (err) {
|
|
50
|
+
assert.equal(err.message, 'All keys must be integers or bigints.');
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
try {
|
|
54
|
+
indexBatch.search(NaN, 2);
|
|
55
|
+
throw new Error('indexBatch.search should have thrown an error.');
|
|
56
|
+
} catch (err) {
|
|
57
|
+
assert.equal(err.message, 'Vectors must be a TypedArray or an array of arrays.');
|
|
58
|
+
}
|
|
59
|
+
});
|
package/package-ci.json
ADDED
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "usearch",
|
|
3
|
-
"version": "2.8.
|
|
3
|
+
"version": "2.8.3",
|
|
4
4
|
"description": "Smaller & Faster Single-File Vector Search Engine from Unum",
|
|
5
5
|
"author": "Ash Vardanian (https://ashvardanian.com/)",
|
|
6
6
|
"license": "Apache 2.0",
|
|
@@ -27,10 +27,6 @@
|
|
|
27
27
|
"test": "node --test ./javascript/usearch.test.js"
|
|
28
28
|
},
|
|
29
29
|
"devDependencies": {
|
|
30
|
-
"@semantic-release/exec": "^6.0.3",
|
|
31
|
-
"@semantic-release/git": "^10.0.1",
|
|
32
|
-
"conventional-changelog-eslint": "^3.0.9",
|
|
33
|
-
"semantic-release": "^21.1.2",
|
|
34
30
|
"typescript": "^5.1.6"
|
|
35
31
|
}
|
|
36
32
|
}
|