usearch 0.4.0 → 0.8.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 (45) hide show
  1. package/.clang-tidy +60 -0
  2. package/.github/workflows/release.yml +42 -16
  3. package/.github/workflows/update_version.sh +1 -0
  4. package/.vscode/launch.json +22 -0
  5. package/.vscode/settings.json +5 -0
  6. package/.vscode/tasks.json +4 -4
  7. package/CITATION.cff +11 -0
  8. package/CMakeLists.txt +108 -95
  9. package/Cargo.toml +1 -1
  10. package/Dockerfile +14 -0
  11. package/README.md +8 -7
  12. package/VERSION +1 -1
  13. package/binding.gyp +2 -2
  14. package/build.rs +2 -2
  15. package/cmake/config.cmake.in +15 -0
  16. package/cmake/pkg-config.pc.in +4 -0
  17. package/cmake/usearchConfigVersion.cmake.in +20 -0
  18. package/conanfile.py +1 -1
  19. package/docs/benchmarks.md +11 -2
  20. package/docs/{Compilation.md → compilation.md} +54 -27
  21. package/include/usearch/usearch.hpp +664 -390
  22. package/java/cloud/unum/usearch/cloud_unum_usearch_Index.cpp +17 -16
  23. package/javascript/lib.cpp +13 -13
  24. package/javascript/test.js +1 -1
  25. package/objc/USearchObjective.mm +46 -29
  26. package/objc/include/USearchObjective.h +18 -26
  27. package/package.json +1 -1
  28. package/pyproject.toml +3 -2
  29. package/python/lib.cpp +179 -120
  30. package/python/scripts/bench.py +188 -0
  31. package/python/scripts/bench_params.py +113 -0
  32. package/python/{test.py → scripts/test.py} +32 -13
  33. package/python/usearch/client.py +100 -14
  34. package/python/usearch/server.py +104 -23
  35. package/rust/lib.cpp +15 -14
  36. package/rust/lib.hpp +5 -5
  37. package/rust/lib.rs +3 -3
  38. package/setup.py +7 -0
  39. package/src/CMakeLists.txt +107 -0
  40. package/src/bench.cpp +45 -15
  41. package/src/{advanced.hpp → punned.hpp} +227 -199
  42. package/src/test.cpp +62 -0
  43. package/swift/Test.swift +1 -1
  44. package/wolfram/lib.cpp +14 -14
  45. package/python/bench.py +0 -146
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 for Windows
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
- deploy_docs:
169
- name: Deploy Docs
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'
@@ -2,5 +2,6 @@
2
2
 
3
3
  echo $1 > VERSION &&
4
4
  sed -i "s/\"version\": \".*\"/\"version\": \"$1\"/" package.json &&
5
+ sed -i "s/^version: .*/version: $1/" CITATION.cff &&
5
6
  sed -i "s/version = \".*\"/version = \"$1\"/" Cargo.toml &&
6
7
  sed -i "s/version = '.*'/version = '$1'/" conanfile.py
@@ -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",
@@ -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",
@@ -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 bench -C ./build_debug",
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 bench -C ./build_release",
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 bench -C ./build_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 -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 bench -C ./build_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 -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
- cmake_minimum_required(VERSION 3.11 FATAL_ERROR)
2
- project(usearch LANGUAGES CXX)
3
-
4
- set(CMAKE_CXX_STANDARD 11)
5
- set(CMAKE_CXX_STANDARD_REQUIRED YES)
6
- set(CMAKE_CXX_EXTENSIONS NO)
7
-
8
- option(USEARCH_USE_JEMALLOC "Use JeMalloc for Faster Memory Allocations" OFF)
9
- option(USEARCH_USE_OPENMP "Use OpenMP for a thread pool" OFF)
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
- # List of all possible compiler IDs:
21
- # https://cmake.org/cmake/help/latest/variable/CMAKE_LANG_COMPILER_ID.html
22
- if(CMAKE_CXX_COMPILER_ID STREQUAL "GNU")
23
- set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} -fsanitize=address")
24
- set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} -Wall -Wextra -Wno-conversion -Wno-unknown-pragmas")
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
- elseif(CMAKE_CXX_COMPILER_ID MATCHES "MSVC")
47
- set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} /DEBUG")
48
- set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} /O2")
49
- set(CMAKE_CXX_FLAGS_RELWITHDEBINFO "${CMAKE_CXX_FLAGS_RELWITHDEBINFO} /O2 /DEBUG")
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
- set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} -g -O0")
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
- if(APPLE)
57
- set(CMAKE_THREAD_LIBS_INIT "-lpthread")
58
- set(CMAKE_HAVE_THREADS_LIBRARY 1)
59
- set(CMAKE_USE_WIN32_THREADS_INIT 0)
60
- set(CMAKE_USE_PTHREADS_INIT 1)
61
- set(THREADS_PREFER_PTHREAD_FLAG ON)
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
- find_package(Threads REQUIRED)
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
@@ -1,6 +1,6 @@
1
1
  [package]
2
2
  name = "usearch"
3
- version = "0.4.0"
3
+ version = "0.8.1"
4
4
  authors = ["Ashot Vardanian <1983160+ashvardanian@users.noreply.github.com>"]
5
5
  description = "Smaller & Faster Single-File Vector Search Engine from Unum"
6
6
  edition = "2021"
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
- /* query: */ {&vec, 3}, /* top */ 5 /* results */,
163
- /* with callback: */ [](std::size_t label, float distance) { });
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 'l2', 'haversine' or other metric, default = 'ip'
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!(new_l2(3, &quant, 0, 0, 0).is_ok());
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.l2(dimensions: 3, connectivity: 8)
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.4.0
1
+ 0.8.1
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", "-Wunknown-pragmas", "-std=c99"],
19
- "cflags_cc": ["-fexceptions", "-Wunknown-pragmas", "-std=c++11"],
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("-Wunknown-pragmas")
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/advanced.hpp");
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,4 @@
1
+ Name: ${PROJECT_NAME}
2
+ Description: Smaller & Faster Single-File Vector Search Engine from Unum
3
+ Version: ${PROJECT_VERSION}
4
+ Cflags: -I${CMAKE_INSTALL_FULL_INCLUDEDIR}
@@ -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.4.0'
7
+ version = '0.8.1'
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'
@@ -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|--l2|--cos|--haversine] [-h]
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
- --l2 Choose L2 Euclidean metric
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