Beispiel #1
0
 def __iadd__(self, other):
     """Merge.
     a += b  is equivalent to  a.union(b).
     """
     covertool.cover("bh.py:312")
     self.union(other)
     covertool.cover("bh.py:313")
     return self
Beispiel #2
0
 def __iadd__(self, other):
     """Merge.
     a += b  is equivalent to  a.union(b).
     """
     covertool.cover("bh.py:312")
     self.union(other)
     covertool.cover("bh.py:313")
     return self
Beispiel #3
0
 def link(self, other):
     covertool.cover("bh.py:134")
     "Makes other a subtree of self."
     covertool.cover("bh.py:135")
     other.parent  = self
     covertool.cover("bh.py:136")
     other.next    = self.child
     covertool.cover("bh.py:137")
     self.child    = other
     covertool.cover("bh.py:138")
     self.degree  += 1
Beispiel #4
0
 def link(self, other):
     covertool.cover("bh.py:134")
     "Makes other a subtree of self."
     covertool.cover("bh.py:135")
     other.parent = self
     covertool.cover("bh.py:136")
     other.next = self.child
     covertool.cover("bh.py:137")
     self.child = other
     covertool.cover("bh.py:138")
     self.degree += 1
Beispiel #5
0
 def decrease(self, new_key):
     covertool.cover("bh.py:70")
     "Update the priority of the referenced item to a lower value."
     covertool.cover("bh.py:71")
     assert self.in_tree
     covertool.cover("bh.py:72")
     assert self.ref.ref == self
     covertool.cover("bh.py:73")
     self.ref.decrease(new_key)
Beispiel #6
0
 def decrease(self, new_key):
     covertool.cover("bh.py:70")
     "Update the priority of the referenced item to a lower value."
     covertool.cover("bh.py:71")
     assert self.in_tree
     covertool.cover("bh.py:72")
     assert self.ref.ref == self
     covertool.cover("bh.py:73")
     self.ref.decrease(new_key)
Beispiel #7
0
 def delete(self):
     """Remove the referenced item from the heap.
     """
     covertool.cover("bh.py:78")
     self.decrease(self)
     covertool.cover("bh.py:79")
     v = self.get_heap().extract_min()
     covertool.cover("bh.py:80")
     assert not self.in_tree
     covertool.cover("bh.py:81")
     assert v is self.ref.val
Beispiel #8
0
 def get_heap_ref(self):
     covertool.cover("bh.py:212")
     if not self.ref:
         covertool.cover("bh.py:213")
         return self
     else:
         # compact
         covertool.cover("bh.py:216")
         self.ref = self.ref.get_heap_ref()
         covertool.cover("bh.py:217")
         return self.ref
Beispiel #9
0
 def get_heap_ref(self):
     covertool.cover("bh.py:212")
     if not self.ref:
         covertool.cover("bh.py:213")
         return self
     else:
         # compact
         covertool.cover("bh.py:216")
         self.ref  = self.ref.get_heap_ref()
         covertool.cover("bh.py:217")
         return self.ref
Beispiel #10
0
 def delete(self):
     """Remove the referenced item from the heap.
     """
     covertool.cover("bh.py:78")
     self.decrease(self)
     covertool.cover("bh.py:79")
     v = self.get_heap().extract_min()
     covertool.cover("bh.py:80")
     assert not self.in_tree
     covertool.cover("bh.py:81")
     assert v is self.ref.val
Beispiel #11
0
 def min(self):
     """Returns the value with the minimum key (= highest priority) in the heap
     without removing it, or None if the heap is empty.
     """
     covertool.cover("bh.py:261")
     pos = self.__min()
     covertool.cover("bh.py:262")
     if pos:
         covertool.cover("bh.py:263")
         return pos[0].val
     else:
         covertool.cover("bh.py:265")
         return None
Beispiel #12
0
 def min(self):
     """Returns the value with the minimum key (= highest priority) in the heap
     without removing it, or None if the heap is empty.
     """
     covertool.cover("bh.py:261")
     pos = self.__min()
     covertool.cover("bh.py:262")
     if pos:
         covertool.cover("bh.py:263")
         return pos[0].val
     else:
         covertool.cover("bh.py:265")
         return None
