Exemplo n.º 1
0
    def test_remove(self):
        skip = SkipList([1, 2, 3])
        with self.assertRaises(KeyError):
            skip.remove(100)

        x = 1
        skip.remove(x)
        self.assertNotIn(x, skip)

        items = list(range(100))
        random.shuffle(items)
        skip = SkipList()
        std = set()

        for i, x in enumerate(items):
            skip.add(x)
            std.add(x)

        self.assertEqual(sorted(list(skip)), sorted(list(std)))

        for i, x in enumerate(items):
            skip.remove(x)
            std.remove(x)
            self.assertNotIn(x, skip)
            self.assertEqual(sorted(list(skip)), sorted(list(std)))
Exemplo n.º 2
0
    def test_relevel_2(self):
        sl = SkipList(3)
        sl.insert(1)
        sl.insert(2)
        sl.insert(3)
        sl.insert(4)
        sl.insert(5)
        sl.insert(6)
        sl.insert(7)
        sl.insert(8)
        sl.insert(9)

        sl.relevel()

        self.assertEqual(sl.get_at(0).level, 3)
        self.assertEqual(sl.get_at(0).skiplist[0].data, 2)
        self.assertEqual(sl.get_at(0).skiplist[1].data, 3)
        self.assertEqual(sl.get_at(0).skiplist[2].data, 5)
        self.assertEqual(sl.get_at(0).skiplist[3].data, 9)
        self.assertEqual(sl.get_at(0).skipindex[0], 1)
        self.assertEqual(sl.get_at(0).skipindex[1], 2)
        self.assertEqual(sl.get_at(0).skipindex[2], 4)
        self.assertEqual(sl.get_at(0).skipindex[3], 8)

        self.assertEqual(sl.get_at(2).level, 1)
        self.assertEqual(sl.get_at(2).skiplist[1].data, 5)

        self.assertEqual(sl.get_at(4).level, 2)
        self.assertEqual(sl.get_at(4).skiplist[1].data, 7)
        self.assertEqual(sl.get_at(4).skiplist[2].data, 9)
        self.assertEqual(sl.get_at(4).skipindex[0], 1)
        self.assertEqual(sl.get_at(4).skipindex[1], 2)
        self.assertEqual(sl.get_at(4).skipindex[2], 4)
Exemplo n.º 3
0
 def test_insert_r_second_2(self):
     sl = SkipList()
     sl.insert(1, 0)
     sl.insert(2, 0)
     self.assertEqual(sl.head.data, 1)
     self.assertEqual(sl.head.skiplist[0].data, 2)
     self.assertEqual(sl.get_at(0).skiplist.count(None), sl.max_height)
     self.assertEqual(sl.get_at(1).skiplist.count(None), 1)
Exemplo n.º 4
0
    def test_find_r_2(self):
        sl = SkipList()
        sl.insert(3, 0)
        sl.insert(1, 0)

        self.assertEqual(sl.find_r(1), 1)
        self.assertEqual(sl.find_r(3), 3)
        self.assertEqual(sl.find_r(2), None)
Exemplo n.º 5
0
 def test_insert_r_third_2(self):
     sl = SkipList()
     sl.insert(1)
     sl.insert(2)
     sl.insert(3)
     self.assertEqual(sl.head.data, 1)
     self.assertEqual(sl.head.skiplist[0].data, 2)
     self.assertEqual(sl.head.skiplist[0].skiplist[0].data, 3)
Exemplo n.º 6
0
 def test_insert_r_third_3(self):
     sl = SkipList()
     sl.insert(1)
     sl.insert(2, 1)
     sl.insert(3, 0)
     self.assertEqual(sl.get_at(0).skiplist.count(None), sl.max_height - 1)
     self.assertEqual(sl.get_at(1).skiplist.count(None), 1)
     self.assertEqual(sl.get_at(2).skiplist.count(None), 1)
Exemplo n.º 7
0
def test_insertion():
    skl = SkipList()
    skl.insert('A', 100)
    skl.insert('B', 200)
    assert skl.header.forward[0].key == 'A'
    assert skl.header.forward[0].val == 100
    assert skl.header.forward[0].forward[0].key == 'B'
    assert skl.header.forward[0].forward[0].val == 200
