Skip to content

Commit a619f7d

Browse files
committed
Added support for creating a SparseVector from a map
1 parent e22334d commit a619f7d

File tree

2 files changed

+18
-0
lines changed

2 files changed

+18
-0
lines changed

lib/pgvector/sparse_vector.ex

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,19 @@ defmodule Pgvector.SparseVector do
3434
end
3535
end
3636

37+
@doc """
38+
Creates a new sparse vector from a map
39+
"""
40+
def new(map, dimensions) when is_map(map) do
41+
{indices, values} =
42+
map
43+
|> Enum.sort_by(fn {k, _} -> k end)
44+
|> Enum.filter(fn {_, v} -> v != 0 end)
45+
|> Enum.unzip()
46+
47+
new(dimensions, indices, values)
48+
end
49+
3750
defp new(dim, indices, values) do
3851
nnz = indices |> length()
3952
indices = for v <- indices, into: "", do: <<v::signed-32>>

test/sparse_vector_test.exs

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,11 @@ defmodule SparseVectorTest do
1616
assert tensor == tensor |> Pgvector.SparseVector.new() |> Pgvector.to_tensor()
1717
end
1818

19+
test "map" do
20+
map = %{0 => 1.0, 2 => 2.0, 4 => 3.0}
21+
assert [1.0, 0.0, 2.0, 0.0, 3.0, 0.0] == map |> Pgvector.SparseVector.new(6) |> Pgvector.to_list()
22+
end
23+
1924
test "inspect" do
2025
vector = Pgvector.SparseVector.new([1, 2, 3])
2126
assert "Pgvector.SparseVector.new([1.0, 2.0, 3.0])" == inspect(vector)

0 commit comments

Comments
 (0)