Beispiel #13
0
 def __init__(self, node, get_heap):
     covertool.cover("bh.py:59")
     self.ref      = node
     covertool.cover("bh.py:60")
     self.get_heap = get_heap
     covertool.cover("bh.py:61")
     self.in_tree  = True
Beispiel #14
0
 def insert(self, key, value=None):
     """Insert 'value' in to the heap with priority 'key'. If 'value' is omitted,
     then 'key' is used as the value.
     Returns a reference (of type ItemRef) to the internal node in the tree.
     Use this reference to delete the key or to change its priority.
     """
     covertool.cover("bh.py:241")
     n = BinomialHeap.Node(self.ref.get_heap, key, value)
     covertool.cover("bh.py:242")
     self.__union(n)
     covertool.cover("bh.py:243")
     self.size += 1
     covertool.cover("bh.py:244")
     return n.ref
Beispiel #15
0
 def insert(self, key, value=None):
     """Insert 'value' in to the heap with priority 'key'. If 'value' is omitted,
     then 'key' is used as the value.
     Returns a reference (of type ItemRef) to the internal node in the tree.
     Use this reference to delete the key or to change its priority.
     """
     covertool.cover("bh.py:241")
     n = BinomialHeap.Node(self.ref.get_heap, key, value)
     covertool.cover("bh.py:242")
     self.__union(n)
     covertool.cover("bh.py:243")
     self.size += 1
     covertool.cover("bh.py:244")
     return n.ref
Beispiel #16
0
 def __init__(self, node, get_heap):
     covertool.cover("bh.py:59")
     self.ref = node
     covertool.cover("bh.py:60")
     self.get_heap = get_heap
     covertool.cover("bh.py:61")
     self.in_tree = True
Beispiel #17
0
 def __str__(self):
     covertool.cover("bh.py:64")
     if self.in_tree:
         covertool.cover("bh.py:65")
         return "<BinomialHeap Reference to '%s'>" % str(self.ref.val)
     else:
         covertool.cover("bh.py:67")
         return "<stale BinomialHeap Reference>"
Beispiel #18
0
 def getStrKey(x):
     covertool.cover("bh.py:125")
     if x:
         covertool.cover("bh.py:126")
         return str(x.key)
     else:
         covertool.cover("bh.py:128")
         return "NIL"
Beispiel #19
0
 def getStrKey(x):
     covertool.cover("bh.py:125")
     if x:
         covertool.cover("bh.py:126")
         return str(x.key)
     else:
         covertool.cover("bh.py:128")
         return 'NIL'
Beispiel #20
0
 def __str__(self):
     covertool.cover("bh.py:64")
     if self.in_tree:
         covertool.cover("bh.py:65")
         return "<BinomialHeap Reference to '%s'>" % str(self.ref.val)
     else:
         covertool.cover("bh.py:67")
         return "<stale BinomialHeap Reference>"
Beispiel #21
0
 def __contains__(self, ref):
     """Test whether a given reference 'ref' (of ItemRef) is in this heap.
     """
     covertool.cover("bh.py:327")
     if type(ref) != ItemRef:
         covertool.cover("bh.py:328")
         raise TypeError, "Expected an ItemRef"
     else:
         covertool.cover("bh.py:330")
         return ref.in_heap(self)
Beispiel #22
0
 def __contains__(self, ref):
     """Test whether a given reference 'ref' (of ItemRef) is in this heap.
     """
     covertool.cover("bh.py:327")
     if type(ref) != ItemRef:
         covertool.cover("bh.py:328")
         raise TypeError, "Expected an ItemRef"
     else:
         covertool.cover("bh.py:330")
         return ref.in_heap(self)
Beispiel #23
0
 def next(self):
     """Returns the value with the minimum key (= highest priority) in the heap
     AND removes it from the heap; raises StopIteration if the heap is empty.
     """
     covertool.cover("bh.py:319")
     if self.head:
         covertool.cover("bh.py:320")
         return self.extract_min()
     else:
         covertool.cover("bh.py:322")
         raise StopIteration
Beispiel #24
0
 def next(self):
     """Returns the value with the minimum key (= highest priority) in the heap
     AND removes it from the heap; raises StopIteration if the heap is empty.
     """
     covertool.cover("bh.py:319")
     if self.head:
         covertool.cover("bh.py:320")
         return self.extract_min()
     else:
         covertool.cover("bh.py:322")
         raise StopIteration