Exemplo n.º 8
0
 def test_stress(self):
     limit = 3000
     sl = SkipList()
     items = list(range(limit))
     shuffle(items)
     for i in range(limit):
         sl.insert(items[i])
         sl.remove(i / 2)
Exemplo n.º 9
0
 def test_skip_2(self):
     sl = SkipList()
     sl.insert(1, 1)
     sl.insert(2, 0)
     sl.insert(3, 1)
     self.assertEqual(sl.head.data, 1)
     self.assertEqual(sl.head.skiplist[0].data, 2)
     self.assertEqual(sl.head.skiplist[1].data, 3)
Exemplo n.º 10
0
 def test_insert_r_index_2(self):
     sl = SkipList()
     sl.insert(1, sl.max_height)
     sl.insert(2, 0)
     sl.insert(3, 1)
     self.assertEqual(sl.get_at(0).skipindex[0], 1)
     self.assertEqual(sl.get_at(0).skipindex[1], 2)
     self.assertEqual(sl.get_at(1).skipindex[0], 1)
     self.assertEqual(sl.get_at(2).skipindex[0], 1)
Exemplo n.º 11
0
    def test_find_4(self):
        sl = SkipList()
        sl.insert(3, 1)
        sl.insert(2, 0)
        sl.insert(1, 1)

        self.assertEqual(sl.find(1), 1)
        self.assertEqual(sl.find(2), 2)
        self.assertEqual(sl.find(3), 3)
        self.assertEqual(sl.find(1.5), None)
Exemplo n.º 12
0
    def test_remove_r_last(self):
        sl = SkipList()
        sl.insert(2)
        sl.insert(1)

        sl.remove(2)

        self.assertEqual(sl.head.data, 1)
        for i in range(sl.max_height + 1):
            self.assertIsNone(sl.head.skiplist[i])
Exemplo n.º 13
0
 def test_skip_1(self):
     sl = SkipList()
     sl.insert(3, 3)
     sl.insert(2, 1)
     sl.insert(1, 3)
     self.assertEqual(sl.head.level, 3)
     self.assertEqual(sl.find(2), 2)
     self.assertEqual(sl.get_at(1).level, 3)
     self.assertEqual(sl.head.skiplist[0].data, 2)
     self.assertEqual(sl.head.skiplist[1].data, 2)
Exemplo n.º 14
0
    def test_get_at_3(self):
        sl = SkipList()
        sl.insert(1, 2)
        sl.insert(2, 0)
        sl.insert(3, 1)

        self.assertEqual(sl.get_at(0).data, 1)
        self.assertEqual(sl.get_at(1).data, 2)
        self.assertEqual(sl.get_at(2).data, 3)
        self.assertIsNone(sl.get_at(3))
Exemplo n.º 15
0
    def test_remove_r_first(self):
        sl = SkipList()
        sl.insert(1)
        sl.insert(2, 0)

        sl.remove(1)

        self.assertEqual(sl.head.data, 2)
        self.assertEqual(sl.head.level, sl.max_height)
        for i in range(sl.max_height + 1):
            self.assertIsNone(sl.head.skiplist[i])
Exemplo n.º 16
0
 def test_insert_r_third_1(self):
     sl = SkipList()
     sl.insert(3)
     sl.insert(2)
     sl.insert(1)
     self.assertEqual(sl.head.data, 1)
     self.assertEqual(sl.head.skiplist[0].data, 2)
     self.assertEqual(sl.head.skiplist[0].skiplist[0].data, 3)
     self.assertEqual(sl.get_at(0).skiplist.count(None), 0)
     self.assertEqual(sl.get_at(1).skiplist.count(None), 0)
     self.assertEqual(sl.get_at(2).skiplist.count(None), sl.max_height + 1)
