coinor.blimpy.Queues module

This module implements a Queue class, a simple list-based queue data structure and a PriorityQueue class, which is a heap-based priority queue data structure.

Source code
'''
This module implements a Queue class, a simple list-based queue data structure
and a PriorityQueue class, which is a heap-based priority queue data structure.
'''
from __future__ import absolute_import
from builtins import next
from builtins import object

__version__    = '1.1.0'
__author__     = 'Aykut Bulut, Ted Ralphs ([email protected],[email protected])'
__license__    = 'BSD'
__maintainer__ = 'Aykut Bulut'
__email__      = '[email protected]'
__url__        = None
__title__      = 'Queue data structure'

from .LinkedList import LinkedList

class Queue(object):
    '''
    A queue data structure built on top of a linked list
    attributes:
        items:    A list that holds objects in the queue
                  type: LinkedList
    methods:
        __init__(self):        constructor of the class
        isEmpty(self):         returns True if the queue instance is empty
        push(self,item):       inserts item to the queue
        pop(self,item):        removes first item in the queue if no item is
                               specified removes the given item if item is
                               specified
        size(self):            returns the size of the queue
    '''
    def __init__(self):
        self.items = LinkedList()

    def isEmpty(self):
        return len(self.items) == 0

    def enqueue(self, item):
        self.items.insert(0,item)

    def push(self, item):
        self.enqueue(item)

    def dequeue(self, item = None):
        if item == None:
            return self.items.pop()
        else:
            self.items.remove(item)
            return item

    def remove(self, item = None):
        self.dequeue(item)

    def pop(self, item = None):
        return self.dequeue(item)

    def peek(self, item = None):
        if item == None:
            return self.items[len(self.items)-1]
        else:
            for i in self.items:
                if i == item:
                    return i
        return None

    def size(self):
        return len(self.items)

import itertools, heapq

class PriorityQueue(object):
    '''
    A priority queue based on a heap.
    attributes:
        heap:                  A heap-ordered list that holds objects in the
                               queue
                               type: list
        entry_finder:          A (map) dictionary for finding items in the heap
        counter:               A unique sequence generator
        size:                  Number of items in the queue
    methods:
        __init__(self):        constructor of the class
        isEmpty(self):         returns True if the queue is empty, False
                               otherwise
        push(self,key,item,priority): inserts item with given key and 
                               priority into the queue
        pop(self,index):       removes item with index from the queue
                               if no item is specified or removes the given
                               item if item is specified
        size(self):            returns the size of the queue
    '''
    def __init__(self, aList = None):
        if aList == None:
            self.heap = []
        else:
            self.heap = aList
        self.entry_finder = {}               # mapping of tasks to entries
        self.REMOVED = '<removed-task>'      # placeholder for a removed task
        self.counter = itertools.count()     # unique sequence count
        self.size = len(self.heap)

    def isEmpty(self):
        return self.size == 0

    def heapify(self):
        heapq.heapify(self.heap)

    def pop(self, key = None):
        '''
        Remove and return the lowest priority task. Raise KeyError if empty.
        '''
        if key == None:
            while self.size:
                entry = heapq.heappop(self.heap)
                if entry[-1] is not self.REMOVED:
                    del self.entry_finder[entry[-1]]
                    self.size -= 1
                    return entry[-2]
            raise KeyError('pop from an empty priority queue')
        else:
            self.remove(key)

    def peek(self, key = None):
        if key == None:
            while self.size:
                if self.heap[0][-1] is not self.REMOVED:
                    return self.heap[0][-2]
                else:
                    heapq.heappop(self.heap)
            raise KeyError('peek at an empty priority queue')
        try:
            return self.entry_finder[key][-2]
        except KeyError:
            return None

    def get_priority(self, key):
        try:
            return self.entry_finder[key][0]
        except KeyError:
            return None

    def push(self, key, priority = None, item = None):
        '''
        Add to the heap or update the priority of an existing task.
        '''
        if priority == None:
            priority = key
        if key in self.entry_finder:
            self.remove(key)
        if item is None:
            item = key
        count = next(self.counter)
        entry = [priority, count, item, key]
        self.entry_finder[key] = entry
        self.size += 1
        heapq.heappush(self.heap, entry)

    def remove(self, key):
        '''
        Mark an existing task as REMOVED.  Raise KeyError if not found.
        '''
        entry = self.entry_finder.pop(key)
        entry[-1] = self.REMOVED
        self.size -= 1