Beispiel #25
0
 def __init__(self, h):
     covertool.cover("bh.py:209")
     self.heap = h
     covertool.cover("bh.py:210")
     self.ref  = None
Beispiel #26
0
 def roots_merge(h1, h2):
     """Merge two lists of heap roots, sorted by degree.
     Returns the new head.
     """
     covertool.cover("bh.py:163")
     if not h1:
         covertool.cover("bh.py:164")
         return h2
     covertool.cover("bh.py:165")
     if not h2:
         covertool.cover("bh.py:166")
         return h1
     covertool.cover("bh.py:167")
     if h1.degree < h2.degree:
         covertool.cover("bh.py:168")
         h  = h1
         covertool.cover("bh.py:169")
         h1 = h.next
     else:
         covertool.cover("bh.py:171")
         h  = h2
         covertool.cover("bh.py:172")
         h2 = h2.next
     covertool.cover("bh.py:173")
     p = h
     covertool.cover("bh.py:174")
     while h2 and h1:
         covertool.cover("bh.py:175")
         if h1.degree < h2.degree:
             covertool.cover("bh.py:176")
             p.next = h1
             covertool.cover("bh.py:177")
             h1 = h1.next
         else:
             covertool.cover("bh.py:179")
             p.next = h2
             covertool.cover("bh.py:180")
             h2 = h2.next
         covertool.cover("bh.py:181")
         p = p.next
     covertool.cover("bh.py:182")
     if h2:
         covertool.cover("bh.py:183")
         p.next = h2
     else:
         covertool.cover("bh.py:185")
         p.next = h1
     covertool.cover("bh.py:186")
     return h
Beispiel #27
0
 def roots_reverse(h):
     """Reverse the heap root list.
     Returns the new head. Also clears parent references.
     """
     covertool.cover("bh.py:193")
     if not h:
         covertool.cover("bh.py:194")
         return None
     covertool.cover("bh.py:195")
     tail = None
     covertool.cover("bh.py:196")
     next = h
     covertool.cover("bh.py:197")
     h.parent = None
     covertool.cover("bh.py:198")
     while h.next:
         covertool.cover("bh.py:199")
         next = h.next
         covertool.cover("bh.py:200")
         h.next = tail
         covertool.cover("bh.py:201")
         tail   = h
         covertool.cover("bh.py:202")
         h = next
         covertool.cover("bh.py:203")
         h.parent = None
     covertool.cover("bh.py:204")
     h.next = tail
     covertool.cover("bh.py:205")
     return h
Beispiel #28
0
 def __min(self):
     covertool.cover("bh.py:333")
     if not self.head:
         covertool.cover("bh.py:334")
         return None
     covertool.cover("bh.py:335")
     min = self.head
     covertool.cover("bh.py:336")
     min_prev = None
     covertool.cover("bh.py:337")
     prev = min
     covertool.cover("bh.py:338")
     cur = min.next
     covertool.cover("bh.py:339")
     while cur:
         covertool.cover("bh.py:340")
         if cur.key < min.key:
             covertool.cover("bh.py:341")
             min = cur
             covertool.cover("bh.py:342")
             min_prev = prev
         covertool.cover("bh.py:343")
         prev = cur
         covertool.cover("bh.py:344")
         cur = cur.next
     covertool.cover("bh.py:345")
     return (min, min_prev)
Beispiel #29
0
 def decrease(self, new_key):
     covertool.cover("bh.py:141")
     node = self
     covertool.cover("bh.py:142")
     assert new_key < node.key
     covertool.cover("bh.py:143")
     node.key = new_key
     covertool.cover("bh.py:144")
     cur    = node
     covertool.cover("bh.py:145")
     parent = cur.parent
     covertool.cover("bh.py:146")
     while parent and cur.key < parent.key:
         # need to bubble up
         # swap refs
         covertool.cover("bh.py:149")
         parent.ref.ref, cur.ref.ref = cur, parent
         covertool.cover("bh.py:150")
         parent.ref, cur.ref         = cur.ref, parent.ref
         # now swap keys and payload
         covertool.cover("bh.py:152")
         parent.key, cur.key         = cur.key, parent.key
         covertool.cover("bh.py:153")
         parent.val, cur.val         = cur.val, parent.val
         # step up
         covertool.cover("bh.py:155")
         cur    = parent
         covertool.cover("bh.py:156")
         parent = cur.parent