Exemplo n.º 17
0
 def test_smoke(self):
     skip = SkipList()
     skip.add(3)
     skip.add(2)
     skip.add(1)
     # print(skip.viz())
     self.assertTrue(1 in skip)
     self.assertTrue(2 in skip)
     self.assertTrue(3 in skip)
     self.assertFalse(0 in skip)
     self.assertFalse(4 in skip)
     self.assertFalse(10 in skip)
Exemplo n.º 18
0
    def test_add(self):
        items = list(range(100))
        random.shuffle(items)
        skip = SkipList()
        std = set()
        for i, x in enumerate(items):
            skip.add(x)
            std.add(x)
            self.assertEqual(x in skip, x in std)

            for j in range(i):
                y = items[j]
                self.assertEqual(y in skip, y in std)
Exemplo n.º 19
0
 def process_query(self, expression):
     stack = []
     if not expression:
         return SkipList(None)
     exp = deque(expression)
     while exp:
         token = exp.popleft()
         # Execute boolean operation if token is an operator.
         # Retrieve postings list of previous terms from the stack.
         if token in operators:
             if token == 'NOT':
                 complement_postings = stack.pop()
                 # Special condition to facilitate a more efficient "AND NOT" query processing
                 if exp and exp[0] == 'AND':
                     next_operator = exp.popleft()
                     stack.append(
                         self.evaluate_and_not_query(
                             complement_postings, stack.pop()))
                 else:
                     all_postings = self.postings.get_postings_at_offset(0)
                     stack.append(
                         self.evaluate_and_not_query(
                             complement_postings, all_postings))
             else:
                 postings1, postings2 = stack.pop(), stack.pop()
                 if token == 'AND':
                     stack.append(
                         self.evaluate_and_query(postings1, postings2))
                 elif token == 'OR':
                     stack.append(
                         self.evaluate_or_query(postings1, postings2))
         # If token is a term, then load its postings list and put it on the stack.
         else:
             if self.token_in_vocab(token) is None:
                 stack.append(SkipList(None))
             else:
                 stack.append(self.get_postings(token))
     return stack.pop()
Exemplo n.º 20
0
    def test_remove_r_middle_2(self):
        sl = SkipList()
        sl.insert(1, 3)
        sl.insert(2, 0)
        sl.insert(3, 0)
        sl.insert(4, 2)
        sl.insert(5, 0)
        sl.insert(6, 3)

        sl.remove(4)

        self.assertEqual(sl.head.data, 1)
        self.assertEqual(sl.get_at(0).skiplist[2].data, 6)
        self.assertEqual(sl.get_at(0).skiplist[1].data, 6)
        self.assertEqual(sl.get_at(2).skiplist[0].data, 5)
Exemplo n.º 21
0
    def test__get_level(self):
        sl = SkipList(3)

        for x in range(1, 101, 2):
            self.assertEqual(sl._get_level(x), 0)

        self.assertEqual(sl._get_level(0), sl.max_height)
        self.assertEqual(sl._get_level(2), 1)
        self.assertEqual(sl._get_level(4), 2)
        self.assertEqual(sl._get_level(6), 1)
        self.assertEqual(sl._get_level(8), 3)
        self.assertEqual(sl._get_level(10), 1)
        self.assertEqual(sl._get_level(12), 2)
        self.assertEqual(sl._get_level(14), 1)
        self.assertEqual(sl._get_level(16), 3)
Exemplo n.º 22
0
    def test_remove_r_middle_1(self):
        sl = SkipList()
        sl.insert(3)
        sl.insert(2)
        sl.insert(1)

        sl.remove(2)

        self.assertEqual(sl.head.data, 1)
        self.assertEqual(sl.get_at(1).data, 3)

        self.assertIsNone(sl.find(2))

        sl.insert(2)
        self.assertEqual(sl.get_at(1).data, 2)
        self.assertEqual(sl.get_at(2).data, 3)
