usearch


Nameusearch JSON
Version 2.9.2 PyPI version JSON
download
home_page
SummarySmaller & Faster Single-File Vector Search Engine from Unum
upload_time2024-03-05 00:47:38
maintainer
docs_urlNone
authorAsh Vardanian
requires_python
licenseApache-2.0
keywords
VCS
bugtrack_url
requirements No requirements were recorded.
Travis-CI No Travis.
coveralls test coverage No coveralls.
            <h1 align="center">USearch</h1>
<h3 align="center">
Smaller & <a href="https://www.unum.cloud/blog/2023-11-07-scaling-vector-search-with-intel">Faster</a> Single-File<br/>
Similarity Search Engine for <a href="https://github.com/ashvardanian/simsimd">Vectors</a> & πŸ”œ <a href="https://github.com/ashvardanian/stringzilla">Texts</a>
</h3>
<br/>

<p align="center">
<a href="https://discord.gg/A6wxt6dS9j"><img height="25" src="https://github.com/unum-cloud/.github/raw/main/assets/discord.svg" alt="Discord"></a>
&nbsp;&nbsp;&nbsp;
<a href="https://www.linkedin.com/company/unum-cloud/"><img height="25" src="https://github.com/unum-cloud/.github/raw/main/assets/linkedin.svg" alt="LinkedIn"></a>
&nbsp;&nbsp;&nbsp;
<a href="https://twitter.com/unum_cloud"><img height="25" src="https://github.com/unum-cloud/.github/raw/main/assets/twitter.svg" alt="Twitter"></a>
&nbsp;&nbsp;&nbsp;
<a href="https://unum.cloud/post"><img height="25" src="https://github.com/unum-cloud/.github/raw/main/assets/blog.svg" alt="Blog"></a>
&nbsp;&nbsp;&nbsp;
<a href="https://github.com/unum-cloud/usearch"><img height="25" src="https://github.com/unum-cloud/.github/raw/main/assets/github.svg" alt="GitHub"></a>
</p>

<p align="center">
Spatial β€’ Binary β€’ Probabilistic β€’ User-Defined Metrics
<br/>
<a href="https://unum-cloud.github.io/usearch/cpp">C++ 11</a> β€’
<a href="https://unum-cloud.github.io/usearch/python">Python 3</a> β€’
<a href="https://unum-cloud.github.io/usearch/javascript">JavaScript</a> β€’
<a href="https://unum-cloud.github.io/usearch/java">Java</a> β€’
<a href="https://unum-cloud.github.io/usearch/rust">Rust</a> β€’
<a href="https://unum-cloud.github.io/usearch/c">C 99</a> β€’
<a href="https://unum-cloud.github.io/usearch/objective-c">Objective-C</a> β€’
<a href="https://unum-cloud.github.io/usearch/swift">Swift</a> β€’
<a href="https://unum-cloud.github.io/usearch/csharp">C#</a> β€’
<a href="https://unum-cloud.github.io/usearch/golang">GoLang</a> β€’
<a href="https://unum-cloud.github.io/usearch/wolfram">Wolfram</a>
<br/>
Linux β€’ MacOS β€’ Windows β€’ iOS β€’ WebAssembly β€’
<a href="https://unum-cloud.github.io/usearch/sqlite">SQLite3</a>
</p>

<div align="center">
<a href="https://pepy.tech/project/usearch"> <img alt="PyPI" src="https://static.pepy.tech/personalized-badge/usearch?period=total&units=abbreviation&left_color=black&right_color=blue&left_text=Python%20PyPi%20installs"> </a>
<a href="https://www.npmjs.com/package/usearch"> <img alt="NPM" src="https://img.shields.io/npm/dy/usearch?label=JavaScript%20NPM%20installs"> </a>
<a href="https://crates.io/crates/usearch"> <img alt="Crate" src="https://img.shields.io/crates/d/usearch?label=Rust%20Crate%20installs"> </a>
<a href="https://www.nuget.org/packages/Cloud.Unum.USearch"> <img alt="NuGet" src="https://img.shields.io/nuget/dt/Cloud.Unum.USearch?label=CSharp%20NuGet%20installs"> </a>
<a href="https://central.sonatype.com/artifact/cloud.unum/usearch/overview"> <img alt="Maven" src="https://img.shields.io/nexus/r/cloud.unum/usearch?server=https%3A%2F%2Fs01.oss.sonatype.org%2F&label=Java%20Maven%20version"> </a>
<img alt="GitHub code size in bytes" src="https://img.shields.io/github/languages/code-size/unum-cloud/usearch?label=Repo%20size">
</div>

---