Beispiel #30
0
def heap(lst=[]):
    """Create a new heap. lst should be a sequence of (key, value) pairs.
    Shortcut for BinomialHeap(lst)
    """
    covertool.cover("bh.py:386")
    return BinomialHeap(lst)
Beispiel #31
0
 def __setitem__(self, key, value):
     """Insert.
     H[key] = value  is equivalent to  H.insert(key, value)
     """
     covertool.cover("bh.py:306")
     self.insert(key, value)
Beispiel #32
0
 def __init__(self, lst=[]):
     """Populate a new heap with the (key, value) pairs in 'lst'.
     If the elements of lst are not subscriptable, then they are treated as
     opaque elements and inserted into the heap themselves.
     """
     covertool.cover("bh.py:226")
     self.head = None
     covertool.cover("bh.py:227")
     self.size = 0
     covertool.cover("bh.py:228")
     self.ref  = BinomialHeap.__Ref(self)
     covertool.cover("bh.py:229")
     for x in lst:
         covertool.cover("bh.py:230")
         try:
             covertool.cover("bh.py:231")
             self.insert(x[0], x[1])
         except TypeError:
             covertool.cover("bh.py:233")
             self.insert(x)
Beispiel #33
0
 def union(self, other):
     """Merge 'other' into 'self'. Returns None.
     Note: This is a destructive operation; 'other' is an empty heap afterwards.
     """
     covertool.cover("bh.py:250")
     assert (self != other)
     covertool.cover("bh.py:251")
     self.size = self.size + other.size
     covertool.cover("bh.py:252")
     h2        = other.head
     covertool.cover("bh.py:253")
     self.__union(h2)
     covertool.cover("bh.py:254")
     other.ref.ref = self.ref
     covertool.cover("bh.py:255")
     other.__init__()
Beispiel #34
0
 def __min(self):
     covertool.cover("bh.py:333")
     if not self.head:
         covertool.cover("bh.py:334")
         return None
     covertool.cover("bh.py:335")
     min  = self.head
     covertool.cover("bh.py:336")
     min_prev = None
     covertool.cover("bh.py:337")
     prev = min
     covertool.cover("bh.py:338")
     cur  = min.next
     covertool.cover("bh.py:339")
     while cur:
         covertool.cover("bh.py:340")
         if cur.key < min.key:
             covertool.cover("bh.py:341")
             min = cur
             covertool.cover("bh.py:342")
             min_prev = prev
         covertool.cover("bh.py:343")
         prev = cur
         covertool.cover("bh.py:344")
         cur  = cur.next
     covertool.cover("bh.py:345")
     return (min, min_prev)
Beispiel #35
0
def heap(lst=[]):
    """Create a new heap. lst should be a sequence of (key, value) pairs.
    Shortcut for BinomialHeap(lst)
    """
    covertool.cover("bh.py:386")
    return BinomialHeap(lst)
Beispiel #36
0
 def __len__(self):
     """Returns the number of items in this heap."""
     covertool.cover("bh.py:300")
     return self.size
Beispiel #37
0
 def __setitem__(self, key, value):
     """Insert.
     H[key] = value  is equivalent to  H.insert(key, value)
     """
     covertool.cover("bh.py:306")
     self.insert(key, value)
Beispiel #38
0
 def __str__(self):
     covertool.cover("bh.py:131")
     return "(%s, c:%s, n:%s)" % (getStrKey(self), getStrKey(self.child), getStrKey(self.next))
Beispiel #39
0
 def __init__(self, h):
     covertool.cover("bh.py:209")
     self.heap = h
     covertool.cover("bh.py:210")
     self.ref = None
Beispiel #40
0
 def extract_min(self):
     """Returns the value with the minimum key (= highest priority) in the heap
     AND removes it from the heap, or None if the heap is empty.
     """
     # find mininum
     covertool.cover("bh.py:272")
     pos = self.__min()
     covertool.cover("bh.py:273")
     if not pos:
         covertool.cover("bh.py:274")
         return None
     else:
         covertool.cover("bh.py:276")
         (x, prev) = pos
         # remove from list
         covertool.cover("bh.py:278")
         if prev:
             covertool.cover("bh.py:279")
             prev.next = x.next
         else:
             covertool.cover("bh.py:281")
             self.head = x.next
         covertool.cover("bh.py:282")
         kids = BinomialHeap.Node.roots_reverse(x.child)
         covertool.cover("bh.py:283")
         self.__union(kids)
         covertool.cover("bh.py:284")
         x.ref.in_tree = False
         covertool.cover("bh.py:285")
         self.size -= 1
         covertool.cover("bh.py:286")
         return x.val