Exemplo n.º 23
0
    def test_remove_r_index_1(self):
        sl = SkipList()
        sl.insert(1, 2)
        sl.insert(2, 0)
        sl.insert(3, 1)
        sl.insert(4, 0)
        sl.insert(5, 2)

        sl.remove(3)

        self.assertEqual(sl.get_at(0).skipindex[0], 1)
        self.assertEqual(sl.get_at(0).skipindex[1], 3)
        self.assertEqual(sl.get_at(0).skipindex[2], 3)

        self.assertEqual(sl.get_at(1).skipindex[0], 1)
        self.assertEqual(sl.get_at(2).skipindex[0], 1)
Exemplo n.º 24
0
    def test_remove_r_index_5(self):
        # remove last
        sl = SkipList()
        sl.insert(1, 2)
        sl.insert(2, 1)
        sl.insert(3, 0)
        sl.insert(4, 2)

        sl.remove(4)
        sl.insert(4, 2)

        self.assertEqual(sl.get_at(0).skipindex[0], 1)
        self.assertEqual(sl.get_at(0).skipindex[1], 1)
        self.assertEqual(sl.get_at(0).skipindex[2], 3)

        self.assertEqual(sl.get_at(1).skipindex[0], 1)
        self.assertEqual(sl.get_at(1).skipindex[1], 2)

        self.assertEqual(sl.get_at(2).skipindex[0], 1)
Exemplo n.º 25
0
    def test_insert_r_index_4(self):
        # middle insert
        sl = SkipList()
        sl.insert(1, sl.max_height)
        sl.insert(2, 0)
        sl.insert(4, 1)
        sl.insert(5, sl.max_height)
        sl.insert(3, 2)

        self.assertEqual(sl.get_at(3).skipindex[0], 1)
        self.assertEqual(sl.get_at(3).skipindex[1], 1)
        # *****
        self.assertEqual(sl.get_at(2).skipindex[0], 1)
        self.assertEqual(sl.get_at(2).skipindex[1], 1)
        self.assertEqual(sl.get_at(2).skipindex[2], 2)
        # *****
        self.assertEqual(sl.get_at(1).skipindex[0], 1)
        self.assertEqual(sl.get_at(0).skipindex[0], 1)
        self.assertEqual(sl.get_at(0).skipindex[1], 2)
        self.assertEqual(sl.get_at(0).skipindex[2], 2)
        self.assertEqual(sl.get_at(0).skipindex[sl.max_height], 4)
Exemplo n.º 26
0
    def test_relevel(self):
        sl = SkipList()
        sl.insert(1, 3)
        sl.insert(2, 3)
        sl.insert(3, 2)

        sl.relevel()

        self.assertEqual(sl.get_at(0).level, 3)
        self.assertEqual(sl.get_at(0).skiplist[0].data, 2)
        self.assertEqual(sl.get_at(0).skiplist[1].data, 3)
        self.assertEqual(sl.get_at(0).skiplist[2], None)
        self.assertEqual(sl.get_at(0).skiplist[3], None)
        self.assertEqual(sl.get_at(0).skipindex[0], 1)
        self.assertEqual(sl.get_at(0).skipindex[1], 2)

        self.assertEqual(sl.get_at(1).level, 0)
        self.assertEqual(sl.get_at(1).skiplist[0].data, 3)
        self.assertEqual(sl.get_at(1).skipindex[0], 1)

        self.assertEqual(sl.get_at(2).level, 1)
        self.assertEqual(sl.get_at(2).skiplist[0], None)
        self.assertEqual(sl.get_at(2).skiplist[1], None)
Exemplo n.º 27
0
 def setUp(self):
     self.sl = SkipList()
Exemplo n.º 28
0
 def test_insert_r_first(self):
     sl = SkipList()
     sl.insert(1)
     self.assertEqual(sl.head.data, 1)
     self.assertEqual(sl.head.skiplist.count(None), sl.max_height + 1)
Exemplo n.º 29
0
 def test_str(self):
     sl = SkipList()
     sl.insert(3)
     sl.insert(2)
     sl.insert(1)
     self.assertEqual(str(sl), '[1,2,3]')
Exemplo n.º 30
0
    def test_find_r_1(self):
        sl = SkipList()
        sl.insert(3, 0)
        sl.insert(1, 0)

        self.assertEqual(sl.find_r(1), 1)