decode done(?)
This commit is contained in:
+60
-3
@@ -196,8 +196,43 @@ def decode_delta(delta_values: List[int]) -> List[int]:
|
|||||||
|
|
||||||
def downsample_set(hash_values: List[int], bpp: int) -> List[int]:
|
def downsample_set(hash_values: List[int], bpp: int) -> List[int]:
|
||||||
"""Reduce a set of (bpp + 1) values to a set of bpp values, keeping it sorted."""
|
"""Reduce a set of (bpp + 1) values to a set of bpp values, keeping it sorted."""
|
||||||
# WIP
|
# find the first element with high bit set
|
||||||
pass
|
mask = (1 << bpp) - 1
|
||||||
|
l = 0
|
||||||
|
u = len(hash_values)
|
||||||
|
while l < u:
|
||||||
|
i = (l + u) // 2
|
||||||
|
if hash_values[i] <= mask:
|
||||||
|
l = i + 1
|
||||||
|
else:
|
||||||
|
u = i
|
||||||
|
|
||||||
|
# merge v1 and v2 into merged, keeping it sorted
|
||||||
|
merged = []
|
||||||
|
i = 0
|
||||||
|
j = l
|
||||||
|
while i < l and j < len(hash_values):
|
||||||
|
high_value = hash_values[j] & mask
|
||||||
|
if hash_values[i] < high_value:
|
||||||
|
merged.append(hash_values[i])
|
||||||
|
i += 1
|
||||||
|
elif high_value < hash_values[i]:
|
||||||
|
merged.append(high_value)
|
||||||
|
j += 1
|
||||||
|
else:
|
||||||
|
merged.append(hash_values[i])
|
||||||
|
i += 1
|
||||||
|
j += 1
|
||||||
|
|
||||||
|
while i < l:
|
||||||
|
merged.append(hash_values[i])
|
||||||
|
i += 1
|
||||||
|
|
||||||
|
while j < len(hash_values):
|
||||||
|
merged.append(hash_values[j] & mask)
|
||||||
|
j += 1
|
||||||
|
|
||||||
|
return merged
|
||||||
|
|
||||||
|
|
||||||
def decode_set_init(encoded_str: str) -> Tuple[int, int]:
|
def decode_set_init(encoded_str: str) -> Tuple[int, int]:
|
||||||
@@ -246,7 +281,29 @@ def rpmsetcmp(str1: str, str2: str) -> int:
|
|||||||
|
|
||||||
# WIP
|
# WIP
|
||||||
|
|
||||||
return 0
|
ge = True
|
||||||
|
le = True
|
||||||
|
|
||||||
|
i = 0
|
||||||
|
j = 0
|
||||||
|
|
||||||
|
while i < len(hash_values1) and j < len(hash_values2):
|
||||||
|
if hash_values1[i] < hash_values2[j]:
|
||||||
|
ge = False
|
||||||
|
i += 1
|
||||||
|
elif hash_values1[i] > hash_values2[j]:
|
||||||
|
le = False
|
||||||
|
j += 1
|
||||||
|
else:
|
||||||
|
i += 1
|
||||||
|
j += 1
|
||||||
|
|
||||||
|
if ge and le:
|
||||||
|
return 0
|
||||||
|
elif ge:
|
||||||
|
return 1
|
||||||
|
else:
|
||||||
|
return -1
|
||||||
|
|
||||||
|
|
||||||
def set_new() -> Set:
|
def set_new() -> Set:
|
||||||
|
|||||||
@@ -0,0 +1,21 @@
|
|||||||
|
import unittest
|
||||||
|
|
||||||
|
from reimplement.set import downsample_set
|
||||||
|
|
||||||
|
|
||||||
|
class DownsampleSetTest(unittest.TestCase):
|
||||||
|
def test_masks_high_half_and_keeps_sorted_unique_values(self):
|
||||||
|
self.assertEqual(downsample_set([1, 3, 6, 8, 10, 14], 3), [0, 1, 2, 3, 6])
|
||||||
|
|
||||||
|
def test_removes_duplicates_created_by_masking(self):
|
||||||
|
self.assertEqual(downsample_set([1, 6, 14], 3), [1, 6])
|
||||||
|
|
||||||
|
def test_keeps_low_only_set_unchanged(self):
|
||||||
|
self.assertEqual(downsample_set([1, 3, 6], 3), [1, 3, 6])
|
||||||
|
|
||||||
|
def test_masks_high_only_set(self):
|
||||||
|
self.assertEqual(downsample_set([8, 10, 14], 3), [0, 2, 6])
|
||||||
|
|
||||||
|
|
||||||
|
if __name__ == "__main__":
|
||||||
|
unittest.main()
|
||||||
Reference in New Issue
Block a user