# hnswlib **Repository Path**: mirrors_elixir-nx/hnswlib ## Basic Information - **Project Name**: hnswlib - **Description**: No description available - **Primary Language**: Unknown - **License**: Apache-2.0 - **Default Branch**: main - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2024-01-17 - **Last Updated**: 2024-01-24 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # HNSWLib Elixir binding for the [hnswlib](https://github.com/nmslib/hnswlib) library. Currently in development, alpha software. ## Usage ### Create an Index ```elixir # working in L2-space # other possible values are # `:ip` (inner product) # `:cosine` (cosine similarity) iex> space = :l2 :l2 # each vector is a 2D-vec iex> dim = 2 2 # limit the maximum elements to 200 iex> max_elements = 200 200 # create Index iex> {:ok, index} = HNSWLib.Index.new(space, dim, max_elements) {:ok, %HNSWLib.Index{ space: :l2, dim: 2, reference: #Reference<0.2548668725.3381002243.154990> }} ``` ### Add vectors to the Index ```elixir iex> data = Nx.tensor( [ [42, 42], [43, 43], [0, 0], [200, 200], [200, 220] ], type: :f32 ) #Nx.Tensor< f32[5][2] [ [42.0, 42.0], [43.0, 43.0], [0.0, 0.0], [200.0, 200.0], [200.0, 220.0] ] > iex> HNSWLib.Index.get_current_count(index) {:ok, 0} iex> HNSWLib.Index.add_items(index, data) :ok iex> HNSWLib.Index.get_current_count(index) {:ok, 5} ``` ### Query nearest vector(s) in the index ```elixir # query iex> query = Nx.tensor([1, 2], type: :f32) #Nx.Tensor< f32[2] [1.0, 2.0] > iex> {:ok, labels, dists} = HNSWLib.Index.knn_query(index, query) {:ok, #Nx.Tensor< u64[1][1] [ [2] ] >, #Nx.Tensor< f32[1][1] [ [5.0] ] >} iex> {:ok, labels, dists} = HNSWLib.Index.knn_query(index, query, k: 3) {:ok, #Nx.Tensor< u64[1][3] [ [2, 0, 1] ] >, #Nx.Tensor< f32[1][3] [ [5.0, 3281.0, 3445.0] ] >} ``` ### Save an Index to file ```elixir iex> HNSWLib.Index.save_index(index, "my_index.bin") :ok ``` ### Load an Index from file ```elixir iex> {:ok, saved_index} = HNSWLib.Index.load_index(space, dim, "my_index.bin") {:ok, %HNSWLib.Index{ space: :l2, dim: 2, reference: #Reference<0.2105700569.2629697564.236704> }} iex> HNSWLib.Index.get_current_count(saved_index) {:ok, 5} iex> {:ok, data} = HNSWLib.Index.get_items(saved_index, [2, 0, 1]) {:ok, [ <<0, 0, 0, 0, 0, 0, 0, 0>>, <<0, 0, 40, 66, 0, 0, 40, 66>>, <<0, 0, 44, 66, 0, 0, 44, 66>> ]} iex> tensors = Nx.stack(Enum.map(data, fn d -> Nx.from_binary(d, :f32) end)) #Nx.Tensor< f32[3][2] [ [0.0, 0.0], [42.0, 42.0], [43.0, 43.0] ] > ``` ## Installation If [available in Hex](https://hex.pm/docs/publish), the package can be installed by adding `hnswlib` to your list of dependencies in `mix.exs`: ```elixir def deps do [ {:hnswlib, "~> 0.1.0"} ] end ``` Documentation can be generated with [ExDoc](https://github.com/elixir-lang/ex_doc) and published on [HexDocs](https://hexdocs.pm). Once published, the docs can be found at .