Beispiel #41
0
 def get_heap(self):
     covertool.cover("bh.py:219")
     return self.get_heap_ref().heap
Beispiel #42
0
 def __union(self, h2):
     covertool.cover("bh.py:348")
     if not h2:
         # nothing to do
         covertool.cover("bh.py:350")
         return
     covertool.cover("bh.py:351")
     h1 = self.head
     covertool.cover("bh.py:352")
     if not h1:
         covertool.cover("bh.py:353")
         self.head = h2
         covertool.cover("bh.py:354")
         return
     covertool.cover("bh.py:355")
     h1 = BinomialHeap.Node.roots_merge(h1, h2)
     covertool.cover("bh.py:356")
     prev = None
     covertool.cover("bh.py:357")
     x = h1
     covertool.cover("bh.py:358")
     next = x.next
     covertool.cover("bh.py:359")
     while next:
         covertool.cover("bh.py:360")
         if x.degree != next.degree or (next.next and next.next.degree == x.degree):
             covertool.cover("bh.py:362")
             prev = x
             covertool.cover("bh.py:363")
             x = next
         elif x.key <= next.key:
             # x becomes the root of next
             covertool.cover("bh.py:366")
             x.next = next.next
             covertool.cover("bh.py:367")
             x.link(next)
         else:
             # next becomes the root of x
             covertool.cover("bh.py:370")
             if not prev:
                 # update the "master" head
                 covertool.cover("bh.py:372")
                 h1 = next
             else:
                 # just update previous link
                 covertool.cover("bh.py:375")
                 prev.next = next
             covertool.cover("bh.py:376")
             next.link(x)
             # x is not toplevel anymore, update ref by advancing
             covertool.cover("bh.py:378")
             x = next
         covertool.cover("bh.py:379")
         next = x.next
     covertool.cover("bh.py:380")
     self.head = h1
Beispiel #43
0
 def union(self, other):
     """Merge 'other' into 'self'. Returns None.
     Note: This is a destructive operation; 'other' is an empty heap afterwards.
     """
     covertool.cover("bh.py:250")
     assert self != other
     covertool.cover("bh.py:251")
     self.size = self.size + other.size
     covertool.cover("bh.py:252")
     h2 = other.head
     covertool.cover("bh.py:253")
     self.__union(h2)
     covertool.cover("bh.py:254")
     other.ref.ref = self.ref
     covertool.cover("bh.py:255")
     other.__init__()
Beispiel #44
0
 def extract_min(self):
     """Returns the value with the minimum key (= highest priority) in the heap
     AND removes it from the heap, or None if the heap is empty.
     """
     # find mininum
     covertool.cover("bh.py:272")
     pos = self.__min()
     covertool.cover("bh.py:273")
     if not pos:
         covertool.cover("bh.py:274")
         return None
     else:
         covertool.cover("bh.py:276")
         (x, prev) = pos
         # remove from list
         covertool.cover("bh.py:278")
         if prev:
             covertool.cover("bh.py:279")
             prev.next = x.next
         else:
             covertool.cover("bh.py:281")
             self.head = x.next
         covertool.cover("bh.py:282")
         kids = BinomialHeap.Node.roots_reverse(x.child)
         covertool.cover("bh.py:283")
         self.__union(kids)
         covertool.cover("bh.py:284")
         x.ref.in_tree = False
         covertool.cover("bh.py:285")
         self.size -= 1
         covertool.cover("bh.py:286")
         return x.val
Beispiel #45
0
 def roots_reverse(h):
     """Reverse the heap root list.
     Returns the new head. Also clears parent references.
     """
     covertool.cover("bh.py:193")
     if not h:
         covertool.cover("bh.py:194")
         return None
     covertool.cover("bh.py:195")
     tail = None
     covertool.cover("bh.py:196")
     next = h
     covertool.cover("bh.py:197")
     h.parent = None
     covertool.cover("bh.py:198")
     while h.next:
         covertool.cover("bh.py:199")
         next = h.next
         covertool.cover("bh.py:200")
         h.next = tail
         covertool.cover("bh.py:201")
         tail = h
         covertool.cover("bh.py:202")
         h = next
         covertool.cover("bh.py:203")
         h.parent = None
     covertool.cover("bh.py:204")
     h.next = tail
     covertool.cover("bh.py:205")
     return h
