예제 #1
0
파일: bh_INST.py 프로젝트: pramttl/tstl
 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
예제 #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
예제 #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
예제 #4
0
파일: bh_INST.py 프로젝트: pramttl/tstl
 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
예제 #5
0
파일: bh_INST.py 프로젝트: pramttl/tstl
 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)
예제 #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)
예제 #7
0
파일: bh_INST.py 프로젝트: pramttl/tstl
 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
예제 #8
0
파일: bh_INST.py 프로젝트: pramttl/tstl
 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
예제 #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
예제 #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
예제 #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
예제 #12
0
파일: bh_INST.py 프로젝트: pramttl/tstl
 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
예제 #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
예제 #14
0
파일: bh_INST.py 프로젝트: pramttl/tstl
 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
예제 #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
예제 #16
0
파일: bh_INST.py 프로젝트: pramttl/tstl
 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
예제 #17
0
파일: bh_INST.py 프로젝트: pramttl/tstl
 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>"
예제 #18
0
파일: bh_INST.py 프로젝트: pramttl/tstl
 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"
예제 #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'
예제 #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>"
예제 #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)
예제 #22
0
파일: bh_INST.py 프로젝트: pramttl/tstl
 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)
예제 #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
예제 #24
0
파일: bh_INST.py 프로젝트: pramttl/tstl
 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
예제 #25
0
 def __init__(self, h):
     covertool.cover("bh.py:209")
     self.heap = h
     covertool.cover("bh.py:210")
     self.ref  = None
예제 #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
예제 #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
예제 #28
0
파일: bh_INST.py 프로젝트: pramttl/tstl
 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)
예제 #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
예제 #30
0
파일: bh_INST.py 프로젝트: pramttl/tstl
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)
예제 #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)
예제 #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)
예제 #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__()
예제 #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)
예제 #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)
예제 #36
0
파일: bh_INST.py 프로젝트: pramttl/tstl
 def __len__(self):
     """Returns the number of items in this heap."""
     covertool.cover("bh.py:300")
     return self.size
예제 #37
0
파일: bh_INST.py 프로젝트: pramttl/tstl
 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)
예제 #38
0
파일: bh_INST.py 프로젝트: pramttl/tstl
 def __str__(self):
     covertool.cover("bh.py:131")
     return "(%s, c:%s, n:%s)" % (getStrKey(self), getStrKey(self.child), getStrKey(self.next))
예제 #39
0
파일: bh_INST.py 프로젝트: pramttl/tstl
 def __init__(self, h):
     covertool.cover("bh.py:209")
     self.heap = h
     covertool.cover("bh.py:210")
     self.ref = None
예제 #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
예제 #41
0
 def get_heap(self):
     covertool.cover("bh.py:219")
     return self.get_heap_ref().heap
예제 #42
0
파일: bh_INST.py 프로젝트: pramttl/tstl
 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
예제 #43
0
파일: bh_INST.py 프로젝트: pramttl/tstl
 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__()
예제 #44
0
파일: bh_INST.py 프로젝트: pramttl/tstl
 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
예제 #45
0
파일: bh_INST.py 프로젝트: pramttl/tstl
 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
예제 #46
0
파일: bh_INST.py 프로젝트: pramttl/tstl
 def get_heap(self):
     covertool.cover("bh.py:219")
     return self.get_heap_ref().heap
예제 #47
0
 def __len__(self):
     """Returns the number of items in this heap."""
     covertool.cover("bh.py:300")
     return self.size
예제 #48
0
 def __str__(self):
     covertool.cover("bh.py:131")
     return '(%s, c:%s, n:%s)' % (getStrKey(self), getStrKey(self.child), getStrKey(self.next))
예제 #49
0
파일: bh_INST.py 프로젝트: pramttl/tstl
 def __gt__(self, other):
     covertool.cover("bh.py:94")
     "Behaves like negative infinity: always False."
     covertool.cover("bh.py:95")
     return False
예제 #50
0
파일: bh_INST.py 프로젝트: pramttl/tstl
 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
예제 #51
0
파일: bh_INST.py 프로젝트: pramttl/tstl
 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
예제 #52
0
파일: bh_INST.py 프로젝트: pramttl/tstl
 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)
예제 #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
예제 #54
0
파일: bh_INST.py 프로젝트: pramttl/tstl
 def __lt__(self, other):
     covertool.cover("bh.py:90")
     "Behaves like negative infinity: always True."
     covertool.cover("bh.py:91")
     return True
예제 #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
예제 #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
예제 #57
0
 def __gt__(self, other):
     covertool.cover("bh.py:94")
     "Behaves like negative infinity: always False."
     covertool.cover("bh.py:95")
     return False
예제 #58
0
파일: bh_INST.py 프로젝트: pramttl/tstl
 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
예제 #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
예제 #60
0
파일: bh_INST.py 프로젝트: pramttl/tstl
 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