Skip to content

Commit 02c8ea2

Browse files
committed
Fix HalfVector equality for signed zero
1 parent 1cbee1a commit 02c8ea2

2 files changed

Lines changed: 22 additions & 1 deletion

File tree

‎pgvector/halfvec.py‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,7 @@ def __repr__(self) -> str:
3737
def __eq__(self, other: object, /) -> bool:
3838
if not isinstance(other, self.__class__):
3939
return NotImplemented
40-
return self._value == other._value
40+
return self.to_list() == other.to_list()
4141

4242
def dimensions(self) -> int:
4343
return len(self._value)

‎tests/test_half_vector.py‎

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -56,6 +56,27 @@ def test_equality(self) -> None:
5656
assert HalfVector([1, 2, 3]) != HalfVector([1, 2, 4])
5757
assert HalfVector([1, 2, 3]) != 1
5858

59+
@pytest.mark.parametrize('positive, negative', [
60+
([0.0], [-0.0]),
61+
([0.0, 1.5, -2.0], [-0.0, 1.5, -2.0]),
62+
([1e-8, 1.5], [-1e-8, 1.5]),
63+
])
64+
def test_equality_signed_zero(self, positive: list[float], negative: list[float]) -> None:
65+
left = HalfVector(positive)
66+
right = HalfVector(negative)
67+
assert left == right
68+
assert right == left
69+
# Numeric equality must not normalize the stored sign bit.
70+
assert left.to_binary() != right.to_binary()
71+
72+
def test_equality_signed_zero_from_binary(self) -> None:
73+
left = HalfVector.from_binary(pack('>HH2e', 2, 0, 0.0, 1.5))
74+
right = HalfVector.from_binary(pack('>HH2e', 2, 0, -0.0, 1.5))
75+
assert left == right
76+
77+
def test_equality_signed_zero_from_text(self) -> None:
78+
assert HalfVector.from_text('[0.0,1.5]') == HalfVector.from_text('[-0.0,1.5]')
79+
5980
def test_dimensions(self) -> None:
6081
assert HalfVector([1, 2, 3]).dimensions() == 3
6182

0 commit comments

Comments
 (0)