Classes

class PriorityQueue

A priority queue based on a heap. attributes: heap: A heap-ordered list that holds objects in the queue type: list entry_finder: A (map) dictionary for finding items in the heap counter: A unique sequence generator size: Number of items in the queue methods: init(self): constructor of the class isEmpty(self): returns True if the queue is empty, False otherwise push(self,key,item,priority): inserts item with given key and priority into the queue pop(self,index): removes item with index from the queue if no item is specified or removes the given item if item is specified size(self): returns the size of the queue

Source code
class PriorityQueue(object):
    '''
    A priority queue based on a heap.
    attributes:
        heap:                  A heap-ordered list that holds objects in the
                               queue
                               type: list
        entry_finder:          A (map) dictionary for finding items in the heap
        counter:               A unique sequence generator
        size:                  Number of items in the queue
    methods:
        __init__(self):        constructor of the class
        isEmpty(self):         returns True if the queue is empty, False
                               otherwise
        push(self,key,item,priority): inserts item with given key and 
                               priority into the queue
        pop(self,index):       removes item with index from the queue
                               if no item is specified or removes the given
                               item if item is specified
        size(self):            returns the size of the queue
    '''
    def __init__(self, aList = None):
        if aList == None:
            self.heap = []
        else:
            self.heap = aList
        self.entry_finder = {}               # mapping of tasks to entries
        self.REMOVED = '<removed-task>'      # placeholder for a removed task
        self.counter = itertools.count()     # unique sequence count
        self.size = len(self.heap)

    def isEmpty(self):
        return self.size == 0

    def heapify(self):
        heapq.heapify(self.heap)

    def pop(self, key = None):
        '''
        Remove and return the lowest priority task. Raise KeyError if empty.
        '''
        if key == None:
            while self.size:
                entry = heapq.heappop(self.heap)
                if entry[-1] is not self.REMOVED:
                    del self.entry_finder[entry[-1]]
                    self.size -= 1
                    return entry[-2]
            raise KeyError('pop from an empty priority queue')
        else:
            self.remove(key)

    def peek(self, key = None):
        if key == None:
            while self.size:
                if self.heap[0][-1] is not self.REMOVED:
                    return self.heap[0][-2]
                else:
                    heapq.heappop(self.heap)
            raise KeyError('peek at an empty priority queue')
        try:
            return self.entry_finder[key][-2]
        except KeyError:
            return None

    def get_priority(self, key):
        try:
            return self.entry_finder[key][0]
        except KeyError:
            return None

    def push(self, key, priority = None, item = None):
        '''
        Add to the heap or update the priority of an existing task.
        '''
        if priority == None:
            priority = key
        if key in self.entry_finder:
            self.remove(key)
        if item is None:
            item = key
        count = next(self.counter)
        entry = [priority, count, item, key]
        self.entry_finder[key] = entry
        self.size += 1
        heapq.heappush(self.heap, entry)

    def remove(self, key):
        '''
        Mark an existing task as REMOVED.  Raise KeyError if not found.
        '''
        entry = self.entry_finder.pop(key)
        entry[-1] = self.REMOVED
        self.size -= 1

Methods

def __init__(self, aList=None)

Initialize self. See help(type(self)) for accurate signature.

Source code
def __init__(self, aList = None):
    if aList == None:
        self.heap = []
    else:
        self.heap = aList
    self.entry_finder = {}               # mapping of tasks to entries
    self.REMOVED = '<removed-task>'      # placeholder for a removed task
    self.counter = itertools.count()     # unique sequence count
    self.size = len(self.heap)
def get_priority(self, key)
Source code
def get_priority(self, key):
    try:
        return self.entry_finder[key][0]
    except KeyError:
        return None
def heapify(self)
Source code
def heapify(self):
    heapq.heapify(self.heap)
def isEmpty(self)
Source code
def isEmpty(self):
    return self.size == 0
