in heap.py [0:0]
def pop_max_cached_value(self):
if not self.data:
raise IndexError("Heap is empty")
if 0 in self.invalid_pos:
self.push_invalid(0)
if 0 in self.invalid_pos:
raise IndexError("No valid elements in heap")
maximum = self.data[0]
del self.inverse_index[self.keyf(self.data[0])]
if len(self.data) > 1:
self.clean_invalid()
last_element_pos = len(self.data) - 1
if last_element_pos in self.invalid_pos:
# TODO: This shouldn't happen...
self.invalid_pos.add(0)
self.invalid_pos.discard(last_element_pos)
self.data[0] = self.data.pop()
self.inverse_index[self.keyf(self.data[0])] = 0
self.sift_down(0)
else:
self.data = []
self.invalid_pos = set()
#~ print("%.2f%%" % (100 * float(len(self.invalid_pos)) / len(self.data)))
return maximum