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
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: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)
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
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
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
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
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
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>"
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 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 __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)
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
def __init__(self, h): covertool.cover("bh.py:209") self.heap = h covertool.cover("bh.py:210") self.ref = None
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
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
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)
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
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)
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)
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)
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__()
def __len__(self): """Returns the number of items in this heap.""" covertool.cover("bh.py:300") return self.size
def __str__(self): covertool.cover("bh.py:131") return "(%s, c:%s, n:%s)" % (getStrKey(self), getStrKey(self.child), getStrKey(self.next))
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
def get_heap(self): covertool.cover("bh.py:219") return self.get_heap_ref().heap
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
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__()
def __str__(self): covertool.cover("bh.py:131") return '(%s, c:%s, n:%s)' % (getStrKey(self), getStrKey(self.child), getStrKey(self.next))
def __gt__(self, other): covertool.cover("bh.py:94") "Behaves like negative infinity: always False." covertool.cover("bh.py:95") return False
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 __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
def __lt__(self, other): covertool.cover("bh.py:90") "Behaves like negative infinity: always True." covertool.cover("bh.py:91") return True
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
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