def peek(self, key=None)
Source code
def peek(self, key = None):
    if key == None:
        while self.size:
            if self.heap[0][-1] is not self.REMOVED:
                return self.heap[0][-2]
            else:
                heapq.heappop(self.heap)
        raise KeyError('peek at an empty priority queue')
    try:
        return self.entry_finder[key][-2]
    except KeyError:
        return None
def pop(self, key=None)

Remove and return the lowest priority task. Raise KeyError if empty.

Source code
def pop(self, key = None):
    '''
    Remove and return the lowest priority task. Raise KeyError if empty.
    '''
    if key == None:
        while self.size:
            entry = heapq.heappop(self.heap)
            if entry[-1] is not self.REMOVED:
                del self.entry_finder[entry[-1]]
                self.size -= 1
                return entry[-2]
        raise KeyError('pop from an empty priority queue')
    else:
        self.remove(key)
def push(self, key, priority=None, item=None)

Add to the heap or update the priority of an existing task.

Source code
def push(self, key, priority = None, item = None):
    '''
    Add to the heap or update the priority of an existing task.
    '''
    if priority == None:
        priority = key
    if key in self.entry_finder:
        self.remove(key)
    if item is None:
        item = key
    count = next(self.counter)
    entry = [priority, count, item, key]
    self.entry_finder[key] = entry
    self.size += 1
    heapq.heappush(self.heap, entry)
def remove(self, key)

Mark an existing task as REMOVED. Raise KeyError if not found.

Source code
def remove(self, key):
    '''
    Mark an existing task as REMOVED.  Raise KeyError if not found.
    '''
    entry = self.entry_finder.pop(key)
    entry[-1] = self.REMOVED
    self.size -= 1
class Queue

A queue data structure built on top of a linked list attributes: items: A list that holds objects in the queue type: LinkedList methods: init(self): constructor of the class isEmpty(self): returns True if the queue instance is empty push(self,item): inserts item to the queue pop(self,item): removes first item in the queue if no item is specified removes the given item if item is specified size(self): returns the size of the queue

Source code
class Queue(object):
    '''
    A queue data structure built on top of a linked list
    attributes:
        items:    A list that holds objects in the queue
                  type: LinkedList
    methods:
        __init__(self):        constructor of the class
        isEmpty(self):         returns True if the queue instance is empty
        push(self,item):       inserts item to the queue
        pop(self,item):        removes first item in the queue if no item is
                               specified removes the given item if item is
                               specified
        size(self):            returns the size of the queue
    '''
    def __init__(self):
        self.items = LinkedList()

    def isEmpty(self):
        return len(self.items) == 0

    def enqueue(self, item):
        self.items.insert(0,item)

    def push(self, item):
        self.enqueue(item)

    def dequeue(self, item = None):
        if item == None:
            return self.items.pop()
        else:
            self.items.remove(item)
            return item

    def remove(self, item = None):
        self.dequeue(item)

    def pop(self, item = None):
        return self.dequeue(item)

    def peek(self, item = None):
        if item == None:
            return self.items[len(self.items)-1]
        else:
            for i in self.items:
                if i == item:
                    return i
        return None

    def size(self):
        return len(self.items)

Methods

def __init__(self)

Initialize self. See help(type(self)) for accurate signature.

Source code
def __init__(self):
    self.items = LinkedList()
def dequeue(self, item=None)
Source code
def dequeue(self, item = None):
    if item == None:
        return self.items.pop()
    else:
        self.items.remove(item)
        return item
def enqueue(self, item)
Source code
def enqueue(self, item):
    self.items.insert(0,item)
def isEmpty(self)
Source code
def isEmpty(self):
    return len(self.items) == 0
def peek(self, item=None)
Source code
def peek(self, item = None):
    if item == None:
        return self.items[len(self.items)-1]
    else:
        for i in self.items:
            if i == item:
                return i
    return None
def pop(self, item=None)
Source code
def pop(self, item = None):
    return self.dequeue(item)
def push(self, item)
Source code
def push(self, item):
    self.enqueue(item)
def remove(self, item=None)
Source code
def remove(self, item = None):
    self.dequeue(item)
def size(self)
Source code
def size(self):
    return len(self.items)