Beispiel #46
0
 def get_heap(self):
     covertool.cover("bh.py:219")
     return self.get_heap_ref().heap
Beispiel #47
0
 def __len__(self):
     """Returns the number of items in this heap."""
     covertool.cover("bh.py:300")
     return self.size
Beispiel #48
0
 def __str__(self):
     covertool.cover("bh.py:131")
     return '(%s, c:%s, n:%s)' % (getStrKey(self), getStrKey(self.child), getStrKey(self.next))
Beispiel #49
0
 def __gt__(self, other):
     covertool.cover("bh.py:94")
     "Behaves like negative infinity: always False."
     covertool.cover("bh.py:95")
     return False
Beispiel #50
0
 def __init__(self, get_heap, key, val=None):
     covertool.cover("bh.py:114")
     self.degree = 0
     covertool.cover("bh.py:115")
     self.parent = None
     covertool.cover("bh.py:116")
     self.next = None
     covertool.cover("bh.py:117")
     self.child = None
     covertool.cover("bh.py:118")
     self.key = key
     covertool.cover("bh.py:119")
     self.ref = ItemRef(self, get_heap)
     covertool.cover("bh.py:120")
     if val == None:
         covertool.cover("bh.py:121")
         val = key
     covertool.cover("bh.py:122")
     self.val = val
Beispiel #51
0
 def roots_merge(h1, h2):
     """Merge two lists of heap roots, sorted by degree.
     Returns the new head.
     """
     covertool.cover("bh.py:163")
     if not h1:
         covertool.cover("bh.py:164")
         return h2
     covertool.cover("bh.py:165")
     if not h2:
         covertool.cover("bh.py:166")
         return h1
     covertool.cover("bh.py:167")
     if h1.degree < h2.degree:
         covertool.cover("bh.py:168")
         h = h1
         covertool.cover("bh.py:169")
         h1 = h.next
     else:
         covertool.cover("bh.py:171")
         h = h2
         covertool.cover("bh.py:172")
         h2 = h2.next
     covertool.cover("bh.py:173")
     p = h
     covertool.cover("bh.py:174")
     while h2 and h1:
         covertool.cover("bh.py:175")
         if h1.degree < h2.degree:
             covertool.cover("bh.py:176")
             p.next = h1
             covertool.cover("bh.py:177")
             h1 = h1.next
         else:
             covertool.cover("bh.py:179")
             p.next = h2
             covertool.cover("bh.py:180")
             h2 = h2.next
         covertool.cover("bh.py:181")
         p = p.next
     covertool.cover("bh.py:182")
     if h2:
         covertool.cover("bh.py:183")
         p.next = h2
     else:
         covertool.cover("bh.py:185")
         p.next = h1
     covertool.cover("bh.py:186")
     return h
Beispiel #52
0
 def __init__(self, lst=[]):
     """Populate a new heap with the (key, value) pairs in 'lst'.
     If the elements of lst are not subscriptable, then they are treated as
     opaque elements and inserted into the heap themselves.
     """
     covertool.cover("bh.py:226")
     self.head = None
     covertool.cover("bh.py:227")
     self.size = 0
     covertool.cover("bh.py:228")
     self.ref = BinomialHeap.__Ref(self)
     covertool.cover("bh.py:229")
     for x in lst:
         covertool.cover("bh.py:230")
         try:
             covertool.cover("bh.py:231")
             self.insert(x[0], x[1])
         except TypeError:
             covertool.cover("bh.py:233")
             self.insert(x)
