landlab.utils.stable_priority_queue¶
- class StablePriorityQueue[source]¶
Bases:
object
Implements a stable priority queue, that tracks insertion order; i.e., this is used to break ties.
See https://docs.python.org/2/library/heapq.html#priority-queue-implementation-notes & https://www.sciencedirect.com/science/article/pii/S0098300413001337
Examples
>>> q = StablePriorityQueue() >>> q.add_task("b", priority=2) >>> q.add_task("a", priority=1) >>> q.add_task(0, priority=0) >>> q.add_task("c", priority=2) >>> q.remove_task(0) >>> q.pop_task() 'a' >>> q.peek_at_task() 'b' >>> np.all(q.tasks_currently_in_queue() == np.array(["b", "c"])) True >>> q.pop_task() 'b' >>> np.all(q.tasks_ever_in_queue() == np.array(["b", "a", "0", "c"])) True
If only ints or floats are loaded into the array, the _in_queue methods return arrays with the corresponding data types:
>>> q = StablePriorityQueue() >>> q.add_task(2, priority=2) >>> q.add_task(1, priority=1) >>> np.issubdtype(q.tasks_currently_in_queue().dtype, np.integer) True >>> q = StablePriorityQueue() >>> q.add_task(np.pi) >>> np.issubdtype(q.tasks_currently_in_queue().dtype, np.floating) True
Popping from (or peeking at) an empty queue will throw a KeyError:
>>> q = StablePriorityQueue() >>> try: ... q.pop_task() ... except KeyError: ... print("No tasks left") ... No tasks left
- __new__(**kwargs)¶