- βœ… __[10x faster][faster-than-faiss]__ [HNSW][hnsw-algorithm] implementation than [FAISS][faiss].
- βœ… Simple and extensible [single C++11 header][usearch-header] __library__.
- βœ… [Trusted](#integrations) by giants like Google and databases like [ClickHouse][clickhouse-docs].
- βœ… [SIMD][simd]-optimized and [user-defined metrics](#user-defined-functions) with JIT compilation.
- βœ… Hardware-agnostic `f16` & `i8` - [half-precision & quarter-precision support](#memory-efficiency-downcasting-and-quantization).
- βœ… [View large indexes from disk](#serving-index-from-disk) without loading into RAM.
- βœ… Heterogeneous lookups, renaming/relabeling, and on-the-fly deletions.
- βœ… Binary Tanimoto and Sorensen coefficients for [Genomics and Chemistry applications](#usearch--rdkit--molecular-search).
- βœ… Space-efficient point-clouds with `uint40_t`, accommodating 4B+ size.
- βœ… Compatible with OpenMP and custom "executors" for fine-grained parallelism.
- βœ… [Semantic Search](#usearch--ai--multi-modal-semantic-search) and [Joins](#joins-one-to-one-one-to-many-and-many-to-many-mappings).
- πŸ”„ Near-real-time [clustering and sub-clustering](#clustering) for Tens or Millions of clusters.

[faiss]: https://github.com/facebookresearch/faiss
[usearch-header]: https://github.com/unum-cloud/usearch/blob/main/include/usearch/index.hpp
[obscure-use-cases]: https://ashvardanian.com/posts/abusing-vector-search
[hnsw-algorithm]: https://arxiv.org/abs/1603.09320
[simd]: https://en.wikipedia.org/wiki/Single_instruction,_multiple_data
[faster-than-faiss]: https://www.unum.cloud/blog/2023-11-07-scaling-vector-search-with-intel
[clickhouse-docs]: https://clickhouse.com/docs/en/engines/table-engines/mergetree-family/annindexes#usearch

__Technical Insights__ and related articles:

- [Uses Horner's method for polynomial approximations, beating GCC 12 by 119x](https://ashvardanian.com/posts/gcc-12-vs-avx512fp16/).
- [Uses Arm SVE and x86 AVX-512's masked loads to eliminate tail `for`-loops](https://ashvardanian.com/posts/simsimd-faster-scipy/#tails-of-the-past-the-significance-of-masked-loads).
- [Uses AVX-512 FP16 for half-precision operations, that few compilers vectorize](https://ashvardanian.com/posts/simsimd-faster-scipy/#the-challenge-of-f16).
- [Substitutes LibC's `sqrt` calls with bithacks using Jan Kadlec's constant](https://ashvardanian.com/posts/simsimd-faster-scipy/#bonus-section-bypassing-sqrt-and-libc-dependencies).
- [For every language implements a custom separate binding](https://ashvardanian.com/posts/porting-cpp-library-to-ten-languages/).
- [For Python avoids slow PyBind11, and even `PyArg_ParseTuple` for speed](https://ashvardanian.com/posts/pybind11-cpython-tutorial/).
- [For JavaScript uses typed arrays and NAPI for zero-copy calls](https://ashvardanian.com/posts/javascript-ai-vector-search/).

## Comparison with FAISS

FAISS is a widely recognized standard for high-performance vector search engines.
USearch and FAISS both employ the same HNSW algorithm, but they differ significantly in their design principles.
USearch is compact and broadly compatible without sacrificing performance, primarily focusing on user-defined metrics and fewer dependencies.

|                                              |                   FAISS |                  USearch |             Improvement |
| :------------------------------------------- | ----------------------: | -----------------------: | ----------------------: |
| Indexing time ⁰                              |                         |                          |                         |
| 100 Million 96d `f32`, `f16`, `i8` vectors   |       2.6 Β· 2.6 Β· 2.6 h |        0.3 Β· 0.2 Β· 0.2 h | __9.6 Β· 10.4 Β· 10.7 x__ |
| 100 Million 1536d `f32`, `f16`, `i8` vectors |       5.0 Β· 4.1 Β· 3.8 h |        2.1 Β· 1.1 Β· 0.8 h |   __2.3 Β· 3.6 Β· 4.4 x__ |
|                                              |                         |                          |                         |
| Codebase length ΒΉ                            |       84 K [SLOC][sloc] |         3 K [SLOC][sloc] |            maintainable |
| Supported metrics Β²                          |         9 fixed metrics |               any metric |              extendible |
| Supported languages Β³                        |             C++, Python |             10 languages |                portable |
| Supported ID types ⁴                         |          32-bit, 64-bit |   32-bit, 40-bit, 64-bit |               efficient |
| Required dependencies ⁡                      |            BLAS, OpenMP |                        - |            light-weight |
| Bindings ⁢                                   |                    SWIG |                   Native |             low-latency |
| Python binding size ⁷                        | [~ 10 MB][faiss-weight] | [< 1 MB][usearch-weight] |              deployable |

[sloc]: https://en.wikipedia.org/wiki/Source_lines_of_code
[faiss-weight]: https://pypi.org/project/faiss-cpu/#files
[usearch-weight]: https://pypi.org/project/usearch/#files

> ⁰ [Tested][intel-benchmarks] on Intel Sapphire Rapids, with the simplest inner-product distance, equivalent recall, and memory consumption while also providing far superior search speed.
> ΒΉ A shorter codebase of `usearch/` over `faiss/` makes the project easier to maintain and audit.
> Β² User-defined metrics allow you to customize your search for various applications, from GIS to creating custom metrics for composite embeddings from multiple AI models or hybrid full-text and semantic search.
> Β³ With USearch, you can reuse the same preconstructed index in various programming languages.
> ⁴ The 40-bit integer allows you to store 4B+ vectors without allocating 8 bytes for every neighbor reference in the proximity graph.
> ⁡ Lack of obligatory dependencies makes USearch much more portable.
> ⁢ Native bindings introduce lower call latencies than more straightforward approaches.
> ⁷ Lighter bindings make downloads and deployments faster.

[intel-benchmarks]: https://www.unum.cloud/blog/2023-11-07-scaling-vector-search-with-intel

Base functionality is identical to FAISS, and the interface must be familiar if you have ever investigated Approximate Nearest Neighbors search:

```py
$ pip install numpy usearch

import numpy as np
from usearch.index import Index

index = Index(ndim=3)

vector = np.array([0.2, 0.6, 0.4])
index.add(42, vector)

matches = index.search(vector, 10)

assert matches[0].key == 42
assert matches[0].distance <= 0.001
assert np.allclose(index[42], vector, atol=0.1) # Ensure high tolerance in mixed-precision comparisons
```

More settings are always available, and the API is designed to be as flexible as possible.

```py
index = Index(
    ndim=3, # Define the number of dimensions in input vectors
    metric='cos', # Choose 'l2sq', 'haversine' or other metric, default = 'ip'
    dtype='f32', # Quantize to 'f16' or 'i8' if needed, default = 'f32'
    connectivity=16, # Optional: Limit number of neighbors per graph node
    expansion_add=128, # Optional: Control the recall of indexing
    expansion_search=64, # Optional: Control the quality of the search
    multi=False, # Optional: Allow multiple vectors per key, default = False
)
```

## Serialization & Serving `Index` from Disk

USearch supports multiple forms of serialization:

- Into a __file__ defined with a path.
- Into a __stream__ defined with a callback, serializing or reconstructing incrementally.
- Into a __buffer__ of fixed length or a memory-mapped file that supports random access.

The latter allows you to serve indexes from external memory, enabling you to optimize your server choices for indexing speed and serving costs.
This can result in __20x cost reduction__ on AWS and other public clouds.

```py
index.save("index.usearch")

loaded_copy = index.load("index.usearch")
view = Index.restore("index.usearch", view=True)

other_view = Index(ndim=..., metric=...)
other_view.view("index.usearch")
```

## Exact vs. Approximate Search

Approximate search methods, such as HNSW, are predominantly used when an exact brute-force search becomes too resource-intensive.
This typically occurs when you have millions of entries in a collection.
For smaller collections, we offer a more direct approach with the `search` method.

```py
from usearch.index import search, MetricKind, Matches, BatchMatches
import numpy as np

# Generate 10'000 random vectors with 1024 dimensions
vectors = np.random.rand(10_000, 1024).astype(np.float32)
vector = np.random.rand(1024).astype(np.float32)

one_in_many: Matches = search(vectors, vector, 50, MetricKind.L2sq, exact=True)
many_in_many: BatchMatches = search(vectors, vectors, 50, MetricKind.L2sq, exact=True)
```

If you pass the `exact=True` argument, the system bypasses indexing altogether and performs a brute-force search through the entire dataset using SIMD-optimized similarity metrics from [SimSIMD](https://github.com/ashvardanian/simsimd).
When compared to FAISS's `IndexFlatL2` in Google Colab, __[USearch may offer up to a 20x performance improvement](https://github.com/unum-cloud/usearch/issues/176#issuecomment-1666650778)__:

- `faiss.IndexFlatL2`: __55.3 ms__.
- `usearch.index.search`: __2.54 ms__.

## `Indexes` for Multi-Index Lookups

For larger workloads targeting billions or even trillions of vectors, parallel multi-index lookups become invaluable.
Instead of constructing one extensive index, you can build multiple smaller ones and view them together.

```py
from usearch.index import Indexes

multi_index = Indexes(
    indexes: Iterable[usearch.index.Index] = [...],
    paths: Iterable[os.PathLike] = [...],
    view: bool = False,
    threads: int = 0,
)
multi_index.search(...)
```

## Clustering

Once the index is constructed, USearch can perform K-Nearest Neighbors Clustering much faster than standalone clustering libraries, like SciPy, 
UMap, and tSNE.
Same for dimensionality reduction with PCA. 
Essentially, the `Index` itself can be seen as a clustering, allowing iterative deepening.

```py
clustering = index.cluster(
    min_count=10, # Optional
    max_count=15, # Optional
    threads=..., # Optional
)

# Get the clusters and their sizes
centroid_keys, sizes = clustering.centroids_popularity

# Use Matplotlib to draw a histogram
clustering.plot_centroids_popularity()

# Export a NetworkX graph of the clusters
g = clustering.network

# Get members of a specific cluster
first_members = clustering.members_of(centroid_keys[0])

# Deepen into that cluster, splitting it into more parts, all the same arguments supported
sub_clustering = clustering.subcluster(min_count=..., max_count=...)
```

The resulting clustering isn't identical to K-Means or other conventional approaches but serves the same purpose.
Alternatively, using Scikit-Learn on a 1 Million point dataset, one may expect queries to take anywhere from minutes to hours, depending on the number of clusters you want to highlight.
For 50'000 clusters, the performance difference between USearch and conventional clustering methods may easily reach 100x.

## Joins, One-to-One, One-to-Many, and Many-to-Many Mappings

One of the big questions these days is how AI will change the world of databases and data management.
Most databases are still struggling to implement high-quality fuzzy search, and the only kind of joins they know are deterministic.
A `join` differs from searching for every entry, requiring a one-to-one mapping banning collisions among separate search results.

| Exact Search | Fuzzy Search | Semantic Search ? |
| :----------: | :----------: | :---------------: |
|  Exact Join  | Fuzzy Join ? | Semantic Join ??  |

Using USearch, one can implement sub-quadratic complexity approximate, fuzzy, and semantic joins.
This can be useful in any fuzzy-matching tasks common to Database Management Software.

```py
men = Index(...)
women = Index(...)
pairs: dict = men.join(women, max_proposals=0, exact=False)
```

> Read more in the post: [Combinatorial Stable Marriages for Semantic Search πŸ’](https://ashvardanian.com/posts/searching-stable-marriages)

## User-Defined Functions

While most vector search packages concentrate on just a few metrics - "Inner Product distance" and "Euclidean distance," USearch extends this list to include any user-defined metrics.
This flexibility allows you to customize your search for various applications, from computing geospatial coordinates with the rare [Haversine][haversine] distance to creating custom metrics for composite embeddings from multiple AI models.

![USearch: Vector Search Approaches](https://github.com/unum-cloud/usearch/blob/main/assets/usearch-approaches-white.png?raw=true)

Unlike older approaches indexing high-dimensional spaces, like KD-Trees and Locality Sensitive Hashing, HNSW doesn't require vectors to be identical in length.
They only have to be comparable.
So you can apply it in [obscure][obscure] applications, like searching for similar sets or fuzzy text matching, using [GZip][gzip-similarity] as a distance function.

> Read more about [JIT and UDF in USearch Python SDK](https://unum-cloud.github.io/usearch/python#user-defined-metrics-and-jit-in-python).

[haversine]: https://ashvardanian.com/posts/abusing-vector-search#geo-spatial-indexing
[obscure]: https://ashvardanian.com/posts/abusing-vector-search
[gzip-similarity]: https://twitter.com/LukeGessler/status/1679211291292889100?s=20

## Memory Efficiency, Downcasting, and Quantization

Training a quantization model and dimension-reduction is a common approach to accelerate vector search.
Those, however, are only sometimes reliable, can significantly affect the statistical properties of your data, and require regular adjustments if your distribution shifts.
Instead, we have focused on high-precision arithmetic over low-precision downcasted vectors.
The same index, and `add` and `search` operations will automatically down-cast or up-cast between `f64_t`, `f32_t`, `f16_t`, `i8_t`, and single-bit representations.
You can use the following command to check, if hardware acceleration is enabled:

```sh
$ python -c 'from usearch.index import Index; print(Index(ndim=768, metric="cos", dtype="f16").hardware_acceleration)'
> avx512+f16
$ python -c 'from usearch.index import Index; print(Index(ndim=166, metric="tanimoto").hardware_acceleration)'
> avx512+popcnt
```

Using smaller numeric types will save you RAM needed to store the vectors, but you can also compress the neighbors lists forming our proximity graphs.
By default, 32-bit `uint32_t` is used to enumerate those, which is not enough if you need to address over 4 Billion entries.
For such cases we provide a custom `uint40_t` type, that will still be 37.5% more space-efficient than the commonly used 8-byte integers, and will scale up to 1 Trillion entries.

![USearch uint40_t support](https://github.com/unum-cloud/usearch/blob/main/assets/usearch-neighbor-types.png?raw=true)

## Functionality

By now, the core functionality is supported across all bindings.
Broader functionality is ported per request.
In some cases, like Batch operations, feature parity is meaningless, as the host language has full multi-threading capabilities and the USearch index structure is concurrent by design, so the users can implement batching/scheduling/load-balancing in the most optimal way for their applications.

|                         | C++ 11 | Python 3 | C 99  | Java  | JavaScript | Rust  | GoLang | Swift |
| :---------------------- | :----: | :------: | :---: | :---: | :--------: | :---: | :----: | :---: |
| Add, search, remove     |   βœ…    |    βœ…     |   βœ…   |   βœ…   |     βœ…      |   βœ…   |   βœ…    |   βœ…   |
| Save, load, view        |   βœ…    |    βœ…     |   βœ…   |   βœ…   |     βœ…      |   βœ…   |   βœ…    |   βœ…   |
| User-defined metrics    |   βœ…    |    βœ…     |   βœ…   |   ❌   |     ❌      |   ❌   |   ❌    |   ❌   |
| Batch operations        |   ❌    |    βœ…     |   ❌   |   ❌   |     βœ…      |   ❌   |   ❌    |   ❌   |
| Joins                   |   βœ…    |    βœ…     |   ❌   |   ❌   |     ❌      |   ❌   |   ❌    |   ❌   |
| Variable-length vectors |   βœ…    |    ❌     |   ❌   |   ❌   |     ❌      |   ❌   |   ❌    |   ❌   |
| 4B+ capacities          |   βœ…    |    ❌     |   ❌   |   ❌   |     ❌      |   ❌   |   ❌    |   ❌   |

## Application Examples

### USearch + AI = Multi-Modal Semantic Search

[![USearch Semantic Image Search](https://github.com/ashvardanian/usearch-images/raw/main/assets/usearch-images-slow.gif)](https://github.com/ashvardanian/usearch-images)

AI has a growing number of applications, but one of the coolest classic ideas is to use it for Semantic Search.
One can take an encoder model, like the multi-modal [UForm](https://github.com/unum-cloud/uform), and a web-programming framework, like UCall, and build a text-to-image search platform in just 20 lines of Python.

```python
import ucall
import uform
import usearch

import numpy as np
import PIL as pil

server = ucall.Server()
model = uform.get_model('unum-cloud/uform-vl-multilingual')
index = usearch.index.Index(ndim=256)

@server
def add(key: int, photo: pil.Image.Image):
    image = model.preprocess_image(photo)
    vector = model.encode_image(image).detach().numpy()
    index.add(key, vector.flatten(), copy=True)

@server
def search(query: str) -> np.ndarray:
    tokens = model.preprocess_text(query)
    vector = model.encode_text(tokens).detach().numpy()
    matches = index.search(vector.flatten(), 3)
    return matches.keys

server.run()
```

A more complete [demo with Streamlit is available on GitHub](https://github.com/ashvardanian/usearch-images).
We have pre-processed some commonly used datasets, cleaned the images, produced the vectors, and pre-built the index.

| Dataset                             |            Modalities | Images |                              Download |
| :---------------------------------- | --------------------: | -----: | ------------------------------------: |
| [Unsplash][unsplash-25k-origin]     | Images & Descriptions |   25 K | [HuggingFace / Unum][unsplash-25k-hf] |
| [Conceptual Captions][cc-3m-origin] | Images & Descriptions |    3 M |        [HuggingFace / Unum][cc-3m-hf] |
| [Arxiv][arxiv-2m-origin]            |    Titles & Abstracts |    2 M |     [HuggingFace / Unum][arxiv-2m-hf] |

[unsplash-25k-origin]: https://github.com/unsplash/datasets
[cc-3m-origin]: https://huggingface.co/datasets/conceptual_captions
[arxiv-2m-origin]: https://www.kaggle.com/datasets/Cornell-University/arxiv

[unsplash-25k-hf]: https://huggingface.co/datasets/unum-cloud/ann-unsplash-25k
[cc-3m-hf]: https://huggingface.co/datasets/unum-cloud/ann-cc-3m
[arxiv-2m-hf]: https://huggingface.co/datasets/unum-cloud/ann-arxiv-2m

### USearch + RDKit = Molecular Search

Comparing molecule graphs and searching for similar structures is expensive and slow.
It can be seen as a special case of the NP-Complete Subgraph Isomorphism problem.
Luckily, domain-specific approximate methods exist.
The one commonly used in Chemistry is to generate structures from [SMILES][smiles] and later hash them into binary fingerprints.
The latter are searchable with binary similarity metrics, like the Tanimoto coefficient.
Below is an example using the RDKit package.

```python
from usearch.index import Index, MetricKind
from rdkit import Chem
from rdkit.Chem import AllChem

import numpy as np

molecules = [Chem.MolFromSmiles('CCOC'), Chem.MolFromSmiles('CCO')]
encoder = AllChem.GetRDKitFPGenerator()

fingerprints = np.vstack([encoder.GetFingerprint(x) for x in molecules])
fingerprints = np.packbits(fingerprints, axis=1)

index = Index(ndim=2048, metric=MetricKind.Tanimoto)
keys = np.arange(len(molecules))

index.add(keys, fingerprints)
matches = index.search(fingerprints, 10)
```

That method was used to build the ["USearch Molecules"](https://github.com/ashvardanian/usearch-molecules), one of the largest Chem-Informatics datasets, containing 7 billion small molecules and 28 billion fingerprints.

[smiles]: https://en.wikipedia.org/wiki/Simplified_molecular-input_line-entry_system
[rdkit-fingerprints]: https://www.rdkit.org/docs/RDKit_Book.html#additional-information-about-the-fingerprints

### USearch + POI Coordinates = GIS Applications... on iOS?

[![USearch Maps with SwiftUI](https://github.com/ashvardanian/SwiftVectorSearch/raw/main/USearch+SwiftUI.gif)](https://github.com/ashvardanian/SwiftVectorSearch)

With Objective-C and Swift iOS bindings, USearch can be easily used in mobile applications.
The [SwiftVectorSearch](https://github.com/ashvardanian/SwiftVectorSearch) project illustrates how to build a dynamic, real-time search system on iOS.
In this example, we use 2-dimensional vectorsβ€”encoded as latitude and longitudeβ€”to find the closest Points of Interest (POIs) on a map.
The search is based on the Haversine distance metric but can easily be extended to support high-dimensional vectors.

## Integrations

- [x] GPTCache: [Python](https://github.com/zilliztech/GPTCache/releases/tag/0.1.29).
- [x] LangChain: [Python](https://github.com/langchain-ai/langchain/releases/tag/v0.0.257) and [JavaScript](https://github.com/hwchase17/langchainjs/releases/tag/0.0.125).
- [x] ClickHouse: [C++](https://github.com/ClickHouse/ClickHouse/pull/53447).
- [x] Microsoft Semantic Kernel: [Python](https://github.com/microsoft/semantic-kernel/releases/tag/python-0.3.9.dev) and C#.
- [x] LanternDB: [C++](https://github.com/lanterndata/lantern) and [Rust](https://github.com/lanterndata/lantern_extras).

## Citations

```txt
@software{Vardanian_USearch_2023,
doi = {10.5281/zenodo.7949416},
author = {Vardanian, Ash},
title = {{USearch by Unum Cloud}},
url = {https://github.com/unum-cloud/usearch},
version = {2.9.2},
year = {2023},
month = oct,
}
```

            

Raw data

            {
    "_id": null,
    "home_page": "",
    "name": "usearch",
    "maintainer": "",
    "docs_url": null,
    "requires_python": "",
    "maintainer_email": "",
    "keywords": "",
    "author": "Ash Vardanian",
    "author_email": "info@unum.cloud",
    "download_url": "",
    "platform": null,
    "description": "<h1 align=\"center\">USearch</h1>\n<h3 align=\"center\">\nSmaller & <a href=\"https://www.unum.cloud/blog/2023-11-07-scaling-vector-search-with-intel\">Faster</a> Single-File<br/>\nSimilarity Search Engine for <a href=\"https://github.com/ashvardanian/simsimd\">Vectors</a> & \ud83d\udd1c <a href=\"https://github.com/ashvardanian/stringzilla\">Texts</a>\n</h3>\n<br/>\n\n<p align=\"center\">\n<a href=\"https://discord.gg/A6wxt6dS9j\"><img height=\"25\" src=\"https://github.com/unum-cloud/.github/raw/main/assets/discord.svg\" alt=\"Discord\"></a>\n&nbsp;&nbsp;&nbsp;\n<a href=\"https://www.linkedin.com/company/unum-cloud/\"><img height=\"25\" src=\"https://github.com/unum-cloud/.github/raw/main/assets/linkedin.svg\" alt=\"LinkedIn\"></a>\n&nbsp;&nbsp;&nbsp;\n<a href=\"https://twitter.com/unum_cloud\"><img height=\"25\" src=\"https://github.com/unum-cloud/.github/raw/main/assets/twitter.svg\" alt=\"Twitter\"></a>\n&nbsp;&nbsp;&nbsp;\n<a href=\"https://unum.cloud/post\"><img height=\"25\" src=\"https://github.com/unum-cloud/.github/raw/main/assets/blog.svg\" alt=\"Blog\"></a>\n&nbsp;&nbsp;&nbsp;\n<a href=\"https://github.com/unum-cloud/usearch\"><img height=\"25\" src=\"https://github.com/unum-cloud/.github/raw/main/assets/github.svg\" alt=\"GitHub\"></a>\n</p>\n\n<p align=\"center\">\nSpatial \u2022 Binary \u2022 Probabilistic \u2022 User-Defined Metrics\n<br/>\n<a href=\"https://unum-cloud.github.io/usearch/cpp\">C++ 11</a> \u2022\n<a href=\"https://unum-cloud.github.io/usearch/python\">Python 3</a> \u2022\n<a href=\"https://unum-cloud.github.io/usearch/javascript\">JavaScript</a> \u2022\n<a href=\"https://unum-cloud.github.io/usearch/java\">Java</a> \u2022\n<a href=\"https://unum-cloud.github.io/usearch/rust\">Rust</a> \u2022\n<a href=\"https://unum-cloud.github.io/usearch/c\">C 99</a> \u2022\n<a href=\"https://unum-cloud.github.io/usearch/objective-c\">Objective-C</a> \u2022\n<a href=\"https://unum-cloud.github.io/usearch/swift\">Swift</a> \u2022\n<a href=\"https://unum-cloud.github.io/usearch/csharp\">C#</a> \u2022\n<a href=\"https://unum-cloud.github.io/usearch/golang\">GoLang</a> \u2022\n<a href=\"https://unum-cloud.github.io/usearch/wolfram\">Wolfram</a>\n<br/>\nLinux \u2022 MacOS \u2022 Windows \u2022 iOS \u2022 WebAssembly \u2022\n<a href=\"https://unum-cloud.github.io/usearch/sqlite\">SQLite3</a>\n</p>\n\n<div align=\"center\">\n<a href=\"https://pepy.tech/project/usearch\"> <img alt=\"PyPI\" src=\"https://static.pepy.tech/personalized-badge/usearch?period=total&units=abbreviation&left_color=black&right_color=blue&left_text=Python%20PyPi%20installs\"> </a>\n<a href=\"https://www.npmjs.com/package/usearch\"> <img alt=\"NPM\" src=\"https://img.shields.io/npm/dy/usearch?label=JavaScript%20NPM%20installs\"> </a>\n<a href=\"https://crates.io/crates/usearch\"> <img alt=\"Crate\" src=\"https://img.shields.io/crates/d/usearch?label=Rust%20Crate%20installs\"> </a>\n<a href=\"https://www.nuget.org/packages/Cloud.Unum.USearch\"> <img alt=\"NuGet\" src=\"https://img.shields.io/nuget/dt/Cloud.Unum.USearch?label=CSharp%20NuGet%20installs\"> </a>\n<a href=\"https://central.sonatype.com/artifact/cloud.unum/usearch/overview\"> <img alt=\"Maven\" src=\"https://img.shields.io/nexus/r/cloud.unum/usearch?server=https%3A%2F%2Fs01.oss.sonatype.org%2F&label=Java%20Maven%20version\"> </a>\n<img alt=\"GitHub code size in bytes\" src=\"https://img.shields.io/github/languages/code-size/unum-cloud/usearch?label=Repo%20size\">\n</div>\n\n---\n\n- \u2705 __[10x faster][faster-than-faiss]__ [HNSW][hnsw-algorithm] implementation than [FAISS][faiss].\n- \u2705 Simple and extensible [single C++11 header][usearch-header] __library__.\n- \u2705 [Trusted](#integrations) by giants like Google and databases like [ClickHouse][clickhouse-docs].\n- \u2705 [SIMD][simd]-optimized and [user-defined metrics](#user-defined-functions) with JIT compilation.\n- \u2705 Hardware-agnostic `f16` & `i8` - [half-precision & quarter-precision support](#memory-efficiency-downcasting-and-quantization).\n- \u2705 [View large indexes from disk](#serving-index-from-disk) without loading into RAM.\n- \u2705 Heterogeneous lookups, renaming/relabeling, and on-the-fly deletions.\n- \u2705 Binary Tanimoto and Sorensen coefficients for [Genomics and Chemistry applications](#usearch--rdkit--molecular-search).\n- \u2705 Space-efficient point-clouds with `uint40_t`, accommodating 4B+ size.\n- \u2705 Compatible with OpenMP and custom \"executors\" for fine-grained parallelism.\n- \u2705 [Semantic Search](#usearch--ai--multi-modal-semantic-search) and [Joins](#joins-one-to-one-one-to-many-and-many-to-many-mappings).\n- \ud83d\udd04 Near-real-time [clustering and sub-clustering](#clustering) for Tens or Millions of clusters.\n\n[faiss]: https://github.com/facebookresearch/faiss\n[usearch-header]: https://github.com/unum-cloud/usearch/blob/main/include/usearch/index.hpp\n[obscure-use-cases]: https://ashvardanian.com/posts/abusing-vector-search\n[hnsw-algorithm]: https://arxiv.org/abs/1603.09320\n[simd]: https://en.wikipedia.org/wiki/Single_instruction,_multiple_data\n[faster-than-faiss]: https://www.unum.cloud/blog/2023-11-07-scaling-vector-search-with-intel\n[clickhouse-docs]: https://clickhouse.com/docs/en/engines/table-engines/mergetree-family/annindexes#usearch\n\n__Technical Insights__ and related articles:\n\n- [Uses Horner's method for polynomial approximations, beating GCC 12 by 119x](https://ashvardanian.com/posts/gcc-12-vs-avx512fp16/).\n- [Uses Arm SVE and x86 AVX-512's masked loads to eliminate tail `for`-loops](https://ashvardanian.com/posts/simsimd-faster-scipy/#tails-of-the-past-the-significance-of-masked-loads).\n- [Uses AVX-512 FP16 for half-precision operations, that few compilers vectorize](https://ashvardanian.com/posts/simsimd-faster-scipy/#the-challenge-of-f16).\n- [Substitutes LibC's `sqrt` calls with bithacks using Jan Kadlec's constant](https://ashvardanian.com/posts/simsimd-faster-scipy/#bonus-section-bypassing-sqrt-and-libc-dependencies).\n- [For every language implements a custom separate binding](https://ashvardanian.com/posts/porting-cpp-library-to-ten-languages/).\n- [For Python avoids slow PyBind11, and even `PyArg_ParseTuple` for speed](https://ashvardanian.com/posts/pybind11-cpython-tutorial/).\n- [For JavaScript uses typed arrays and NAPI for zero-copy calls](https://ashvardanian.com/posts/javascript-ai-vector-search/).\n\n## Comparison with FAISS\n\nFAISS is a widely recognized standard for high-performance vector search engines.\nUSearch and FAISS both employ the same HNSW algorithm, but they differ significantly in their design principles.\nUSearch is compact and broadly compatible without sacrificing performance, primarily focusing on user-defined metrics and fewer dependencies.\n\n|                                              |                   FAISS |                  USearch |             Improvement |\n| :------------------------------------------- | ----------------------: | -----------------------: | ----------------------: |\n| Indexing time \u2070                              |                         |                          |                         |\n| 100 Million 96d `f32`, `f16`, `i8` vectors   |       2.6 \u00b7 2.6 \u00b7 2.6 h |        0.3 \u00b7 0.2 \u00b7 0.2 h | __9.6 \u00b7 10.4 \u00b7 10.7 x__ |\n| 100 Million 1536d `f32`, `f16`, `i8` vectors |       5.0 \u00b7 4.1 \u00b7 3.8 h |        2.1 \u00b7 1.1 \u00b7 0.8 h |   __2.3 \u00b7 3.6 \u00b7 4.4 x__ |\n|                                              |                         |                          |                         |\n| Codebase length \u00b9                            |       84 K [SLOC][sloc] |         3 K [SLOC][sloc] |            maintainable |\n| Supported metrics \u00b2                          |         9 fixed metrics |               any metric |              extendible |\n| Supported languages \u00b3                        |             C++, Python |             10 languages |                portable |\n| Supported ID types \u2074                         |          32-bit, 64-bit |   32-bit, 40-bit, 64-bit |               efficient |\n| Required dependencies \u2075                      |            BLAS, OpenMP |                        - |            light-weight |\n| Bindings \u2076                                   |                    SWIG |                   Native |             low-latency |\n| Python binding size \u2077                        | [~ 10 MB][faiss-weight] | [< 1 MB][usearch-weight] |              deployable |\n\n[sloc]: https://en.wikipedia.org/wiki/Source_lines_of_code\n[faiss-weight]: https://pypi.org/project/faiss-cpu/#files\n[usearch-weight]: https://pypi.org/project/usearch/#files\n\n> \u2070 [Tested][intel-benchmarks] on Intel Sapphire Rapids, with the simplest inner-product distance, equivalent recall, and memory consumption while also providing far superior search speed.\n> \u00b9 A shorter codebase of `usearch/` over `faiss/` makes the project easier to maintain and audit.\n> \u00b2 User-defined metrics allow you to customize your search for various applications, from GIS to creating custom metrics for composite embeddings from multiple AI models or hybrid full-text and semantic search.\n> \u00b3 With USearch, you can reuse the same preconstructed index in various programming languages.\n> \u2074 The 40-bit integer allows you to store 4B+ vectors without allocating 8 bytes for every neighbor reference in the proximity graph.\n> \u2075 Lack of obligatory dependencies makes USearch much more portable.\n> \u2076 Native bindings introduce lower call latencies than more straightforward approaches.\n> \u2077 Lighter bindings make downloads and deployments faster.\n\n[intel-benchmarks]: https://www.unum.cloud/blog/2023-11-07-scaling-vector-search-with-intel\n\nBase functionality is identical to FAISS, and the interface must be familiar if you have ever investigated Approximate Nearest Neighbors search:\n\n```py\n$ pip install numpy usearch\n\nimport numpy as np\nfrom usearch.index import Index\n\nindex = Index(ndim=3)\n\nvector = np.array([0.2, 0.6, 0.4])\nindex.add(42, vector)\n\nmatches = index.search(vector, 10)\n\nassert matches[0].key == 42\nassert matches[0].distance <= 0.001\nassert np.allclose(index[42], vector, atol=0.1) # Ensure high tolerance in mixed-precision comparisons\n```\n\nMore settings are always available, and the API is designed to be as flexible as possible.\n\n```py\nindex = Index(\n    ndim=3, # Define the number of dimensions in input vectors\n    metric='cos', # Choose 'l2sq', 'haversine' or other metric, default = 'ip'\n    dtype='f32', # Quantize to 'f16' or 'i8' if needed, default = 'f32'\n    connectivity=16, # Optional: Limit number of neighbors per graph node\n    expansion_add=128, # Optional: Control the recall of indexing\n    expansion_search=64, # Optional: Control the quality of the search\n    multi=False, # Optional: Allow multiple vectors per key, default = False\n)\n```\n\n## Serialization & Serving `Index` from Disk\n\nUSearch supports multiple forms of serialization:\n\n- Into a __file__ defined with a path.\n- Into a __stream__ defined with a callback, serializing or reconstructing incrementally.\n- Into a __buffer__ of fixed length or a memory-mapped file that supports random access.\n\nThe latter allows you to serve indexes from external memory, enabling you to optimize your server choices for indexing speed and serving costs.\nThis can result in __20x cost reduction__ on AWS and other public clouds.\n\n```py\nindex.save(\"index.usearch\")\n\nloaded_copy = index.load(\"index.usearch\")\nview = Index.restore(\"index.usearch\", view=True)\n\nother_view = Index(ndim=..., metric=...)\nother_view.view(\"index.usearch\")\n```\n\n## Exact vs. Approximate Search\n\nApproximate search methods, such as HNSW, are predominantly used when an exact brute-force search becomes too resource-intensive.\nThis typically occurs when you have millions of entries in a collection.\nFor smaller collections, we offer a more direct approach with the `search` method.\n\n```py\nfrom usearch.index import search, MetricKind, Matches, BatchMatches\nimport numpy as np\n\n# Generate 10'000 random vectors with 1024 dimensions\nvectors = np.random.rand(10_000, 1024).astype(np.float32)\nvector = np.random.rand(1024).astype(np.float32)\n\none_in_many: Matches = search(vectors, vector, 50, MetricKind.L2sq, exact=True)\nmany_in_many: BatchMatches = search(vectors, vectors, 50, MetricKind.L2sq, exact=True)\n```\n\nIf you pass the `exact=True` argument, the system bypasses indexing altogether and performs a brute-force search through the entire dataset using SIMD-optimized similarity metrics from [SimSIMD](https://github.com/ashvardanian/simsimd).\nWhen compared to FAISS's `IndexFlatL2` in Google Colab, __[USearch may offer up to a 20x performance improvement](https://github.com/unum-cloud/usearch/issues/176#issuecomment-1666650778)__:\n\n- `faiss.IndexFlatL2`: __55.3 ms__.\n- `usearch.index.search`: __2.54 ms__.\n\n## `Indexes` for Multi-Index Lookups\n\nFor larger workloads targeting billions or even trillions of vectors, parallel multi-index lookups become invaluable.\nInstead of constructing one extensive index, you can build multiple smaller ones and view them together.\n\n```py\nfrom usearch.index import Indexes\n\nmulti_index = Indexes(\n    indexes: Iterable[usearch.index.Index] = [...],\n    paths: Iterable[os.PathLike] = [...],\n    view: bool = False,\n    threads: int = 0,\n)\nmulti_index.search(...)\n```\n\n## Clustering\n\nOnce the index is constructed, USearch can perform K-Nearest Neighbors Clustering much faster than standalone clustering libraries, like SciPy, \nUMap, and tSNE.\nSame for dimensionality reduction with PCA. \nEssentially, the `Index` itself can be seen as a clustering, allowing iterative deepening.\n\n```py\nclustering = index.cluster(\n    min_count=10, # Optional\n    max_count=15, # Optional\n    threads=..., # Optional\n)\n\n# Get the clusters and their sizes\ncentroid_keys, sizes = clustering.centroids_popularity\n\n# Use Matplotlib to draw a histogram\nclustering.plot_centroids_popularity()\n\n# Export a NetworkX graph of the clusters\ng = clustering.network\n\n# Get members of a specific cluster\nfirst_members = clustering.members_of(centroid_keys[0])\n\n# Deepen into that cluster, splitting it into more parts, all the same arguments supported\nsub_clustering = clustering.subcluster(min_count=..., max_count=...)\n```\n\nThe resulting clustering isn't identical to K-Means or other conventional approaches but serves the same purpose.\nAlternatively, using Scikit-Learn on a 1 Million point dataset, one may expect queries to take anywhere from minutes to hours, depending on the number of clusters you want to highlight.\nFor 50'000 clusters, the performance difference between USearch and conventional clustering methods may easily reach 100x.\n\n## Joins, One-to-One, One-to-Many, and Many-to-Many Mappings\n\nOne of the big questions these days is how AI will change the world of databases and data management.\nMost databases are still struggling to implement high-quality fuzzy search, and the only kind of joins they know are deterministic.\nA `join` differs from searching for every entry, requiring a one-to-one mapping banning collisions among separate search results.\n\n| Exact Search | Fuzzy Search | Semantic Search ? |\n| :----------: | :----------: | :---------------: |\n|  Exact Join  | Fuzzy Join ? | Semantic Join ??  |\n\nUsing USearch, one can implement sub-quadratic complexity approximate, fuzzy, and semantic joins.\nThis can be useful in any fuzzy-matching tasks common to Database Management Software.\n\n```py\nmen = Index(...)\nwomen = Index(...)\npairs: dict = men.join(women, max_proposals=0, exact=False)\n```\n\n> Read more in the post: [Combinatorial Stable Marriages for Semantic Search \ud83d\udc8d](https://ashvardanian.com/posts/searching-stable-marriages)\n\n## User-Defined Functions\n\nWhile most vector search packages concentrate on just a few metrics - \"Inner Product distance\" and \"Euclidean distance,\" USearch extends this list to include any user-defined metrics.\nThis flexibility allows you to customize your search for various applications, from computing geospatial coordinates with the rare [Haversine][haversine] distance to creating custom metrics for composite embeddings from multiple AI models.\n\n![USearch: Vector Search Approaches](https://github.com/unum-cloud/usearch/blob/main/assets/usearch-approaches-white.png?raw=true)\n\nUnlike older approaches indexing high-dimensional spaces, like KD-Trees and Locality Sensitive Hashing, HNSW doesn't require vectors to be identical in length.\nThey only have to be comparable.\nSo you can apply it in [obscure][obscure] applications, like searching for similar sets or fuzzy text matching, using [GZip][gzip-similarity] as a distance function.\n\n> Read more about [JIT and UDF in USearch Python SDK](https://unum-cloud.github.io/usearch/python#user-defined-metrics-and-jit-in-python).\n\n[haversine]: https://ashvardanian.com/posts/abusing-vector-search#geo-spatial-indexing\n[obscure]: https://ashvardanian.com/posts/abusing-vector-search\n[gzip-similarity]: https://twitter.com/LukeGessler/status/1679211291292889100?s=20\n\n## Memory Efficiency, Downcasting, and Quantization\n\nTraining a quantization model and dimension-reduction is a common approach to accelerate vector search.\nThose, however, are only sometimes reliable, can significantly affect the statistical properties of your data, and require regular adjustments if your distribution shifts.\nInstead, we have focused on high-precision arithmetic over low-precision downcasted vectors.\nThe same index, and `add` and `search` operations will automatically down-cast or up-cast between `f64_t`, `f32_t`, `f16_t`, `i8_t`, and single-bit representations.\nYou can use the following command to check, if hardware acceleration is enabled:\n\n```sh\n$ python -c 'from usearch.index import Index; print(Index(ndim=768, metric=\"cos\", dtype=\"f16\").hardware_acceleration)'\n> avx512+f16\n$ python -c 'from usearch.index import Index; print(Index(ndim=166, metric=\"tanimoto\").hardware_acceleration)'\n> avx512+popcnt\n```\n\nUsing smaller numeric types will save you RAM needed to store the vectors, but you can also compress the neighbors lists forming our proximity graphs.\nBy default, 32-bit `uint32_t` is used to enumerate those, which is not enough if you need to address over 4 Billion entries.\nFor such cases we provide a custom `uint40_t` type, that will still be 37.5% more space-efficient than the commonly used 8-byte integers, and will scale up to 1 Trillion entries.\n\n![USearch uint40_t support](https://github.com/unum-cloud/usearch/blob/main/assets/usearch-neighbor-types.png?raw=true)\n\n## Functionality\n\nBy now, the core functionality is supported across all bindings.\nBroader functionality is ported per request.\nIn some cases, like Batch operations, feature parity is meaningless, as the host language has full multi-threading capabilities and the USearch index structure is concurrent by design, so the users can implement batching/scheduling/load-balancing in the most optimal way for their applications.\n\n|                         | C++ 11 | Python 3 | C 99  | Java  | JavaScript | Rust  | GoLang | Swift |\n| :---------------------- | :----: | :------: | :---: | :---: | :--------: | :---: | :----: | :---: |\n| Add, search, remove     |   \u2705    |    \u2705     |   \u2705   |   \u2705   |     \u2705      |   \u2705   |   \u2705    |   \u2705   |\n| Save, load, view        |   \u2705    |    \u2705     |   \u2705   |   \u2705   |     \u2705      |   \u2705   |   \u2705    |   \u2705   |\n| User-defined metrics    |   \u2705    |    \u2705     |   \u2705   |   \u274c   |     \u274c      |   \u274c   |   \u274c    |   \u274c   |\n| Batch operations        |   \u274c    |    \u2705     |   \u274c   |   \u274c   |     \u2705      |   \u274c   |   \u274c    |   \u274c   |\n| Joins                   |   \u2705    |    \u2705     |   \u274c   |   \u274c   |     \u274c      |   \u274c   |   \u274c    |   \u274c   |\n| Variable-length vectors |   \u2705    |    \u274c     |   \u274c   |   \u274c   |     \u274c      |   \u274c   |   \u274c    |   \u274c   |\n| 4B+ capacities          |   \u2705    |    \u274c     |   \u274c   |   \u274c   |     \u274c      |   \u274c   |   \u274c    |   \u274c   |\n\n## Application Examples\n\n### USearch + AI = Multi-Modal Semantic Search\n\n[![USearch Semantic Image Search](https://github.com/ashvardanian/usearch-images/raw/main/assets/usearch-images-slow.gif)](https://github.com/ashvardanian/usearch-images)\n\nAI has a growing number of applications, but one of the coolest classic ideas is to use it for Semantic Search.\nOne can take an encoder model, like the multi-modal [UForm](https://github.com/unum-cloud/uform), and a web-programming framework, like UCall, and build a text-to-image search platform in just 20 lines of Python.\n\n```python\nimport ucall\nimport uform\nimport usearch\n\nimport numpy as np\nimport PIL as pil\n\nserver = ucall.Server()\nmodel = uform.get_model('unum-cloud/uform-vl-multilingual')\nindex = usearch.index.Index(ndim=256)\n\n@server\ndef add(key: int, photo: pil.Image.Image):\n    image = model.preprocess_image(photo)\n    vector = model.encode_image(image).detach().numpy()\n    index.add(key, vector.flatten(), copy=True)\n\n@server\ndef search(query: str) -> np.ndarray:\n    tokens = model.preprocess_text(query)\n    vector = model.encode_text(tokens).detach().numpy()\n    matches = index.search(vector.flatten(), 3)\n    return matches.keys\n\nserver.run()\n```\n\nA more complete [demo with Streamlit is available on GitHub](https://github.com/ashvardanian/usearch-images).\nWe have pre-processed some commonly used datasets, cleaned the images, produced the vectors, and pre-built the index.\n\n| Dataset                             |            Modalities | Images |                              Download |\n| :---------------------------------- | --------------------: | -----: | ------------------------------------: |\n| [Unsplash][unsplash-25k-origin]     | Images & Descriptions |   25 K | [HuggingFace / Unum][unsplash-25k-hf] |\n| [Conceptual Captions][cc-3m-origin] | Images & Descriptions |    3 M |        [HuggingFace / Unum][cc-3m-hf] |\n| [Arxiv][arxiv-2m-origin]            |    Titles & Abstracts |    2 M |     [HuggingFace / Unum][arxiv-2m-hf] |\n\n[unsplash-25k-origin]: https://github.com/unsplash/datasets\n[cc-3m-origin]: https://huggingface.co/datasets/conceptual_captions\n[arxiv-2m-origin]: https://www.kaggle.com/datasets/Cornell-University/arxiv\n\n[unsplash-25k-hf]: https://huggingface.co/datasets/unum-cloud/ann-unsplash-25k\n[cc-3m-hf]: https://huggingface.co/datasets/unum-cloud/ann-cc-3m\n[arxiv-2m-hf]: https://huggingface.co/datasets/unum-cloud/ann-arxiv-2m\n\n### USearch + RDKit = Molecular Search\n\nComparing molecule graphs and searching for similar structures is expensive and slow.\nIt can be seen as a special case of the NP-Complete Subgraph Isomorphism problem.\nLuckily, domain-specific approximate methods exist.\nThe one commonly used in Chemistry is to generate structures from [SMILES][smiles] and later hash them into binary fingerprints.\nThe latter are searchable with binary similarity metrics, like the Tanimoto coefficient.\nBelow is an example using the RDKit package.\n\n```python\nfrom usearch.index import Index, MetricKind\nfrom rdkit import Chem\nfrom rdkit.Chem import AllChem\n\nimport numpy as np\n\nmolecules = [Chem.MolFromSmiles('CCOC'), Chem.MolFromSmiles('CCO')]\nencoder = AllChem.GetRDKitFPGenerator()\n\nfingerprints = np.vstack([encoder.GetFingerprint(x) for x in molecules])\nfingerprints = np.packbits(fingerprints, axis=1)\n\nindex = Index(ndim=2048, metric=MetricKind.Tanimoto)\nkeys = np.arange(len(molecules))\n\nindex.add(keys, fingerprints)\nmatches = index.search(fingerprints, 10)\n```\n\nThat method was used to build the [\"USearch Molecules\"](https://github.com/ashvardanian/usearch-molecules), one of the largest Chem-Informatics datasets, containing 7 billion small molecules and 28 billion fingerprints.\n\n[smiles]: https://en.wikipedia.org/wiki/Simplified_molecular-input_line-entry_system\n[rdkit-fingerprints]: https://www.rdkit.org/docs/RDKit_Book.html#additional-information-about-the-fingerprints\n\n### USearch + POI Coordinates = GIS Applications... on iOS?\n\n[![USearch Maps with SwiftUI](https://github.com/ashvardanian/SwiftVectorSearch/raw/main/USearch+SwiftUI.gif)](https://github.com/ashvardanian/SwiftVectorSearch)\n\nWith Objective-C and Swift iOS bindings, USearch can be easily used in mobile applications.\nThe [SwiftVectorSearch](https://github.com/ashvardanian/SwiftVectorSearch) project illustrates how to build a dynamic, real-time search system on iOS.\nIn this example, we use 2-dimensional vectors\u2014encoded as latitude and longitude\u2014to find the closest Points of Interest (POIs) on a map.\nThe search is based on the Haversine distance metric but can easily be extended to support high-dimensional vectors.\n\n## Integrations\n\n- [x] GPTCache: [Python](https://github.com/zilliztech/GPTCache/releases/tag/0.1.29).\n- [x] LangChain: [Python](https://github.com/langchain-ai/langchain/releases/tag/v0.0.257) and [JavaScript](https://github.com/hwchase17/langchainjs/releases/tag/0.0.125).\n- [x] ClickHouse: [C++](https://github.com/ClickHouse/ClickHouse/pull/53447).\n- [x] Microsoft Semantic Kernel: [Python](https://github.com/microsoft/semantic-kernel/releases/tag/python-0.3.9.dev) and C#.\n- [x] LanternDB: [C++](https://github.com/lanterndata/lantern) and [Rust](https://github.com/lanterndata/lantern_extras).\n\n## Citations\n\n```txt\n@software{Vardanian_USearch_2023,\ndoi = {10.5281/zenodo.7949416},\nauthor = {Vardanian, Ash},\ntitle = {{USearch by Unum Cloud}},\nurl = {https://github.com/unum-cloud/usearch},\nversion = {2.9.2},\nyear = {2023},\nmonth = oct,\n}\n```\n",
    "bugtrack_url": null,
    "license": "Apache-2.0",
    "summary": "Smaller & Faster Single-File Vector Search Engine from Unum",
    "version": "2.9.2",
    "project_urls": null,
    "split_keywords": [],
    "urls": [
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "56b59ebc5ac5d5aef79bae69ddca6e167de479ca2f80a60f05856c3b7074fa07",
                "md5": "04c4e9356ce6b77591271fc25152e238",
                "sha256": "eec5e2b570ef0c471d4628319f85c4a7ca6e439b95face0551130efa1d3ab9e3"
            },
            "downloads": -1,
            "filename": "usearch-2.9.2-cp310-cp310-macosx_10_9_universal2.whl",
            "has_sig": false,
            "md5_digest": "04c4e9356ce6b77591271fc25152e238",
            "packagetype": "bdist_wheel",
            "python_version": "cp310",
            "requires_python": null,
            "size": 837699,
            "upload_time": "2024-03-05T00:47:38",
            "upload_time_iso_8601": "2024-03-05T00:47:38.371476Z",
            "url": "https://files.pythonhosted.org/packages/56/b5/9ebc5ac5d5aef79bae69ddca6e167de479ca2f80a60f05856c3b7074fa07/usearch-2.9.2-cp310-cp310-macosx_10_9_universal2.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "222dbfb16ad24c976ec376c249421deac02d744e9aa6f01cddd57328b9400dd8",
                "md5": "d80fe7a42df06a770a562c3b06edee12",
                "sha256": "8fd982f9ec0ed6bf6628247234546f93b1ec73a59d0d86b23cfd4ef442f90595"
            },
            "downloads": -1,
            "filename": "usearch-2.9.2-cp310-cp310-macosx_10_9_x86_64.whl",
            "has_sig": false,
            "md5_digest": "d80fe7a42df06a770a562c3b06edee12",
            "packagetype": "bdist_wheel",
            "python_version": "cp310",
            "requires_python": null,
            "size": 441943,
            "upload_time": "2024-03-05T00:47:40",
            "upload_time_iso_8601": "2024-03-05T00:47:40.873588Z",
            "url": "https://files.pythonhosted.org/packages/22/2d/bfb16ad24c976ec376c249421deac02d744e9aa6f01cddd57328b9400dd8/usearch-2.9.2-cp310-cp310-macosx_10_9_x86_64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "9efaa0e04331b57ec501b680d43912fa65dcbfd123fecd577072a25a443134c5",
                "md5": "2716ec2143bd7008b7109dfbdbc7874d",
                "sha256": "e75fab72179330fc7aa7d9d29d7b24cda240cd153a1f78073c07854925d23ae1"
            },
            "downloads": -1,
            "filename": "usearch-2.9.2-cp310-cp310-macosx_11_0_arm64.whl",
            "has_sig": false,
            "md5_digest": "2716ec2143bd7008b7109dfbdbc7874d",
            "packagetype": "bdist_wheel",
            "python_version": "cp310",
            "requires_python": null,
            "size": 431976,
            "upload_time": "2024-03-05T00:47:42",
            "upload_time_iso_8601": "2024-03-05T00:47:42.595473Z",
            "url": "https://files.pythonhosted.org/packages/9e/fa/a0e04331b57ec501b680d43912fa65dcbfd123fecd577072a25a443134c5/usearch-2.9.2-cp310-cp310-macosx_11_0_arm64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "788ca2310e5cded89adb02fcc20939dcb3431cc1060f5cb96e747cd6f68a8b03",
                "md5": "bed36e0148748a4abf06c8aba0e0b3c7",
                "sha256": "3fc8423272fa5db79dd1372ca4ffe40cb94065e407cdd2f40764fa17dee56351"
            },
            "downloads": -1,
            "filename": "usearch-2.9.2-cp310-cp310-manylinux_2_28_aarch64.whl",
            "has_sig": false,
            "md5_digest": "bed36e0148748a4abf06c8aba0e0b3c7",
            "packagetype": "bdist_wheel",
            "python_version": "cp310",
            "requires_python": null,
            "size": 2138514,
            "upload_time": "2024-03-05T00:47:44",
            "upload_time_iso_8601": "2024-03-05T00:47:44.445256Z",
            "url": "https://files.pythonhosted.org/packages/78/8c/a2310e5cded89adb02fcc20939dcb3431cc1060f5cb96e747cd6f68a8b03/usearch-2.9.2-cp310-cp310-manylinux_2_28_aarch64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "9d821191aa9eda46d34e01343b7b1d5fb750f49bf631f4ff9477986cd78436ff",
                "md5": "b43ff7955eb55151d1274732d6117a9f",
                "sha256": "c5d8054f745a1e68fadcd36a31543c63bdfad2b7eb1e554b23c0ce287086c004"
            },
            "downloads": -1,
            "filename": "usearch-2.9.2-cp310-cp310-manylinux_2_28_x86_64.whl",
            "has_sig": false,
            "md5_digest": "b43ff7955eb55151d1274732d6117a9f",
            "packagetype": "bdist_wheel",
            "python_version": "cp310",
            "requires_python": null,
            "size": 2333863,
            "upload_time": "2024-03-05T00:47:45",
            "upload_time_iso_8601": "2024-03-05T00:47:45.866124Z",
            "url": "https://files.pythonhosted.org/packages/9d/82/1191aa9eda46d34e01343b7b1d5fb750f49bf631f4ff9477986cd78436ff/usearch-2.9.2-cp310-cp310-manylinux_2_28_x86_64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "3bf7ce52ed6b24d98d1cd4a0057913cdb14855e9a874b0c1272840915b2892bd",
                "md5": "74cf1861e27a8c72d022e98f6e1cd598",
                "sha256": "c1c984b2811c155e2e8c224f804e85502bbdd4206d5effa0ea385737d49deb73"
            },
            "downloads": -1,
            "filename": "usearch-2.9.2-cp310-cp310-win_amd64.whl",
            "has_sig": false,
            "md5_digest": "74cf1861e27a8c72d022e98f6e1cd598",
            "packagetype": "bdist_wheel",
            "python_version": "cp310",
            "requires_python": null,
            "size": 261798,
            "upload_time": "2024-03-05T00:47:47",
            "upload_time_iso_8601": "2024-03-05T00:47:47.885496Z",
            "url": "https://files.pythonhosted.org/packages/3b/f7/ce52ed6b24d98d1cd4a0057913cdb14855e9a874b0c1272840915b2892bd/usearch-2.9.2-cp310-cp310-win_amd64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "68726d717f47f79da9ef253c1e9040d1e4387566cfc777f8da670b6039c4e6e0",
                "md5": "b6253a2bb8c091ba0b9f9ec0144719de",
                "sha256": "78a4586dd626ea422025d7e27ed9d38dc1e532ea55f1f907758c09b172c15757"
            },
            "downloads": -1,
            "filename": "usearch-2.9.2-cp311-cp311-macosx_10_9_universal2.whl",
            "has_sig": false,
            "md5_digest": "b6253a2bb8c091ba0b9f9ec0144719de",
            "packagetype": "bdist_wheel",
            "python_version": "cp311",
            "requires_python": null,
            "size": 840073,
            "upload_time": "2024-03-05T00:47:49",
            "upload_time_iso_8601": "2024-03-05T00:47:49.277047Z",
            "url": "https://files.pythonhosted.org/packages/68/72/6d717f47f79da9ef253c1e9040d1e4387566cfc777f8da670b6039c4e6e0/usearch-2.9.2-cp311-cp311-macosx_10_9_universal2.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "4a8994bd4363e3885f838bd25fb7de1da70c2a57b74a9f909eb92df78ae7e22b",
                "md5": "3a2e27afc221c908ad25167245d137f6",
                "sha256": "65d15ef33273fe319b9d268d5cffe2861c47a1decc2a03fa1e3b885510978482"
            },
            "downloads": -1,
            "filename": "usearch-2.9.2-cp311-cp311-macosx_10_9_x86_64.whl",
            "has_sig": false,
            "md5_digest": "3a2e27afc221c908ad25167245d137f6",
            "packagetype": "bdist_wheel",
            "python_version": "cp311",
            "requires_python": null,
            "size": 443222,
            "upload_time": "2024-03-05T00:47:51",
            "upload_time_iso_8601": "2024-03-05T00:47:51.164142Z",
            "url": "https://files.pythonhosted.org/packages/4a/89/94bd4363e3885f838bd25fb7de1da70c2a57b74a9f909eb92df78ae7e22b/usearch-2.9.2-cp311-cp311-macosx_10_9_x86_64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "634a8965bd4ad8e4743de5cc8c7116521565145cc20cc64af43067b3ec14ed1b",
                "md5": "c19ee8b3371e431bf2e829767d5b847b",
                "sha256": "b221a129179e9924d6061e0d87c890e1393b2c34ed31f3da0e3aa8d6ba5b70df"
            },
            "downloads": -1,
            "filename": "usearch-2.9.2-cp311-cp311-macosx_11_0_arm64.whl",
            "has_sig": false,
            "md5_digest": "c19ee8b3371e431bf2e829767d5b847b",
            "packagetype": "bdist_wheel",
            "python_version": "cp311",
            "requires_python": null,
            "size": 433231,
            "upload_time": "2024-03-05T00:47:52",
            "upload_time_iso_8601": "2024-03-05T00:47:52.731857Z",
            "url": "https://files.pythonhosted.org/packages/63/4a/8965bd4ad8e4743de5cc8c7116521565145cc20cc64af43067b3ec14ed1b/usearch-2.9.2-cp311-cp311-macosx_11_0_arm64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "861d06c4e93c0b9f4d1ef5aaddee3b33bb17413f9d236d875708d2e41b485d6c",
                "md5": "4b44f4a59b1d867a0e4016103687987c",
                "sha256": "289275482b4cb9ea6a73aa6912694bb7aef691b8bb8ea30c039a40e3a6a4454c"
            },
            "downloads": -1,
            "filename": "usearch-2.9.2-cp311-cp311-manylinux_2_28_aarch64.whl",
            "has_sig": false,
            "md5_digest": "4b44f4a59b1d867a0e4016103687987c",
            "packagetype": "bdist_wheel",
            "python_version": "cp311",
            "requires_python": null,
            "size": 2145491,
            "upload_time": "2024-03-05T00:47:54",
            "upload_time_iso_8601": "2024-03-05T00:47:54.406840Z",
            "url": "https://files.pythonhosted.org/packages/86/1d/06c4e93c0b9f4d1ef5aaddee3b33bb17413f9d236d875708d2e41b485d6c/usearch-2.9.2-cp311-cp311-manylinux_2_28_aarch64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "1caca54a4b667b3e9fe5026ee0e3b3a95b8d4ccc0f5ade6be3955f2167b41dc7",
                "md5": "6345c125b8ea36ef41946d70a1b696ef",
                "sha256": "7462fe07e130b25055dd954323a5ae70835b170b08d5c1df77f7053ecf2e80fb"
            },
            "downloads": -1,
            "filename": "usearch-2.9.2-cp311-cp311-manylinux_2_28_x86_64.whl",
            "has_sig": false,
            "md5_digest": "6345c125b8ea36ef41946d70a1b696ef",
            "packagetype": "bdist_wheel",
            "python_version": "cp311",
            "requires_python": null,
            "size": 2341413,
            "upload_time": "2024-03-05T00:47:56",
            "upload_time_iso_8601": "2024-03-05T00:47:56.413618Z",
            "url": "https://files.pythonhosted.org/packages/1c/ac/a54a4b667b3e9fe5026ee0e3b3a95b8d4ccc0f5ade6be3955f2167b41dc7/usearch-2.9.2-cp311-cp311-manylinux_2_28_x86_64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "37965924ffd531521fa250da178adafc09e49231d36c9455decb8a27ac0611aa",
                "md5": "c63003dc2703e95930c6c14d15db4530",
                "sha256": "497dcf883f63d1d7d971b2f1c14da3a09ed3841a28816a1d6a78846eed435f0a"
            },
            "downloads": -1,
            "filename": "usearch-2.9.2-cp311-cp311-win_amd64.whl",
            "has_sig": false,
            "md5_digest": "c63003dc2703e95930c6c14d15db4530",
            "packagetype": "bdist_wheel",
            "python_version": "cp311",
            "requires_python": null,
            "size": 263213,
            "upload_time": "2024-03-05T00:47:58",
            "upload_time_iso_8601": "2024-03-05T00:47:58.008684Z",
            "url": "https://files.pythonhosted.org/packages/37/96/5924ffd531521fa250da178adafc09e49231d36c9455decb8a27ac0611aa/usearch-2.9.2-cp311-cp311-win_amd64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "e5354b53c2843e4d48ad64022451b16377433435052166af234eb83feff442d3",
                "md5": "1a37446b54097afea410399e22ea49a3",
                "sha256": "4af7406ffc1e4933783eb1b2adebbe0b8e38778c6ef6d4e66417f6740eda66ee"
            },
            "downloads": -1,
            "filename": "usearch-2.9.2-cp312-cp312-macosx_10_9_universal2.whl",
            "has_sig": false,
            "md5_digest": "1a37446b54097afea410399e22ea49a3",
            "packagetype": "bdist_wheel",
            "python_version": "cp312",
            "requires_python": null,
            "size": 841559,
            "upload_time": "2024-03-05T00:47:59",
            "upload_time_iso_8601": "2024-03-05T00:47:59.892095Z",
            "url": "https://files.pythonhosted.org/packages/e5/35/4b53c2843e4d48ad64022451b16377433435052166af234eb83feff442d3/usearch-2.9.2-cp312-cp312-macosx_10_9_universal2.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "fd2e5c47071f9088b1b2eb89799d2cd512978f5a1234ffbc494c365a5a6851a7",
                "md5": "ee9e32036c8b2191bebbe70035fa056e",
                "sha256": "83ee57b98e7f126f9effd92a9a03b389ba33cdaeec8e0648ab7d0029e238c596"
            },
            "downloads": -1,
            "filename": "usearch-2.9.2-cp312-cp312-macosx_10_9_x86_64.whl",
            "has_sig": false,
            "md5_digest": "ee9e32036c8b2191bebbe70035fa056e",
            "packagetype": "bdist_wheel",
            "python_version": "cp312",
            "requires_python": null,
            "size": 445158,
            "upload_time": "2024-03-05T00:48:02",
            "upload_time_iso_8601": "2024-03-05T00:48:02.260609Z",
            "url": "https://files.pythonhosted.org/packages/fd/2e/5c47071f9088b1b2eb89799d2cd512978f5a1234ffbc494c365a5a6851a7/usearch-2.9.2-cp312-cp312-macosx_10_9_x86_64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "6459f3e32404dbe9731dec1ce252b356478902646aaf9aaf2cb4e02ccb2900b0",
                "md5": "588580a705b5e4eaef28854c85690aa3",
                "sha256": "ef8a67a0ca2d419bd8c0a9b074f0c827d7be8b9ea82b732c4db16bb5f67cd762"
            },
            "downloads": -1,
            "filename": "usearch-2.9.2-cp312-cp312-macosx_11_0_arm64.whl",
            "has_sig": false,
            "md5_digest": "588580a705b5e4eaef28854c85690aa3",
            "packagetype": "bdist_wheel",
            "python_version": "cp312",
            "requires_python": null,
            "size": 432759,
            "upload_time": "2024-03-05T00:48:03",
            "upload_time_iso_8601": "2024-03-05T00:48:03.591389Z",
            "url": "https://files.pythonhosted.org/packages/64/59/f3e32404dbe9731dec1ce252b356478902646aaf9aaf2cb4e02ccb2900b0/usearch-2.9.2-cp312-cp312-macosx_11_0_arm64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "2104c69fdba0d0fd0413ac18d213d93e9446b71fdd76956954a62cc61e35c5b9",
                "md5": "e9f91543b93200ea57f23a2316ade858",
                "sha256": "99dae59ce7229feee019cb0ace60d2d92fc4e32403f11ba7fe6d9fd2caf077a0"
            },
            "downloads": -1,
            "filename": "usearch-2.9.2-cp312-cp312-manylinux_2_28_aarch64.whl",
            "has_sig": false,
            "md5_digest": "e9f91543b93200ea57f23a2316ade858",
            "packagetype": "bdist_wheel",
            "python_version": "cp312",
            "requires_python": null,
            "size": 2143686,
            "upload_time": "2024-03-05T00:48:05",
            "upload_time_iso_8601": "2024-03-05T00:48:05.561958Z",
            "url": "https://files.pythonhosted.org/packages/21/04/c69fdba0d0fd0413ac18d213d93e9446b71fdd76956954a62cc61e35c5b9/usearch-2.9.2-cp312-cp312-manylinux_2_28_aarch64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "519b799bb17068ec1a58b8f52c1af48519c2b14c87914512a673e735b3dd2898",
                "md5": "0f2417b2c7662884a2a617396fa30c76",
                "sha256": "2f5b772717bd35af31864152cc80142148b3960075fecce08121ae71103d107b"
            },
            "downloads": -1,
            "filename": "usearch-2.9.2-cp312-cp312-manylinux_2_28_x86_64.whl",
            "has_sig": false,
            "md5_digest": "0f2417b2c7662884a2a617396fa30c76",
            "packagetype": "bdist_wheel",
            "python_version": "cp312",
            "requires_python": null,
            "size": 2340312,
            "upload_time": "2024-03-05T00:48:07",
            "upload_time_iso_8601": "2024-03-05T00:48:07.142235Z",
            "url": "https://files.pythonhosted.org/packages/51/9b/799bb17068ec1a58b8f52c1af48519c2b14c87914512a673e735b3dd2898/usearch-2.9.2-cp312-cp312-manylinux_2_28_x86_64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "8eec251d424f378bdae1501a8b06e6aab0d0ba90b202494c4d86e75006680c3f",
                "md5": "55f9e2faa803631a3b99c2af12d2ceae",
                "sha256": "2bac2644ba89e1020125934d40ebae5cd51174bf63c07a1585b2c5d7f4122173"
            },
            "downloads": -1,
            "filename": "usearch-2.9.2-cp312-cp312-win_amd64.whl",
            "has_sig": false,
            "md5_digest": "55f9e2faa803631a3b99c2af12d2ceae",
            "packagetype": "bdist_wheel",
            "python_version": "cp312",
            "requires_python": null,
            "size": 263266,
            "upload_time": "2024-03-05T00:48:09",
            "upload_time_iso_8601": "2024-03-05T00:48:09.226948Z",
            "url": "https://files.pythonhosted.org/packages/8e/ec/251d424f378bdae1501a8b06e6aab0d0ba90b202494c4d86e75006680c3f/usearch-2.9.2-cp312-cp312-win_amd64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "1b12036428d241607d8e11d3f5500e302ea5d093ef43d4912994a68809b58687",
                "md5": "b4316de1d690d6919d86b21fca02b968",
                "sha256": "49c3c8ab546881ad3d8445f9818a6a806103a6163b653aa029e95d2ed6c992f4"
            },
            "downloads": -1,
            "filename": "usearch-2.9.2-cp37-cp37m-macosx_10_9_x86_64.whl",
            "has_sig": false,
            "md5_digest": "b4316de1d690d6919d86b21fca02b968",
            "packagetype": "bdist_wheel",
            "python_version": "cp37",
            "requires_python": null,
            "size": 437477,
            "upload_time": "2024-03-05T00:48:10",
            "upload_time_iso_8601": "2024-03-05T00:48:10.972512Z",
            "url": "https://files.pythonhosted.org/packages/1b/12/036428d241607d8e11d3f5500e302ea5d093ef43d4912994a68809b58687/usearch-2.9.2-cp37-cp37m-macosx_10_9_x86_64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "4e65040f50dfcdcbe572ff7dc0e10b85da370de644a92cbc72bfbdf09561185c",
                "md5": "c9b420c778fd1ef0f9bd218327d2c9e4",
                "sha256": "970821d80da00bb302f0861321971c803441212e43956865c283bb4bb89333ed"
            },
            "downloads": -1,
            "filename": "usearch-2.9.2-cp37-cp37m-manylinux_2_28_aarch64.whl",
            "has_sig": false,
            "md5_digest": "c9b420c778fd1ef0f9bd218327d2c9e4",
            "packagetype": "bdist_wheel",
            "python_version": "cp37",
            "requires_python": null,
            "size": 2152594,
            "upload_time": "2024-03-05T00:48:12",
            "upload_time_iso_8601": "2024-03-05T00:48:12.428937Z",
            "url": "https://files.pythonhosted.org/packages/4e/65/040f50dfcdcbe572ff7dc0e10b85da370de644a92cbc72bfbdf09561185c/usearch-2.9.2-cp37-cp37m-manylinux_2_28_aarch64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "b0abef307beee2d860603e34b0017e0a7592d044a2ccb2cfa4c094c2c32a4236",
                "md5": "b4f047b02d3dca7e47d0d4e17b6df016",
                "sha256": "0ba6008a07569fa8e3152c76ca74379c16c90048d57836934f49afe0f708a1d5"
            },
            "downloads": -1,
            "filename": "usearch-2.9.2-cp37-cp37m-manylinux_2_28_x86_64.whl",
            "has_sig": false,
            "md5_digest": "b4f047b02d3dca7e47d0d4e17b6df016",
            "packagetype": "bdist_wheel",
            "python_version": "cp37",
            "requires_python": null,
            "size": 2344448,
            "upload_time": "2024-03-05T00:48:13",
            "upload_time_iso_8601": "2024-03-05T00:48:13.944436Z",
            "url": "https://files.pythonhosted.org/packages/b0/ab/ef307beee2d860603e34b0017e0a7592d044a2ccb2cfa4c094c2c32a4236/usearch-2.9.2-cp37-cp37m-manylinux_2_28_x86_64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "d53391bbec5af51d269388237a2a9cf3760b19c198ed86626cfeb656cffc3834",
                "md5": "8e6764f705c46752fd8c8d6017f17e74",
                "sha256": "919d47efddce7995a871f9bb106f2d0a506e2c9193c3fba38fcc9694d5edaeb8"
            },
            "downloads": -1,
            "filename": "usearch-2.9.2-cp37-cp37m-win_amd64.whl",
            "has_sig": false,
            "md5_digest": "8e6764f705c46752fd8c8d6017f17e74",
            "packagetype": "bdist_wheel",
            "python_version": "cp37",
            "requires_python": null,
            "size": 262599,
            "upload_time": "2024-03-05T00:48:15",
            "upload_time_iso_8601": "2024-03-05T00:48:15.816997Z",
            "url": "https://files.pythonhosted.org/packages/d5/33/91bbec5af51d269388237a2a9cf3760b19c198ed86626cfeb656cffc3834/usearch-2.9.2-cp37-cp37m-win_amd64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "f3ae7a10796545309d5e4200e0b8197bf23f4c0d68c00aca00a7b7379aca892b",
                "md5": "23bb1617d0f61e12a187740499024d0d",
                "sha256": "c4bd48741eca691f9e8e3dc992c500e1e05b87faaac6bf32b7267209a57567ec"
            },
            "downloads": -1,
            "filename": "usearch-2.9.2-cp38-cp38-macosx_10_9_universal2.whl",
            "has_sig": false,
            "md5_digest": "23bb1617d0f61e12a187740499024d0d",
            "packagetype": "bdist_wheel",
            "python_version": "cp38",
            "requires_python": null,
            "size": 837656,
            "upload_time": "2024-03-05T00:48:17",
            "upload_time_iso_8601": "2024-03-05T00:48:17.828126Z",
            "url": "https://files.pythonhosted.org/packages/f3/ae/7a10796545309d5e4200e0b8197bf23f4c0d68c00aca00a7b7379aca892b/usearch-2.9.2-cp38-cp38-macosx_10_9_universal2.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "4206f354cd6ec2898bd19649ff6113aa89b089dd9d11e493c1092a16388ba9c1",
                "md5": "aabf8eeda718eb9a67ed201680b49574",
                "sha256": "5786d4c7ccb89001ec3c2c1d9575831b8fec7b5738957c86a1daf63798f59597"
            },
            "downloads": -1,
            "filename": "usearch-2.9.2-cp38-cp38-macosx_10_9_x86_64.whl",
            "has_sig": false,
            "md5_digest": "aabf8eeda718eb9a67ed201680b49574",
            "packagetype": "bdist_wheel",
            "python_version": "cp38",
            "requires_python": null,
            "size": 441912,
            "upload_time": "2024-03-05T00:48:19",
            "upload_time_iso_8601": "2024-03-05T00:48:19.318619Z",
            "url": "https://files.pythonhosted.org/packages/42/06/f354cd6ec2898bd19649ff6113aa89b089dd9d11e493c1092a16388ba9c1/usearch-2.9.2-cp38-cp38-macosx_10_9_x86_64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "ba685c4b3f4e3c3f0af3caaf384988dce90c94b8868cbcaf1f95499c39e2c375",
                "md5": "85a5b7d8b63e160a1959a459a1dd5d60",
                "sha256": "58f8d6f22ab82c228ca4bc1b0c6ed3c6bbabc2ef18f98ad69a899a4f4ac5ea04"
            },
            "downloads": -1,
            "filename": "usearch-2.9.2-cp38-cp38-macosx_11_0_arm64.whl",
            "has_sig": false,
            "md5_digest": "85a5b7d8b63e160a1959a459a1dd5d60",
            "packagetype": "bdist_wheel",
            "python_version": "cp38",
            "requires_python": null,
            "size": 431935,
            "upload_time": "2024-03-05T00:48:20",
            "upload_time_iso_8601": "2024-03-05T00:48:20.810300Z",
            "url": "https://files.pythonhosted.org/packages/ba/68/5c4b3f4e3c3f0af3caaf384988dce90c94b8868cbcaf1f95499c39e2c375/usearch-2.9.2-cp38-cp38-macosx_11_0_arm64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "eeb9d5d719765e80db3d04af25dc260fa9bb8e187fb2048c403d939ae23f3eb0",
                "md5": "f2b8be10e99ea0a91cb7107a736a73f4",
                "sha256": "0a287f4c9eb452b312ad2bcff54b1dcf12c6407c62e8f0d9befb37832cbf3f9c"
            },
            "downloads": -1,
            "filename": "usearch-2.9.2-cp38-cp38-manylinux_2_28_aarch64.whl",
            "has_sig": false,
            "md5_digest": "f2b8be10e99ea0a91cb7107a736a73f4",
            "packagetype": "bdist_wheel",
            "python_version": "cp38",
            "requires_python": null,
            "size": 2136291,
            "upload_time": "2024-03-05T00:48:22",
            "upload_time_iso_8601": "2024-03-05T00:48:22.895462Z",
            "url": "https://files.pythonhosted.org/packages/ee/b9/d5d719765e80db3d04af25dc260fa9bb8e187fb2048c403d939ae23f3eb0/usearch-2.9.2-cp38-cp38-manylinux_2_28_aarch64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "fbed655fa36a0685837dbb7a25e9fab2be3856024834c8f7bc33580ce471c250",
                "md5": "96372ffae4aca6e74ab80c5e9d511007",
                "sha256": "dd61c5dd6d2864d9a1d13c1661845a7ea42e835109f3e69003035839abc14d72"
            },
            "downloads": -1,
            "filename": "usearch-2.9.2-cp38-cp38-manylinux_2_28_x86_64.whl",
            "has_sig": false,
            "md5_digest": "96372ffae4aca6e74ab80c5e9d511007",
            "packagetype": "bdist_wheel",
            "python_version": "cp38",
            "requires_python": null,
            "size": 2331860,
            "upload_time": "2024-03-05T00:48:24",
            "upload_time_iso_8601": "2024-03-05T00:48:24.337562Z",
            "url": "https://files.pythonhosted.org/packages/fb/ed/655fa36a0685837dbb7a25e9fab2be3856024834c8f7bc33580ce471c250/usearch-2.9.2-cp38-cp38-manylinux_2_28_x86_64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "cd552f690fbbfc7e6639ef7ace481c647013862db86b77d1983b174bc39966fd",
                "md5": "a6d0b267385669d158711233945a0b89",
                "sha256": "9bc0d6793fc02b5b0dba8190612e2c436a539dc36db89574165649c60bc4d64a"
            },
            "downloads": -1,
            "filename": "usearch-2.9.2-cp38-cp38-win_amd64.whl",
            "has_sig": false,
            "md5_digest": "a6d0b267385669d158711233945a0b89",
            "packagetype": "bdist_wheel",
            "python_version": "cp38",
            "requires_python": null,
            "size": 261871,
            "upload_time": "2024-03-05T00:48:25",
            "upload_time_iso_8601": "2024-03-05T00:48:25.816250Z",
            "url": "https://files.pythonhosted.org/packages/cd/55/2f690fbbfc7e6639ef7ace481c647013862db86b77d1983b174bc39966fd/usearch-2.9.2-cp38-cp38-win_amd64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "26a79714e811b228762297b22bf8d32684c8ea25026453d4b4046791e0f1b171",
                "md5": "af5312af5f01cb1ab39cab3220faaa3a",
                "sha256": "2905688537354c8a795a46aa245bce22661c36fcb6c34021a676db46fa366c78"
            },
            "downloads": -1,
            "filename": "usearch-2.9.2-cp39-cp39-macosx_10_9_universal2.whl",
            "has_sig": false,
            "md5_digest": "af5312af5f01cb1ab39cab3220faaa3a",
            "packagetype": "bdist_wheel",
            "python_version": "cp39",
            "requires_python": null,
            "size": 838129,
            "upload_time": "2024-03-05T00:48:27",
            "upload_time_iso_8601": "2024-03-05T00:48:27.332771Z",
            "url": "https://files.pythonhosted.org/packages/26/a7/9714e811b228762297b22bf8d32684c8ea25026453d4b4046791e0f1b171/usearch-2.9.2-cp39-cp39-macosx_10_9_universal2.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "76fba5cb7292ae8bb038bdbaa40cdfeb302f3f860d5c2c07306425d32ca293bb",
                "md5": "18ae00c6e1aa0989cd3e81b42f31a227",
                "sha256": "a373c0267bb98a93d6d56f14820a1d8b5b054cf7a3b12d8d344c0804d00d2144"
            },
            "downloads": -1,
            "filename": "usearch-2.9.2-cp39-cp39-macosx_10_9_x86_64.whl",
            "has_sig": false,
            "md5_digest": "18ae00c6e1aa0989cd3e81b42f31a227",
            "packagetype": "bdist_wheel",
            "python_version": "cp39",
            "requires_python": null,
            "size": 441970,
            "upload_time": "2024-03-05T00:48:29",
            "upload_time_iso_8601": "2024-03-05T00:48:29.407460Z",
            "url": "https://files.pythonhosted.org/packages/76/fb/a5cb7292ae8bb038bdbaa40cdfeb302f3f860d5c2c07306425d32ca293bb/usearch-2.9.2-cp39-cp39-macosx_10_9_x86_64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "2c97b8873ee93dba2e26d078e010a8b43a6c45b4c1ac959df63b43959218fa71",
                "md5": "d7e5f67c2093357e5691965dce3a7a25",
                "sha256": "9459d8baca98c49d079e3f96c53f298100594ead7ad015a7a8480a77a51a4bfd"
            },
            "downloads": -1,
            "filename": "usearch-2.9.2-cp39-cp39-macosx_11_0_arm64.whl",
            "has_sig": false,
            "md5_digest": "d7e5f67c2093357e5691965dce3a7a25",
            "packagetype": "bdist_wheel",
            "python_version": "cp39",
            "requires_python": null,
            "size": 432238,
            "upload_time": "2024-03-05T00:48:30",
            "upload_time_iso_8601": "2024-03-05T00:48:30.863704Z",
            "url": "https://files.pythonhosted.org/packages/2c/97/b8873ee93dba2e26d078e010a8b43a6c45b4c1ac959df63b43959218fa71/usearch-2.9.2-cp39-cp39-macosx_11_0_arm64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "b11d07ca68c26708dc73712d4574eff7392c3b2b7863ccb3a327e650e4cdc78c",
                "md5": "68f86231e54bda540ba048853addd9d5",
                "sha256": "39dc8274ea713bef6a3161f85edd547c4836d4e6fb0ee7aa72964293523d94f8"
            },
            "downloads": -1,
            "filename": "usearch-2.9.2-cp39-cp39-manylinux_2_28_aarch64.whl",
            "has_sig": false,
            "md5_digest": "68f86231e54bda540ba048853addd9d5",
            "packagetype": "bdist_wheel",
            "python_version": "cp39",
            "requires_python": null,
            "size": 2137493,
            "upload_time": "2024-03-05T00:48:32",
            "upload_time_iso_8601": "2024-03-05T00:48:32.634076Z",
            "url": "https://files.pythonhosted.org/packages/b1/1d/07ca68c26708dc73712d4574eff7392c3b2b7863ccb3a327e650e4cdc78c/usearch-2.9.2-cp39-cp39-manylinux_2_28_aarch64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "73e49f8f3eaa531fc704c1816d593a26dec1fbe8f70a4fe69da92257fae25143",
                "md5": "291b1bbc7acaa0fbac0ca43197766ce0",
                "sha256": "0ca944e199d64f7bacca9fd2bae99a17a57934cdc7f53f13e9d0475793538b26"
            },
            "downloads": -1,
            "filename": "usearch-2.9.2-cp39-cp39-manylinux_2_28_x86_64.whl",
            "has_sig": false,
            "md5_digest": "291b1bbc7acaa0fbac0ca43197766ce0",
            "packagetype": "bdist_wheel",
            "python_version": "cp39",
            "requires_python": null,
            "size": 2334312,
            "upload_time": "2024-03-05T00:48:34",
            "upload_time_iso_8601": "2024-03-05T00:48:34.186471Z",
            "url": "https://files.pythonhosted.org/packages/73/e4/9f8f3eaa531fc704c1816d593a26dec1fbe8f70a4fe69da92257fae25143/usearch-2.9.2-cp39-cp39-manylinux_2_28_x86_64.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "d635835356907691f8adc22f60e729aeeaeaef9b81bf07a96079c9ed33a94b4b",
                "md5": "7c2fe1718b92360a72c47a3270b3f570",
                "sha256": "305dad01f489b87fdddd25d0619a4e8f01049c4cfa26b523dd203faafe9569b6"
            },
            "downloads": -1,
            "filename": "usearch-2.9.2-cp39-cp39-win_amd64.whl",
            "has_sig": false,
            "md5_digest": "7c2fe1718b92360a72c47a3270b3f570",
            "packagetype": "bdist_wheel",
            "python_version": "cp39",
            "requires_python": null,
            "size": 257883,
            "upload_time": "2024-03-05T00:48:35",
            "upload_time_iso_8601": "2024-03-05T00:48:35.873305Z",
            "url": "https://files.pythonhosted.org/packages/d6/35/835356907691f8adc22f60e729aeeaeaef9b81bf07a96079c9ed33a94b4b/usearch-2.9.2-cp39-cp39-win_amd64.whl",
            "yanked": false,
            "yanked_reason": null
        }
    ],
    "upload_time": "2024-03-05 00:47:38",
    "github": false,
    "gitlab": false,
    "bitbucket": false,
    "codeberg": false,
    "lcname": "usearch"
}
        
Elapsed time: 0.21315s