@@ -60,13 +60,51 @@ defmodule Pgvector.SparseVector do
60
60
def from_binary ( binary ) when is_binary ( binary ) do
61
61
% Pgvector.SparseVector { data: binary }
62
62
end
63
+
64
+ @ doc """
65
+ Returns the dimensions
66
+ """
67
+ def dimensions ( vector ) when is_struct ( vector , Pgvector.SparseVector ) do
68
+ << dim :: signed - 32 , _ :: binary >> = vector . data
69
+ dim
70
+ end
71
+
72
+ @ doc """
73
+ Returns the indices
74
+ """
75
+ def indices ( vector ) when is_struct ( vector , Pgvector.SparseVector ) do
76
+ << _ :: signed - 32 , nnz :: signed - 32 , 0 :: signed - 32 , indices :: binary - size ( nnz ) - unit ( 32 ) ,
77
+ _ :: binary - size ( nnz ) - unit ( 32 ) >> = vector . data
78
+
79
+ for << v :: signed - 32 <- indices >> , do: v
80
+ end
81
+
82
+ @ doc """
83
+ Returns the values
84
+ """
85
+ def values ( vector ) when is_struct ( vector , Pgvector.SparseVector ) do
86
+ << _ :: signed - 32 , nnz :: signed - 32 , 0 :: signed - 32 , _ :: binary - size ( nnz ) - unit ( 32 ) ,
87
+ values :: binary - size ( nnz ) - unit ( 32 ) >> = vector . data
88
+
89
+ for << v :: float - 32 <- values >> , do: v
90
+ end
63
91
end
64
92
65
93
defimpl Inspect , for: Pgvector.SparseVector do
66
94
import Inspect.Algebra
67
95
68
96
def inspect ( vector , opts ) do
69
- # TODO improve
70
- concat ( [ "Pgvector.SparseVector.new(" , Inspect.List . inspect ( Pgvector . to_list ( vector ) , opts ) , ")" ] )
97
+ dimensions = vector |> Pgvector.SparseVector . dimensions ( )
98
+ indices = vector |> Pgvector.SparseVector . indices ( )
99
+ values = vector |> Pgvector.SparseVector . values ( )
100
+ elements = Enum . zip ( indices , values ) |> Enum . into ( % { } )
101
+
102
+ concat ( [
103
+ "Pgvector.SparseVector.new(" ,
104
+ Inspect.Map . inspect ( elements , opts ) ,
105
+ ", " ,
106
+ Inspect.Integer . inspect ( dimensions , opts ) ,
107
+ ")"
108
+ ] )
71
109
end
72
110
end
0 commit comments