|
7 | 7 | from numpy import nan
|
8 | 8 | from datetime import datetime
|
9 | 9 | from itertools import permutations
|
| 10 | +import struct |
10 | 11 | from pandas import (Series, Categorical, CategoricalIndex,
|
11 | 12 | Timestamp, DatetimeIndex, Index, IntervalIndex)
|
12 | 13 | import pandas as pd
|
@@ -1087,6 +1088,39 @@ def test_lookup_nan(self, writable):
|
1087 | 1088 | tm.assert_numpy_array_equal(m.lookup(xs), np.arange(len(xs),
|
1088 | 1089 | dtype=np.int64))
|
1089 | 1090 |
|
| 1091 | + def test_add_signed_zeros(self): |
| 1092 | + # default hash-function would lead to different hash-buckets |
| 1093 | + # for 0.0 and -0.0 if there are more than 2^30 hash-buckets |
| 1094 | + # the memory is not touched, so the system doesn't commit 16GB |
| 1095 | + m = ht.Float64HashTable(12 * 10**8) |
| 1096 | + # hashtable is prepared, now 0.0 and -0.0 might be |
| 1097 | + # in different buckets: |
| 1098 | + m.set_item(0.0, 0) |
| 1099 | + m.set_item(-0.0, 0) |
| 1100 | + assert len(m) == 1 # 0.0 and -0.0 are equivalent |
| 1101 | + |
| 1102 | + def test_add_signed_nans(self): |
| 1103 | + # default hash function would lead to different hash-buckets |
| 1104 | + # for NAN and -NAN if there are more than 2^30 hash-buckets |
| 1105 | + # the memory is not touched, so the system doesn't commit 16GB |
| 1106 | + m = ht.Float64HashTable(12 * 10**8) |
| 1107 | + # hashtable is prepared, now np.nan and -np.nan might be |
| 1108 | + # in different buckets: |
| 1109 | + m.set_item(np.nan, 0) |
| 1110 | + m.set_item(-np.nan, 0) |
| 1111 | + assert len(m) == 1 # nan and -nan are equivalent |
| 1112 | + |
| 1113 | + def test_add_different_nans(self): |
| 1114 | + # create different nans from bit-patterns: |
| 1115 | + NAN1 = struct.unpack("d", struct.pack("L", 0x7ff8000000000000))[0] |
| 1116 | + NAN2 = struct.unpack("d", struct.pack("L", 0x7ff8000000000001))[0] |
| 1117 | + # default hash function would lead to different hash-buckets |
| 1118 | + # for NAN1 and NAN2 even if there are only 4 buckets: |
| 1119 | + m = ht.Float64HashTable() |
| 1120 | + m.set_item(NAN1, 0) |
| 1121 | + m.set_item(NAN2, 0) |
| 1122 | + assert len(m) == 1 # NAN1 and NAN2 are equivalent |
| 1123 | + |
1090 | 1124 | def test_lookup_overflow(self, writable):
|
1091 | 1125 | xs = np.array([1, 2, 2**63], dtype=np.uint64)
|
1092 | 1126 | # GH 21688 ensure we can deal with readonly memory views
|
|
0 commit comments