usearch 0.4.0 → 0.8.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/.clang-tidy +60 -0
- package/.github/workflows/release.yml +42 -16
- package/.github/workflows/update_version.sh +1 -0
- package/.vscode/launch.json +22 -0
- package/.vscode/settings.json +5 -0
- package/.vscode/tasks.json +4 -4
- package/CITATION.cff +11 -0
- package/CMakeLists.txt +108 -95
- package/Cargo.toml +1 -1
- package/Dockerfile +14 -0
- package/README.md +8 -7
- package/VERSION +1 -1
- package/binding.gyp +2 -2
- package/build.rs +2 -2
- package/cmake/config.cmake.in +15 -0
- package/cmake/pkg-config.pc.in +4 -0
- package/cmake/usearchConfigVersion.cmake.in +20 -0
- package/conanfile.py +1 -1
- package/docs/benchmarks.md +11 -2
- package/docs/{Compilation.md → compilation.md} +54 -27
- package/include/usearch/usearch.hpp +664 -390
- package/java/cloud/unum/usearch/cloud_unum_usearch_Index.cpp +17 -16
- package/javascript/lib.cpp +13 -13
- package/javascript/test.js +1 -1
- package/objc/USearchObjective.mm +46 -29
- package/objc/include/USearchObjective.h +18 -26
- package/package.json +1 -1
- package/pyproject.toml +3 -2
- package/python/lib.cpp +179 -120
- package/python/{bench.py → scripts/bench.py} +6 -1
- package/python/scripts/bench_params.py +112 -0
- package/python/{test.py → scripts/test.py} +32 -13
- package/python/usearch/client.py +100 -14
- package/python/usearch/server.py +104 -23
- package/rust/lib.cpp +15 -14
- package/rust/lib.hpp +5 -5
- package/rust/lib.rs +3 -3
- package/setup.py +7 -0
- package/src/CMakeLists.txt +107 -0
- package/src/bench.cpp +45 -15
- package/src/{advanced.hpp → punned.hpp} +227 -199
- package/src/test.cpp +62 -0
- package/swift/Test.swift +1 -1
- package/wolfram/lib.cpp +14 -14
package/.clang-tidy
ADDED
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
Checks: '*,
|
|
2
|
+
-altera-id-dependent-backward-branch,
|
|
3
|
+
-altera-struct-pack-align,
|
|
4
|
+
-altera-unroll-loops,
|
|
5
|
+
-android-cloexec-fopen,
|
|
6
|
+
-bugprone-easily-swappable-parameters,
|
|
7
|
+
-cert-err58-cpp,
|
|
8
|
+
-concurrency-mt-unsafe,
|
|
9
|
+
-cppcoreguidelines-avoid-const-or-ref-data-members,
|
|
10
|
+
-cppcoreguidelines-avoid-do-while,
|
|
11
|
+
-cppcoreguidelines-avoid-goto,
|
|
12
|
+
-cppcoreguidelines-avoid-magic-numbers,
|
|
13
|
+
-cppcoreguidelines-avoid-non-const-global-variables,
|
|
14
|
+
-cppcoreguidelines-macro-usage,
|
|
15
|
+
-cppcoreguidelines-pro-bounds-array-to-pointer-decay,
|
|
16
|
+
-cppcoreguidelines-pro-bounds-constant-array-index,
|
|
17
|
+
-cppcoreguidelines-pro-bounds-pointer-arithmetic,
|
|
18
|
+
-cppcoreguidelines-pro-type-reinterpret-cast,
|
|
19
|
+
-cppcoreguidelines-pro-type-union-access,
|
|
20
|
+
-cppcoreguidelines-rvalue-reference-param-not-moved,
|
|
21
|
+
-cppcoreguidelines-virtual-class-destructor,
|
|
22
|
+
-fuchsia-default-arguments-calls,
|
|
23
|
+
-fuchsia-default-arguments-declarations,
|
|
24
|
+
-fuchsia-overloaded-operator,
|
|
25
|
+
-google-explicit-constructor,
|
|
26
|
+
-google-readability-function-size,
|
|
27
|
+
-google-runtime-int,
|
|
28
|
+
-google-runtime-references,
|
|
29
|
+
-hicpp-avoid-goto,
|
|
30
|
+
-hicpp-explicit-conversions,
|
|
31
|
+
-hicpp-function-size,
|
|
32
|
+
-hicpp-no-array-decay,
|
|
33
|
+
-hicpp-no-assembler,
|
|
34
|
+
-hicpp-signed-bitwise,
|
|
35
|
+
-hicpp-uppercase-literal-suffix,
|
|
36
|
+
-llvm-header-guard,
|
|
37
|
+
-llvm-include-order,
|
|
38
|
+
-llvmlibc-*,
|
|
39
|
+
-misc-use-anonymous-namespace,
|
|
40
|
+
-misc-confusable-identifiers,
|
|
41
|
+
-misc-no-recursion,
|
|
42
|
+
-misc-non-private-member-variables-in-classes,
|
|
43
|
+
-modernize-concat-nested-namespaces,
|
|
44
|
+
-modernize-type-traits,
|
|
45
|
+
-modernize-use-nodiscard,
|
|
46
|
+
-modernize-use-trailing-return-type,
|
|
47
|
+
-readability-function-cognitive-complexity,
|
|
48
|
+
-readability-function-size,
|
|
49
|
+
-readability-identifier-length,
|
|
50
|
+
-readability-magic-numbers,
|
|
51
|
+
-readability-redundant-access-specifiers,
|
|
52
|
+
-readability-simplify-boolean-expr,
|
|
53
|
+
-readability-uppercase-literal-suffix'
|
|
54
|
+
|
|
55
|
+
CheckOptions:
|
|
56
|
+
- key: hicpp-special-member-functions.AllowSoleDefaultDtor
|
|
57
|
+
value: 1
|
|
58
|
+
|
|
59
|
+
WarningsAsErrors: '*'
|
|
60
|
+
HeaderFilterRegex: '.*hpp$'
|
|
@@ -54,12 +54,7 @@ jobs:
|
|
|
54
54
|
- name: Install CIBuildWheel
|
|
55
55
|
run: python -m pip install cibuildwheel
|
|
56
56
|
|
|
57
|
-
- name: Build wheels
|
|
58
|
-
if: matrix.os == 'windows-2022'
|
|
59
|
-
run: python -m cibuildwheel
|
|
60
|
-
|
|
61
|
-
- name: Build wheels for POSIX
|
|
62
|
-
if: matrix.os != 'windows-2022'
|
|
57
|
+
- name: Build wheels
|
|
63
58
|
run: python -m cibuildwheel
|
|
64
59
|
|
|
65
60
|
- uses: actions/upload-artifact@v3
|
|
@@ -165,21 +160,18 @@ jobs:
|
|
|
165
160
|
- name: Run tests
|
|
166
161
|
run: swift test
|
|
167
162
|
|
|
168
|
-
|
|
169
|
-
name:
|
|
170
|
-
environment:
|
|
171
|
-
name: github-pages
|
|
172
|
-
url: ${{ steps.deployment.outputs.page_url }}
|
|
163
|
+
build_docs:
|
|
164
|
+
name: Build Docs
|
|
173
165
|
runs-on: ubuntu-22.04
|
|
174
166
|
if: ${{ always() }}
|
|
175
167
|
needs: [publish_python, publish_javascript, publish_rust, publish_java, publish_swift]
|
|
168
|
+
permissions:
|
|
169
|
+
contents: write
|
|
176
170
|
steps:
|
|
177
171
|
- name: Checkout
|
|
178
172
|
uses: actions/checkout@v3
|
|
179
173
|
with:
|
|
180
174
|
ref: 'main'
|
|
181
|
-
- name: Setup GitHub Pages
|
|
182
|
-
uses: actions/configure-pages@v2
|
|
183
175
|
- name: Install dependencies
|
|
184
176
|
run: sudo apt update && sudo apt install -y doxygen graphviz dia git && pip install sphinx breathe furo m2r2 sphinxcontrib-googleanalytics==0.2.dev20220708 sphinxcontrib-jquery
|
|
185
177
|
- name: Install USearch from PyPi
|
|
@@ -188,11 +180,45 @@ jobs:
|
|
|
188
180
|
run: cd docs && make html
|
|
189
181
|
- name: Copy assets
|
|
190
182
|
run: cp -r assets build/docs/html/
|
|
183
|
+
- name: Compress assets
|
|
184
|
+
run: tar -czvf docs.tar.gz build/docs/html/
|
|
185
|
+
- name: Upload docs to release
|
|
186
|
+
uses: xresloader/upload-to-github-release@v1
|
|
187
|
+
env:
|
|
188
|
+
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
|
189
|
+
with:
|
|
190
|
+
file: docs.tar.gz
|
|
191
|
+
asset_name: docs.tar.gz
|
|
192
|
+
|
|
193
|
+
deploy_docs_pages:
|
|
194
|
+
name: Deploy GitHub Pages
|
|
195
|
+
environment:
|
|
196
|
+
name: github-pages
|
|
197
|
+
url: ${{ steps.deployment.outputs.page_url }}
|
|
198
|
+
runs-on: ubuntu-22.04
|
|
199
|
+
needs: build_docs
|
|
200
|
+
if: ${{ github.event.build_docs.conclusion == 'success' }}
|
|
201
|
+
steps:
|
|
202
|
+
- uses: robinraju/release-downloader@v1.8
|
|
203
|
+
with:
|
|
204
|
+
latest: true
|
|
205
|
+
fileName: docs.tar.gz
|
|
206
|
+
- name: Setup GitHub Pages
|
|
207
|
+
uses: actions/configure-pages@v2
|
|
191
208
|
- name: Upload artifacts
|
|
192
209
|
uses: actions/upload-pages-artifact@v1
|
|
193
|
-
with:
|
|
194
|
-
# Upload entire repository
|
|
195
|
-
path: "./build/docs/html/"
|
|
196
210
|
- name: Deploy to GitHub Pages
|
|
197
211
|
id: deployment
|
|
198
212
|
uses: actions/deploy-pages@v1
|
|
213
|
+
|
|
214
|
+
deploy_docs_vercel:
|
|
215
|
+
name: Deploy Vercel
|
|
216
|
+
runs-on: ubuntu-22.04
|
|
217
|
+
needs: build_docs
|
|
218
|
+
if: ${{ github.event.build_docs.conclusion == 'success' }}
|
|
219
|
+
steps:
|
|
220
|
+
- name: Notify Vercel
|
|
221
|
+
uses: fjogeleit/http-request-action@v1
|
|
222
|
+
with:
|
|
223
|
+
url: ${{ secrets.DOCS_VERCEL }}
|
|
224
|
+
method: 'POST'
|
package/.vscode/launch.json
CHANGED
|
@@ -4,6 +4,28 @@
|
|
|
4
4
|
// For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387
|
|
5
5
|
"version": "0.2.0",
|
|
6
6
|
"configurations": [
|
|
7
|
+
{
|
|
8
|
+
"name": "Unit Test C++",
|
|
9
|
+
"type": "cppdbg",
|
|
10
|
+
"request": "launch",
|
|
11
|
+
"program": "${workspaceFolder}/build_debug/test",
|
|
12
|
+
"cwd": "${workspaceFolder}",
|
|
13
|
+
"environment": [
|
|
14
|
+
{
|
|
15
|
+
"name": "ASAN_OPTIONS",
|
|
16
|
+
"value": "detect_leaks=0:atexit=1:strict_init_order=1:strict_string_checks=1"
|
|
17
|
+
}
|
|
18
|
+
],
|
|
19
|
+
"stopAtEntry": false,
|
|
20
|
+
"linux": {
|
|
21
|
+
"preLaunchTask": "Linux Build C++ Bench Debug",
|
|
22
|
+
"MIMode": "gdb"
|
|
23
|
+
},
|
|
24
|
+
"osx": {
|
|
25
|
+
"preLaunchTask": "MacOS Build C++ Bench Debug",
|
|
26
|
+
"MIMode": "lldb"
|
|
27
|
+
}
|
|
28
|
+
},
|
|
7
29
|
{
|
|
8
30
|
"name": "Debug C++ Bench on Wiki 1M @Cos",
|
|
9
31
|
"type": "cppdbg",
|
package/.vscode/settings.json
CHANGED
|
@@ -103,8 +103,10 @@
|
|
|
103
103
|
},
|
|
104
104
|
"cSpell.words": [
|
|
105
105
|
"astype",
|
|
106
|
+
"Availible",
|
|
106
107
|
"BLAS",
|
|
107
108
|
"cflags",
|
|
109
|
+
"citerator",
|
|
108
110
|
"downcasted",
|
|
109
111
|
"Downcasting",
|
|
110
112
|
"dtype",
|
|
@@ -112,12 +114,15 @@
|
|
|
112
114
|
"FAISS",
|
|
113
115
|
"hashable",
|
|
114
116
|
"HNSW",
|
|
117
|
+
"hnswlib",
|
|
115
118
|
"jaccard",
|
|
116
119
|
"longlong",
|
|
117
120
|
"memmap",
|
|
118
121
|
"Napi",
|
|
122
|
+
"ndarray",
|
|
119
123
|
"ndim",
|
|
120
124
|
"Numba",
|
|
125
|
+
"OPENMP",
|
|
121
126
|
"preprocess",
|
|
122
127
|
"Quickstart",
|
|
123
128
|
"simsimd",
|
package/.vscode/tasks.json
CHANGED
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
"tasks": [
|
|
4
4
|
{
|
|
5
5
|
"label": "Linux Build C++ Bench Debug",
|
|
6
|
-
"command": "cmake -DCMAKE_CXX_COMPILER=gcc-12 -DCMAKE_CXX_COMPILER=g++-12 -DCMAKE_BUILD_TYPE=Debug -B ./build_debug && make
|
|
6
|
+
"command": "cmake -DCMAKE_CXX_COMPILER=gcc-12 -DCMAKE_CXX_COMPILER=g++-12 -DCMAKE_BUILD_TYPE=Debug -B ./build_debug && make -C ./build_debug",
|
|
7
7
|
"args": [],
|
|
8
8
|
"type": "shell",
|
|
9
9
|
"problemMatcher": [
|
|
@@ -12,7 +12,7 @@
|
|
|
12
12
|
},
|
|
13
13
|
{
|
|
14
14
|
"label": "Linux Build C++ Bench Release",
|
|
15
|
-
"command": "cmake -DCMAKE_CXX_COMPILER=gcc-12 -DCMAKE_CXX_COMPILER=g++-12 -DCMAKE_BUILD_TYPE=RelWithDebInfo -B ./build_release && make
|
|
15
|
+
"command": "cmake -DCMAKE_CXX_COMPILER=gcc-12 -DCMAKE_CXX_COMPILER=g++-12 -DCMAKE_BUILD_TYPE=RelWithDebInfo -B ./build_release && make -C ./build_release",
|
|
16
16
|
"args": [],
|
|
17
17
|
"type": "shell",
|
|
18
18
|
"problemMatcher": [
|
|
@@ -21,13 +21,13 @@
|
|
|
21
21
|
},
|
|
22
22
|
{
|
|
23
23
|
"label": "MacOS Build C++ Bench Debug",
|
|
24
|
-
"command": "cmake -DCMAKE_C_COMPILER=/opt/homebrew/opt/llvm/bin/clang -DCMAKE_CXX_COMPILER=/opt/homebrew/opt/llvm/bin/clang++ -DCMAKE_BUILD_TYPE=Debug -B ./build_debug && make
|
|
24
|
+
"command": "cmake -DCMAKE_C_COMPILER=/opt/homebrew/opt/llvm/bin/clang -DCMAKE_CXX_COMPILER=/opt/homebrew/opt/llvm/bin/clang++ -DCMAKE_BUILD_TYPE=Debug -B ./build_debug && make -C ./build_debug",
|
|
25
25
|
"args": [],
|
|
26
26
|
"type": "shell",
|
|
27
27
|
},
|
|
28
28
|
{
|
|
29
29
|
"label": "MacOS Build C++ Bench Release",
|
|
30
|
-
"command": "cmake -DCMAKE_C_COMPILER=/opt/homebrew/opt/llvm/bin/clang -DCMAKE_CXX_COMPILER=/opt/homebrew/opt/llvm/bin/clang++ -DCMAKE_BUILD_TYPE=RelWithDebInfo -B ./build_release && make
|
|
30
|
+
"command": "cmake -DCMAKE_C_COMPILER=/opt/homebrew/opt/llvm/bin/clang -DCMAKE_CXX_COMPILER=/opt/homebrew/opt/llvm/bin/clang++ -DCMAKE_BUILD_TYPE=RelWithDebInfo -B ./build_release && make -C ./build_release",
|
|
31
31
|
"args": [],
|
|
32
32
|
"type": "shell"
|
|
33
33
|
}
|
package/CITATION.cff
ADDED
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
cff-version: 1.2.0
|
|
2
|
+
message: "If you use this software, please cite it as below."
|
|
3
|
+
authors:
|
|
4
|
+
- family-names: "Vardanian"
|
|
5
|
+
given-names: "Ashot"
|
|
6
|
+
orcid: "https://orcid.org/0000-0002-4882-1815"
|
|
7
|
+
title: "USearch"
|
|
8
|
+
version: 0.3.0
|
|
9
|
+
doi: 10.5281/zenodo.7949416
|
|
10
|
+
date-released: 2022-06-12
|
|
11
|
+
url: "https://github.com/unum-cloud/usearch"
|
package/CMakeLists.txt
CHANGED
|
@@ -1,107 +1,120 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
option(USEARCH_USE_SIMD "Use SIMD hardware acceleration" OFF)
|
|
11
|
-
|
|
12
|
-
option(USEARCH_BUILD_BENCHMARK "Compile a native benchmark in C++" ON)
|
|
13
|
-
option(USEARCH_BUILD_WOLFRAM "Compile Wolfram Language bindings" OFF)
|
|
14
|
-
|
|
15
|
-
# Make "Release" by default
|
|
16
|
-
if(NOT CMAKE_BUILD_TYPE)
|
|
17
|
-
set(CMAKE_BUILD_TYPE Release)
|
|
1
|
+
# This CMake file is heavily inspired by following `usearch` CMake:
|
|
2
|
+
# https://github.com/nlohmann/json/blob/develop/CMakeLists.txt
|
|
3
|
+
cmake_minimum_required(VERSION 3.1)
|
|
4
|
+
project(usearch VERSION 0.6.0 LANGUAGES CXX)
|
|
5
|
+
|
|
6
|
+
# Determine if USearch is built as a subproject (using `add_subdirectory`) or if it is the main project
|
|
7
|
+
set(USEARCH_IS_MAIN_PROJECT OFF)
|
|
8
|
+
if (CMAKE_CURRENT_SOURCE_DIR STREQUAL CMAKE_SOURCE_DIR)
|
|
9
|
+
set(USEARCH_IS_MAIN_PROJECT ON)
|
|
18
10
|
endif()
|
|
19
11
|
|
|
20
|
-
#
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -march=native")
|
|
26
|
-
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fmax-errors=1")
|
|
27
|
-
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fopenmp")
|
|
28
|
-
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -pedantic")
|
|
29
|
-
|
|
30
|
-
elseif(CMAKE_CXX_COMPILER_ID MATCHES "Clang")
|
|
31
|
-
set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} -Wfatal-errors")
|
|
32
|
-
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fopenmp")
|
|
33
|
-
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -pedantic")
|
|
34
|
-
|
|
35
|
-
elseif(CMAKE_CXX_COMPILER_ID STREQUAL "NVIDIA" OR CMAKE_CXX_COMPILER_ID STREQUAL "NVHPC")
|
|
36
|
-
set(CMAKE_CUDA_FLAGS "${CMAKE_CUDA_FLAGS} --expt-relaxed-constexpr --extended-lambda")
|
|
37
|
-
set(CMAKE_CUDA_FLAGS "${CMAKE_CUDA_FLAGS} -gencode arch=compute_86,code=sm_86")
|
|
38
|
-
set_property(SOURCE src/bench.cpp PROPERTY LANGUAGE CUDA)
|
|
39
|
-
set_target_properties(bench PROPERTIES POSITION_INDEPENDENT_CODE ON)
|
|
40
|
-
set_target_properties(bench PROPERTIES CUDA_ARCHITECTURES "86")
|
|
41
|
-
|
|
42
|
-
elseif(CMAKE_CXX_COMPILER_ID STREQUAL "IntelLLVM")
|
|
43
|
-
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -w")
|
|
44
|
-
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -ferror-limit=1")
|
|
12
|
+
# Options
|
|
13
|
+
option(USEARCH_INSTALL "Install CMake targets" OFF)
|
|
14
|
+
option(USEARCH_BUILD_TEST "Compile a native unit test in C++" ${USEARCH_IS_MAIN_PROJECT})
|
|
15
|
+
option(USEARCH_BUILD_BENCHMARK "Compile a native benchmark in C++" ${USEARCH_IS_MAIN_PROJECT})
|
|
16
|
+
option(USEARCH_BUILD_WOLFRAM "Compile Wolfram Language bindings" OFF)
|
|
45
17
|
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
18
|
+
# Includes
|
|
19
|
+
set(CMAKE_MODULE_PATH ${CMAKE_CURRENT_SOURCE_DIR}/cmake ${CMAKE_MODULE_PATH})
|
|
20
|
+
include(ExternalProject)
|
|
21
|
+
|
|
22
|
+
# Allow CMake 3.13+ to override options when using FetchContent / add_subdirectory
|
|
23
|
+
if (POLICY CMP0077)
|
|
24
|
+
cmake_policy(SET CMP0077 NEW)
|
|
25
|
+
endif ()
|
|
26
|
+
|
|
27
|
+
# Configuration
|
|
28
|
+
include(GNUInstallDirs)
|
|
29
|
+
set(USEARCH_TARGET_NAME ${PROJECT_NAME})
|
|
30
|
+
set(USEARCH_CONFIG_INSTALL_DIR "${CMAKE_INSTALL_DATADIR}/cmake/${PROJECT_NAME}" CACHE INTERNAL "")
|
|
31
|
+
set(USEARCH_INCLUDE_INSTALL_DIR "${CMAKE_INSTALL_INCLUDEDIR}")
|
|
32
|
+
set(USEARCH_TARGETS_EXPORT_NAME "${PROJECT_NAME}Targets")
|
|
33
|
+
set(USEARCH_CMAKE_CONFIG_TEMPLATE "cmake/config.cmake.in")
|
|
34
|
+
set(USEARCH_CMAKE_CONFIG_DIR "${CMAKE_CURRENT_BINARY_DIR}")
|
|
35
|
+
set(USEARCH_CMAKE_VERSION_CONFIG_FILE "${USEARCH_CMAKE_CONFIG_DIR}/${PROJECT_NAME}ConfigVersion.cmake")
|
|
36
|
+
set(USEARCH_CMAKE_PROJECT_CONFIG_FILE "${USEARCH_CMAKE_CONFIG_DIR}/${PROJECT_NAME}Config.cmake")
|
|
37
|
+
set(USEARCH_CMAKE_PROJECT_TARGETS_FILE "${USEARCH_CMAKE_CONFIG_DIR}/${PROJECT_NAME}Targets.cmake")
|
|
38
|
+
set(USEARCH_PKGCONFIG_INSTALL_DIR "${CMAKE_INSTALL_DATADIR}/pkgconfig")
|
|
39
|
+
|
|
40
|
+
|
|
41
|
+
# Define our header-only library
|
|
42
|
+
add_library(${USEARCH_TARGET_NAME} INTERFACE)
|
|
43
|
+
add_library(${PROJECT_NAME}::${USEARCH_TARGET_NAME} ALIAS ${USEARCH_TARGET_NAME})
|
|
44
|
+
set(USEARCH_INCLUDE_BUILD_DIR "${PROJECT_SOURCE_DIR}/include/")
|
|
45
|
+
if (${CMAKE_VERSION} VERSION_LESS "3.8.0")
|
|
46
|
+
target_compile_features(${USEARCH_TARGET_NAME} INTERFACE cxx_range_for)
|
|
50
47
|
else()
|
|
51
|
-
|
|
52
|
-
set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} -O3")
|
|
53
|
-
set(CMAKE_CXX_FLAGS_RELWITHDEBINFO "${CMAKE_CXX_FLAGS_RELWITHDEBINFO} -O3 -pg -g")
|
|
48
|
+
target_compile_features(${USEARCH_TARGET_NAME} INTERFACE cxx_std_11)
|
|
54
49
|
endif()
|
|
55
50
|
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
51
|
+
target_compile_definitions(
|
|
52
|
+
${USEARCH_TARGET_NAME}
|
|
53
|
+
INTERFACE
|
|
54
|
+
$<$<NOT:$<BOOL:${JSON_GlobalUDLs}>>:USEARCH_USE_OPENMP=0>
|
|
55
|
+
)
|
|
56
|
+
target_include_directories(
|
|
57
|
+
${USEARCH_TARGET_NAME}
|
|
58
|
+
${USEARCH_SYSTEM_INCLUDE} INTERFACE
|
|
59
|
+
$<BUILD_INTERFACE:${USEARCH_INCLUDE_BUILD_DIR}>
|
|
60
|
+
$<INSTALL_INTERFACE:include>
|
|
61
|
+
)
|
|
62
|
+
|
|
63
|
+
# Install a pkg-config file, so other tools can find this
|
|
64
|
+
configure_file(
|
|
65
|
+
"${CMAKE_CURRENT_SOURCE_DIR}/cmake/pkg-config.pc.in"
|
|
66
|
+
"${CMAKE_CURRENT_BINARY_DIR}/${PROJECT_NAME}.pc"
|
|
67
|
+
)
|
|
68
|
+
|
|
69
|
+
# Install a custom package version config file instead of
|
|
70
|
+
# write_basic_package_version_file to ensure that it's architecture-independent
|
|
71
|
+
# https://github.com/nlohmann/json/issues/1697
|
|
72
|
+
include(CMakePackageConfigHelpers)
|
|
73
|
+
configure_file(
|
|
74
|
+
"cmake/usearchConfigVersion.cmake.in"
|
|
75
|
+
${USEARCH_CMAKE_VERSION_CONFIG_FILE}
|
|
76
|
+
@ONLY
|
|
77
|
+
)
|
|
78
|
+
configure_file(
|
|
79
|
+
${USEARCH_CMAKE_CONFIG_TEMPLATE}
|
|
80
|
+
${USEARCH_CMAKE_PROJECT_CONFIG_FILE}
|
|
81
|
+
@ONLY
|
|
82
|
+
)
|
|
83
|
+
|
|
84
|
+
if(USEARCH_INSTALL)
|
|
85
|
+
install(
|
|
86
|
+
DIRECTORY ${USEARCH_INCLUDE_BUILD_DIR}
|
|
87
|
+
DESTINATION ${USEARCH_INCLUDE_INSTALL_DIR}
|
|
88
|
+
)
|
|
89
|
+
install(
|
|
90
|
+
FILES ${USEARCH_CMAKE_PROJECT_CONFIG_FILE} ${USEARCH_CMAKE_VERSION_CONFIG_FILE}
|
|
91
|
+
DESTINATION ${USEARCH_CONFIG_INSTALL_DIR}
|
|
92
|
+
)
|
|
93
|
+
export(
|
|
94
|
+
TARGETS ${USEARCH_TARGET_NAME}
|
|
95
|
+
NAMESPACE ${PROJECT_NAME}::
|
|
96
|
+
FILE ${USEARCH_CMAKE_PROJECT_TARGETS_FILE}
|
|
97
|
+
)
|
|
98
|
+
install(
|
|
99
|
+
TARGETS ${USEARCH_TARGET_NAME}
|
|
100
|
+
EXPORT ${USEARCH_TARGETS_EXPORT_NAME}
|
|
101
|
+
INCLUDES DESTINATION ${USEARCH_INCLUDE_INSTALL_DIR}
|
|
102
|
+
)
|
|
103
|
+
install(
|
|
104
|
+
EXPORT ${USEARCH_TARGETS_EXPORT_NAME}
|
|
105
|
+
NAMESPACE ${PROJECT_NAME}::
|
|
106
|
+
DESTINATION ${USEARCH_CONFIG_INSTALL_DIR}
|
|
107
|
+
)
|
|
108
|
+
install(
|
|
109
|
+
FILES "${CMAKE_CURRENT_BINARY_DIR}/${PROJECT_NAME}.pc"
|
|
110
|
+
DESTINATION ${USEARCH_PKGCONFIG_INSTALL_DIR}
|
|
111
|
+
)
|
|
62
112
|
endif()
|
|
63
113
|
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
if(${USEARCH_USE_OPENMP})
|
|
67
|
-
find_package(OpenMP REQUIRED)
|
|
68
|
-
include_directories(${OPENMP_INCLUDE_DIRS})
|
|
69
|
-
endif()
|
|
70
|
-
|
|
71
|
-
if(${USEARCH_USE_JEMALLOC})
|
|
72
|
-
include("${CMAKE_CURRENT_SOURCE_DIR}/cmake/jemalloc.cmake")
|
|
73
|
-
endif()
|
|
74
|
-
|
|
75
|
-
include("${CMAKE_CURRENT_SOURCE_DIR}/cmake/clipp.cmake")
|
|
76
|
-
|
|
77
|
-
include_directories("${CMAKE_CURRENT_SOURCE_DIR}/include")
|
|
78
|
-
include_directories("${CMAKE_CURRENT_SOURCE_DIR}/fp16/include")
|
|
79
|
-
include_directories("${CMAKE_CURRENT_SOURCE_DIR}/simsimd/include")
|
|
80
|
-
include_directories("${CMAKE_CURRENT_SOURCE_DIR}/src")
|
|
81
|
-
|
|
82
|
-
# Define our header-only library.
|
|
83
|
-
add_library(usearch INTERFACE)
|
|
84
|
-
target_sources(usearch INTERFACE "${CMAKE_CURRENT_SOURCE_DIR}/include/usearch/usearch.hpp")
|
|
85
|
-
target_include_directories(usearch INTERFACE "${CMAKE_CURRENT_SOURCE_DIR}/include")
|
|
86
|
-
|
|
87
|
-
# Define the targets
|
|
88
|
-
if(${USEARCH_BUILD_BENCHMARK})
|
|
89
|
-
add_executable(bench src/bench.cpp)
|
|
90
|
-
target_link_libraries(bench PRIVATE Threads::Threads)
|
|
91
|
-
|
|
92
|
-
if(${USEARCH_USE_SIMD})
|
|
93
|
-
target_compile_definitions(bench PRIVATE USEARCH_USE_SIMD=1)
|
|
94
|
-
endif()
|
|
95
|
-
|
|
96
|
-
if(${USEARCH_USE_OPENMP})
|
|
97
|
-
target_link_libraries(bench PRIVATE ${OPENMP_LIBRARIES})
|
|
98
|
-
endif()
|
|
99
|
-
|
|
100
|
-
if(${USEARCH_USE_JEMALLOC})
|
|
101
|
-
target_link_libraries(bench PRIVATE ${JEMALLOC_LIBRARIES})
|
|
102
|
-
endif()
|
|
114
|
+
if(${USEARCH_BUILD_TEST} OR ${USEARCH_BUILD_BENCHMARK})
|
|
115
|
+
add_subdirectory(src)
|
|
103
116
|
endif()
|
|
104
117
|
|
|
105
118
|
if(${USEARCH_BUILD_WOLFRAM})
|
|
106
119
|
add_subdirectory(wolfram)
|
|
107
|
-
endif()
|
|
120
|
+
endif()
|
package/Cargo.toml
CHANGED
package/Dockerfile
ADDED
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
# syntax=docker/dockerfile:1
|
|
2
|
+
|
|
3
|
+
FROM ubuntu:23.04
|
|
4
|
+
RUN apt-get update && \
|
|
5
|
+
apt-get install -y --no-install-recommends python3.11 python3-pip && \
|
|
6
|
+
apt-get clean && \
|
|
7
|
+
rm -rf /var/lib/apt/lists/*
|
|
8
|
+
RUN pip3 install --no-cache-dir --break-system-packages ucall usearch
|
|
9
|
+
|
|
10
|
+
WORKDIR /usearch
|
|
11
|
+
COPY python/usearch/server.py server.py
|
|
12
|
+
|
|
13
|
+
CMD ["python3", "./server.py"]
|
|
14
|
+
EXPOSE 8545
|
package/README.md
CHANGED
|
@@ -157,10 +157,11 @@ index_gt<cos_gt<float>> index;
|
|
|
157
157
|
float vec[3] = {0.1, 0.3, 0.2};
|
|
158
158
|
|
|
159
159
|
index.reserve(10);
|
|
160
|
-
index.add(/* label: */ 42, /* vector: */ {&vec, 3});
|
|
161
|
-
index.search(
|
|
162
|
-
|
|
163
|
-
|
|
160
|
+
index.add(/* label: */ 42, /* vector: */ {&vec[0], 3});
|
|
161
|
+
auto results = index.search(/* query: */ {&vec[0], 3}, 5 /* neighbors */);
|
|
162
|
+
|
|
163
|
+
for (std::size_t i = 0; i != results.size(); ++i)
|
|
164
|
+
results[i].member.label, results[i].member.vector, results[i].distance;
|
|
164
165
|
```
|
|
165
166
|
|
|
166
167
|
The `add` is thread-safe for concurrent index construction.
|
|
@@ -235,7 +236,7 @@ from usearch.index import Index
|
|
|
235
236
|
|
|
236
237
|
index = Index(
|
|
237
238
|
ndim=3, # Define the number of dimensions in input vectors
|
|
238
|
-
metric='cos', # Choose '
|
|
239
|
+
metric='cos', # Choose 'l2sq', 'haversine' or other metric, default = 'ip'
|
|
239
240
|
dtype='f32', # Quantize to 'f16' or 'f8' if needed, default = 'f32'
|
|
240
241
|
connectivity=16, # How frequent should the connections in the graph be, optional
|
|
241
242
|
expansion_add=128, # Control the recall of indexing, optional
|
|
@@ -405,7 +406,7 @@ assert!(index.view("index.usearch").is_ok());
|
|
|
405
406
|
#### Metrics
|
|
406
407
|
|
|
407
408
|
```rust
|
|
408
|
-
assert!(
|
|
409
|
+
assert!(new_l2sq(3, &quant, 0, 0, 0).is_ok());
|
|
409
410
|
assert!(new_cos(3, &quant, 0, 0, 0).is_ok());
|
|
410
411
|
assert!(new_haversine(&quant, 0, 0, 0).is_ok());
|
|
411
412
|
```
|
|
@@ -444,7 +445,7 @@ https://github.com/unum-cloud/usearch
|
|
|
444
445
|
#### Quickstart
|
|
445
446
|
|
|
446
447
|
```swift
|
|
447
|
-
let index = Index.
|
|
448
|
+
let index = Index.l2sq(dimensions: 3, connectivity: 8)
|
|
448
449
|
let vectorA: [Float32] = [0.3, 0.5, 1.2]
|
|
449
450
|
let vectorB: [Float32] = [0.4, 0.2, 1.2]
|
|
450
451
|
index.add(label: 42, vector: vectorA[...])
|
package/VERSION
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
0.
|
|
1
|
+
0.8.0
|
package/binding.gyp
CHANGED
|
@@ -15,8 +15,8 @@
|
|
|
15
15
|
"dependencies": [
|
|
16
16
|
"<!(node -p \"require('node-addon-api').gyp\")"
|
|
17
17
|
],
|
|
18
|
-
"cflags": ["-fexceptions", "-
|
|
19
|
-
"cflags_cc": ["-fexceptions", "-
|
|
18
|
+
"cflags": ["-fexceptions", "-Wno-unknown-pragmas"],
|
|
19
|
+
"cflags_cc": ["-fexceptions", "-Wno-unknown-pragmas", "-std=c++11"],
|
|
20
20
|
"xcode_settings": {
|
|
21
21
|
"GCC_ENABLE_CPP_EXCEPTIONS": "YES",
|
|
22
22
|
"CLANG_CXX_LIBRARY": "libc++",
|
package/build.rs
CHANGED
|
@@ -2,7 +2,7 @@ fn main() {
|
|
|
2
2
|
cxx_build::bridge("rust/lib.rs")
|
|
3
3
|
.file("rust/lib.cpp")
|
|
4
4
|
.flag_if_supported("-std=c++11")
|
|
5
|
-
.flag_if_supported("-
|
|
5
|
+
.flag_if_supported("-Wno-unknown-pragmas")
|
|
6
6
|
.include("include")
|
|
7
7
|
.include("rust")
|
|
8
8
|
.include("src")
|
|
@@ -13,6 +13,6 @@ fn main() {
|
|
|
13
13
|
println!("cargo:rerun-if-changed=rust/lib.rs");
|
|
14
14
|
println!("cargo:rerun-if-changed=rust/lib.cpp");
|
|
15
15
|
println!("cargo:rerun-if-changed=rust/lib.hpp");
|
|
16
|
-
println!("cargo:rerun-if-changed=src/
|
|
16
|
+
println!("cargo:rerun-if-changed=src/punned.hpp");
|
|
17
17
|
println!("cargo:rerun-if-changed=include/usearch/usearch.hpp");
|
|
18
18
|
}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
include(FindPackageHandleStandardArgs)
|
|
2
|
+
set(${CMAKE_FIND_PACKAGE_NAME}_CONFIG ${CMAKE_CURRENT_LIST_FILE})
|
|
3
|
+
find_package_handle_standard_args(@PROJECT_NAME@ CONFIG_MODE)
|
|
4
|
+
|
|
5
|
+
if(NOT TARGET @PROJECT_NAME@::@USEARCH_TARGET_NAME@)
|
|
6
|
+
include("${CMAKE_CURRENT_LIST_DIR}/@USEARCH_TARGETS_EXPORT_NAME@.cmake")
|
|
7
|
+
if((NOT TARGET @USEARCH_TARGET_NAME@) AND
|
|
8
|
+
(NOT @PROJECT_NAME@_FIND_VERSION OR
|
|
9
|
+
@PROJECT_NAME@_FIND_VERSION VERSION_LESS 3.2.0))
|
|
10
|
+
add_library(@USEARCH_TARGET_NAME@ INTERFACE IMPORTED)
|
|
11
|
+
set_target_properties(@USEARCH_TARGET_NAME@ PROPERTIES
|
|
12
|
+
INTERFACE_LINK_LIBRARIES @PROJECT_NAME@::@USEARCH_TARGET_NAME@
|
|
13
|
+
)
|
|
14
|
+
endif()
|
|
15
|
+
endif()
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
# This is essentially cmake's BasicConfigVersion-SameMajorVersion.cmake.in but
|
|
2
|
+
# without the 32/64-bit check. Since USearch is a header-only library, it doesn't
|
|
3
|
+
# matter if it was built on a different platform than what it is used on (see
|
|
4
|
+
# https://github.com/nlohmann/json/issues/1697).
|
|
5
|
+
set(PACKAGE_VERSION "@PROJECT_VERSION@")
|
|
6
|
+
|
|
7
|
+
if(PACKAGE_VERSION VERSION_LESS PACKAGE_FIND_VERSION)
|
|
8
|
+
set(PACKAGE_VERSION_COMPATIBLE FALSE)
|
|
9
|
+
else()
|
|
10
|
+
|
|
11
|
+
if(PACKAGE_FIND_VERSION_MAJOR STREQUAL "@PROJECT_VERSION_MAJOR@")
|
|
12
|
+
set(PACKAGE_VERSION_COMPATIBLE TRUE)
|
|
13
|
+
else()
|
|
14
|
+
set(PACKAGE_VERSION_COMPATIBLE FALSE)
|
|
15
|
+
endif()
|
|
16
|
+
|
|
17
|
+
if(PACKAGE_FIND_VERSION STREQUAL PACKAGE_VERSION)
|
|
18
|
+
set(PACKAGE_VERSION_EXACT TRUE)
|
|
19
|
+
endif()
|
|
20
|
+
endif()
|
package/conanfile.py
CHANGED
|
@@ -4,7 +4,7 @@ from conans import ConanFile
|
|
|
4
4
|
class USearchConan(ConanFile):
|
|
5
5
|
|
|
6
6
|
name = 'USearch'
|
|
7
|
-
version = '0.
|
|
7
|
+
version = '0.8.0'
|
|
8
8
|
license = 'Apache 2.0'
|
|
9
9
|
url = 'https://github.com/unum-cloud/usearch'
|
|
10
10
|
description = 'Smaller & Faster Single-File Vector Search Engine from Unum'
|
package/docs/benchmarks.md
CHANGED
|
@@ -77,7 +77,7 @@ SYNOPSIS
|
|
|
77
77
|
./build_release/bench [--vectors <path>] [--queries <path>] [--neighbors <path>] [-b] [-j
|
|
78
78
|
<integer>] [-c <integer>] [--expansion-add <integer>]
|
|
79
79
|
[--expansion-search <integer>] [--native|--f16quant|--i8quant]
|
|
80
|
-
[--ip|--
|
|
80
|
+
[--ip|--l2sq|--cos|--haversine] [-h]
|
|
81
81
|
|
|
82
82
|
OPTIONS
|
|
83
83
|
--vectors <path>
|
|
@@ -106,7 +106,7 @@ OPTIONS
|
|
|
106
106
|
--f16quant Enable `f16_t` quantization
|
|
107
107
|
--i8quant Enable `int8_t` quantization
|
|
108
108
|
--ip Choose Inner Product metric
|
|
109
|
-
--
|
|
109
|
+
--l2sq Choose L2 Euclidean metric
|
|
110
110
|
--cos Choose Angular metric
|
|
111
111
|
--haversine Choose Haversine metric
|
|
112
112
|
-h, --help Print this help information on this tool and exit
|
|
@@ -170,6 +170,15 @@ mkdir -p datasets/deep_1B/ && \
|
|
|
170
170
|
|
|
171
171
|
## Profiling
|
|
172
172
|
|
|
173
|
+
Enabling Huge Pages:
|
|
174
|
+
|
|
175
|
+
```sh
|
|
176
|
+
sudo cat /proc/sys/vm/nr_hugepages
|
|
177
|
+
sudo sysctl -w vm.nr_hugepages=2048
|
|
178
|
+
sudo reboot
|
|
179
|
+
sudo cat /proc/sys/vm/nr_hugepages
|
|
180
|
+
```
|
|
181
|
+
|
|
173
182
|
With `perf`:
|
|
174
183
|
|
|
175
184
|
```sh
|