Beispiel #53
0
 def __union(self, h2):
     covertool.cover("bh.py:348")
     if not h2:
         # nothing to do
         covertool.cover("bh.py:350")
         return
     covertool.cover("bh.py:351")
     h1 = self.head
     covertool.cover("bh.py:352")
     if not h1:
         covertool.cover("bh.py:353")
         self.head = h2
         covertool.cover("bh.py:354")
         return
     covertool.cover("bh.py:355")
     h1 = BinomialHeap.Node.roots_merge(h1, h2)
     covertool.cover("bh.py:356")
     prev = None
     covertool.cover("bh.py:357")
     x    = h1
     covertool.cover("bh.py:358")
     next = x.next
     covertool.cover("bh.py:359")
     while next:
         covertool.cover("bh.py:360")
         if x.degree != next.degree or \
                 (next.next and next.next.degree == x.degree):
             covertool.cover("bh.py:362")
             prev = x
             covertool.cover("bh.py:363")
             x    = next
         elif x.key <= next.key:
             # x becomes the root of next
             covertool.cover("bh.py:366")
             x.next = next.next
             covertool.cover("bh.py:367")
             x.link(next)
         else:
             # next becomes the root of x
             covertool.cover("bh.py:370")
             if not prev:
                 # update the "master" head
                 covertool.cover("bh.py:372")
                 h1 = next
             else:
                 # just update previous link
                 covertool.cover("bh.py:375")
                 prev.next = next
             covertool.cover("bh.py:376")
             next.link(x)
             # x is not toplevel anymore, update ref by advancing
             covertool.cover("bh.py:378")
             x = next
         covertool.cover("bh.py:379")
         next = x.next
     covertool.cover("bh.py:380")
     self.head = h1
Beispiel #54
0
 def __lt__(self, other):
     covertool.cover("bh.py:90")
     "Behaves like negative infinity: always True."
     covertool.cover("bh.py:91")
     return True
Beispiel #55
0
    class Node(object):
        covertool.cover("bh.py:112")
        "Internal node of the heap. Don't use directly."
        def __init__(self, get_heap, key, val=None):
            covertool.cover("bh.py:114")
            self.degree = 0
            covertool.cover("bh.py:115")
            self.parent = None
            covertool.cover("bh.py:116")
            self.next   = None
            covertool.cover("bh.py:117")
            self.child  = None
            covertool.cover("bh.py:118")
            self.key    = key
            covertool.cover("bh.py:119")
            self.ref    = ItemRef(self, get_heap)
            covertool.cover("bh.py:120")
            if val == None:
                covertool.cover("bh.py:121")
                val = key
            covertool.cover("bh.py:122")
            self.val    = val

        def getStrKey(x):
            covertool.cover("bh.py:125")
            if x:
                covertool.cover("bh.py:126")
                return str(x.key)
            else:
                covertool.cover("bh.py:128")
                return 'NIL'
            
        def __str__(self):
            covertool.cover("bh.py:131")
            return '(%s, c:%s, n:%s)' % (getStrKey(self), getStrKey(self.child), getStrKey(self.next))

        def link(self, other):
            covertool.cover("bh.py:134")
            "Makes other a subtree of self."
            covertool.cover("bh.py:135")
            other.parent  = self
            covertool.cover("bh.py:136")
            other.next    = self.child
            covertool.cover("bh.py:137")
            self.child    = other
            covertool.cover("bh.py:138")
            self.degree  += 1

        def decrease(self, new_key):
            covertool.cover("bh.py:141")
            node = self
            covertool.cover("bh.py:142")
            assert new_key < node.key
            covertool.cover("bh.py:143")
            node.key = new_key
            covertool.cover("bh.py:144")
            cur    = node
            covertool.cover("bh.py:145")
            parent = cur.parent
            covertool.cover("bh.py:146")
            while parent and cur.key < parent.key:
                # need to bubble up
                # swap refs
                covertool.cover("bh.py:149")
                parent.ref.ref, cur.ref.ref = cur, parent
                covertool.cover("bh.py:150")
                parent.ref, cur.ref         = cur.ref, parent.ref
                # now swap keys and payload
                covertool.cover("bh.py:152")
                parent.key, cur.key         = cur.key, parent.key
                covertool.cover("bh.py:153")
                parent.val, cur.val         = cur.val, parent.val
                # step up
                covertool.cover("bh.py:155")
                cur    = parent
                covertool.cover("bh.py:156")
                parent = cur.parent

        @staticmethod
        def roots_merge(h1, h2):
            """Merge two lists of heap roots, sorted by degree.
            Returns the new head.
            """
            covertool.cover("bh.py:163")
            if not h1:
                covertool.cover("bh.py:164")
                return h2
            covertool.cover("bh.py:165")
            if not h2:
                covertool.cover("bh.py:166")
                return h1
            covertool.cover("bh.py:167")
            if h1.degree < h2.degree:
                covertool.cover("bh.py:168")
                h  = h1
                covertool.cover("bh.py:169")
                h1 = h.next
            else:
                covertool.cover("bh.py:171")
                h  = h2
                covertool.cover("bh.py:172")
                h2 = h2.next
            covertool.cover("bh.py:173")
            p = h
            covertool.cover("bh.py:174")
            while h2 and h1:
                covertool.cover("bh.py:175")
                if h1.degree < h2.degree:
                    covertool.cover("bh.py:176")
                    p.next = h1
                    covertool.cover("bh.py:177")
                    h1 = h1.next
                else:
                    covertool.cover("bh.py:179")
                    p.next = h2
                    covertool.cover("bh.py:180")
                    h2 = h2.next
                covertool.cover("bh.py:181")
                p = p.next
            covertool.cover("bh.py:182")
            if h2:
                covertool.cover("bh.py:183")
                p.next = h2
            else:
                covertool.cover("bh.py:185")
                p.next = h1
            covertool.cover("bh.py:186")
            return h

        @staticmethod
        def roots_reverse(h):
            """Reverse the heap root list.
            Returns the new head. Also clears parent references.
            """
            covertool.cover("bh.py:193")
            if not h:
                covertool.cover("bh.py:194")
                return None
            covertool.cover("bh.py:195")
            tail = None
            covertool.cover("bh.py:196")
            next = h
            covertool.cover("bh.py:197")
            h.parent = None
            covertool.cover("bh.py:198")
            while h.next:
                covertool.cover("bh.py:199")
                next = h.next
                covertool.cover("bh.py:200")
                h.next = tail
                covertool.cover("bh.py:201")
                tail   = h
                covertool.cover("bh.py:202")
                h = next
                covertool.cover("bh.py:203")
                h.parent = None
            covertool.cover("bh.py:204")
            h.next = tail
            covertool.cover("bh.py:205")
            return h
Beispiel #56
0
 def __init__(self, get_heap, key, val=None):
     covertool.cover("bh.py:114")
     self.degree = 0
     covertool.cover("bh.py:115")
     self.parent = None
     covertool.cover("bh.py:116")
     self.next   = None
     covertool.cover("bh.py:117")
     self.child  = None
     covertool.cover("bh.py:118")
     self.key    = key
     covertool.cover("bh.py:119")
     self.ref    = ItemRef(self, get_heap)
     covertool.cover("bh.py:120")
     if val == None:
         covertool.cover("bh.py:121")
         val = key
     covertool.cover("bh.py:122")
     self.val    = val
Beispiel #57
0
 def __gt__(self, other):
     covertool.cover("bh.py:94")
     "Behaves like negative infinity: always False."
     covertool.cover("bh.py:95")
     return False
Beispiel #58
0
 def decrease(self, new_key):
     covertool.cover("bh.py:141")
     node = self
     covertool.cover("bh.py:142")
     assert new_key < node.key
     covertool.cover("bh.py:143")
     node.key = new_key
     covertool.cover("bh.py:144")
     cur = node
     covertool.cover("bh.py:145")
     parent = cur.parent
     covertool.cover("bh.py:146")
     while parent and cur.key < parent.key:
         # need to bubble up
         # swap refs
         covertool.cover("bh.py:149")
         parent.ref.ref, cur.ref.ref = cur, parent
         covertool.cover("bh.py:150")
         parent.ref, cur.ref = cur.ref, parent.ref
         # now swap keys and payload
         covertool.cover("bh.py:152")
         parent.key, cur.key = cur.key, parent.key
         covertool.cover("bh.py:153")
         parent.val, cur.val = cur.val, parent.val
         # step up
         covertool.cover("bh.py:155")
         cur = parent
         covertool.cover("bh.py:156")
         parent = cur.parent
Beispiel #59
0
 def in_heap(self, heap):
     """Returns True if the referenced item is part of the BinomialHeap 'heap';
     False otherwise.
     """
     covertool.cover("bh.py:87")
     return self.in_tree and self.get_heap() == heap
Beispiel #60
0
 def in_heap(self, heap):
     """Returns True if the referenced item is part of the BinomialHeap 'heap';
     False otherwise.
     """
     covertool.cover("bh.py:87")
     return self.in_tree and self.get_heap() == heap