From 9b661d80dd38ae32da77d7b95adc64247576f351 Mon Sep 17 00:00:00 2001 From: articuno12 Date: Thu, 23 Mar 2017 12:25:28 +0530 Subject: [PATCH 1/5] Added test for FIFOQueue --- tests/test_utils.py | 49 ++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 48 insertions(+), 1 deletion(-) diff --git a/tests/test_utils.py b/tests/test_utils.py index 76e0421b3..f03ee8568 100644 --- a/tests/test_utils.py +++ b/tests/test_utils.py @@ -1,6 +1,6 @@ import pytest from utils import * # noqa - +import random def test_removeall_list(): assert removeall(4, []) == [] @@ -177,6 +177,53 @@ def test_expr(): assert (expr('GP(x, z) <== P(x, y) & P(y, z)') == Expr('<==', GP(x, z), P(x, y) & P(y, z))) +def test_FIFOQueue() : + # Create an object + queue = FIFOQueue() + # Genrate an array of number to be used for testing + test_data = [ random.choice(range(100)) for i in range(100) ] + # Index of the element to be added into the queue + front_head = 0 + # Index of the element to be removed from the queue + back_head = 0 + while front_head < 100 or back_head < 100 : + if front_head == 100 : # only possible to remove + # check for pop and append method + assert queue.pop() == test_data[back_head] + back_head += 1 + elif back_head == front_head : # only possible to push element into queue + queue.append(test_data[front_head]) + front_head += 1 + # else do it in a random manner + elif random.random() < 0.5 : + assert queue.pop() == test_data[back_head] + back_head += 1 + else : + queue.append(test_data[front_head]) + front_head += 1 + # check for __len__ method + assert len(queue) == front_head - back_head + # chek for __contains__ method + if front_head - back_head > 0 : + assert random.choice(test_data[back_head:front_head]) in queue + + # check extend method + test_data1 = [ random.choice(range(100)) for i in range(50) ] + test_data2 = [ random.choice(range(100)) for i in range(50) ] + # append elements of test data 1 + queue.extend(test_data1) + # append elements of test data 2 + queue.extend(test_data2) + # reset front_head + front_head = 0 + + while front_head < 50 : + assert test_data1[front_head] == queue.pop() + front_head += 1 + + while front_head < 100 : + assert test_data2[front_head - 50] == queue.pop() + front_head += 1 if __name__ == '__main__': pytest.main() From d59d938c03c40197ee9ca0e6ad894a5eb0f42b88 Mon Sep 17 00:00:00 2001 From: articuno12 Date: Thu, 23 Mar 2017 12:32:19 +0530 Subject: [PATCH 2/5] Updated FIFOQueue --- utils.py | 43 ++++++++++++++++++++++++++----------------- 1 file changed, 26 insertions(+), 17 deletions(-) diff --git a/utils.py b/utils.py index 73dd63d63..5a3d26ff5 100644 --- a/utils.py +++ b/utils.py @@ -8,6 +8,7 @@ import os.path import random import math +import queue # ______________________________________________________________________________ # Functions on Sequences and Iterables @@ -59,7 +60,7 @@ def is_in(elt, seq): """Similar to (elt in seq), but compares with 'is', not '=='.""" return any(x is elt for x in seq) -def mode(data): +def mode(data): """Return the most common data item. If there are ties, return any one of them.""" [(item, count)] = collections.Counter(data).most_common(1) return item @@ -514,7 +515,7 @@ def __missing__(self, key): # ______________________________________________________________________________ # Queues: Stack, FIFOQueue, PriorityQueue -# TODO: Possibly use queue.Queue, queue.PriorityQueue +# TODO: queue.PriorityQueue # TODO: Priority queues may not belong here -- see treatment in search.py @@ -545,34 +546,42 @@ def Stack(): """Return an empty list, suitable as a Last-In-First-Out Queue.""" return [] - class FIFOQueue(Queue): """A First-In-First-Out Queue.""" def __init__(self): - self.A = [] - self.start = 0 + self.queue = queue.Queue() def append(self, item): - self.A.append(item) + # Add an element to the back of the queue + if not self.queue.full() : + self.queue.put(item) + else : + raise Exception('FIFOQueue is full') def __len__(self): - return len(self.A) - self.start - - def extend(self, items): - self.A.extend(items) + # returns the total number of elements currently present in the queue + return self.queue.qsize() def pop(self): - e = self.A[self.start] - self.start += 1 - if self.start > 5 and self.start > len(self.A) / 2: - self.A = self.A[self.start:] - self.start = 0 - return e + # return the element at the front of the queue + if not self.queue.empty() : + return self.queue.get() + else : + raise Exception('FIFOQueue is empty') def __contains__(self, item): - return item in self.A[self.start:] + # Checks if the given element is in the queue or not + # returns bool as result + ispresent = False + for i in range(self.queue.qsize()) : + temp_item = self.queue.get() + if temp_item == item : + ispresent = True + self.queue.put(temp_item) + + return ispresent class PriorityQueue(Queue): From a6cd37750f78baee0c1afd22c4bc3ffbd7056041 Mon Sep 17 00:00:00 2001 From: articuno12 Date: Thu, 23 Mar 2017 21:44:07 +0530 Subject: [PATCH 3/5] Updated FIFOQueue --- tests/test_utils.py | 4 ++-- utils.py | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/tests/test_utils.py b/tests/test_utils.py index f03ee8568..f8d7035d3 100644 --- a/tests/test_utils.py +++ b/tests/test_utils.py @@ -180,9 +180,9 @@ def test_expr(): def test_FIFOQueue() : # Create an object queue = FIFOQueue() - # Genrate an array of number to be used for testing + # Generate an array of number to be used for testing test_data = [ random.choice(range(100)) for i in range(100) ] - # Index of the element to be added into the queue + # Index of the element to be added in the queue front_head = 0 # Index of the element to be removed from the queue back_head = 0 diff --git a/utils.py b/utils.py index 5a3d26ff5..3add1d6ce 100644 --- a/utils.py +++ b/utils.py @@ -550,8 +550,8 @@ class FIFOQueue(Queue): """A First-In-First-Out Queue.""" - def __init__(self): - self.queue = queue.Queue() + def __init__(self,maxsize=0): + self.queue = queue.Queue(maxsize) def append(self, item): # Add an element to the back of the queue From 8ae6721d7aab92119be0220203c1d73442b3e946 Mon Sep 17 00:00:00 2001 From: Kritika Date: Sat, 25 Mar 2017 13:09:53 +0530 Subject: [PATCH 4/5] FIFOQueue using deque --- utils.py | 38 +++++++++++++++----------------------- 1 file changed, 15 insertions(+), 23 deletions(-) diff --git a/utils.py b/utils.py index 3add1d6ce..3f05fb059 100644 --- a/utils.py +++ b/utils.py @@ -8,7 +8,6 @@ import os.path import random import math -import queue # ______________________________________________________________________________ # Functions on Sequences and Iterables @@ -550,39 +549,32 @@ class FIFOQueue(Queue): """A First-In-First-Out Queue.""" - def __init__(self,maxsize=0): - self.queue = queue.Queue(maxsize) + def __init__(self, maxlen=None, items=[]): + self.queue = collections.deque(items,maxlen) def append(self, item): - # Add an element to the back of the queue - if not self.queue.full() : - self.queue.put(item) + if not self.queue.maxlen or len(self.queue) < self.queue.maxlen : + self.queue.append(item) else : raise Exception('FIFOQueue is full') - def __len__(self): - # returns the total number of elements currently present in the queue - return self.queue.qsize() + def extend(self, items): + if not self.queue.maxlen or len(self.queue) + len(items) <= self.queue.maxlen : + self.queue.extend(items) + else : + raise Exception('FIFOQueue max length exceeded') def pop(self): - # return the element at the front of the queue - if not self.queue.empty() : - return self.queue.get() + if len(self.queue) > 0 : + return self.queue.popleft() else : raise Exception('FIFOQueue is empty') - def __contains__(self, item): - # Checks if the given element is in the queue or not - # returns bool as result - ispresent = False - for i in range(self.queue.qsize()) : - temp_item = self.queue.get() - if temp_item == item : - ispresent = True - self.queue.put(temp_item) - - return ispresent + def __len__(self): + return len(self.queue) + def __contains__(self, item): + return item in self.queue class PriorityQueue(Queue): From fa775df49b14a3a14342d4fc070ed6dfbc19d1d9 Mon Sep 17 00:00:00 2001 From: Kritika Date: Sat, 25 Mar 2017 14:23:51 +0530 Subject: [PATCH 5/5] fixed flake8 warnings --- utils.py | 16 +++++++++------- 1 file changed, 9 insertions(+), 7 deletions(-) diff --git a/utils.py b/utils.py index c2f055e77..5cd18a632 100644 --- a/utils.py +++ b/utils.py @@ -58,7 +58,7 @@ def is_in(elt, seq): """Similar to (elt in seq), but compares with 'is', not '=='.""" return any(x is elt for x in seq) - + def mode(data): """Return the most common data item. If there are ties, return any one of them.""" [(item, count)] = collections.Counter(data).most_common(1) @@ -602,27 +602,28 @@ def Stack(): """Return an empty list, suitable as a Last-In-First-Out Queue.""" return [] + class FIFOQueue(Queue): """A First-In-First-Out Queue.""" def __init__(self, maxlen=None, items=[]): - self.queue = collections.deque(items,maxlen) + self.queue = collections.deque(items, maxlen) def append(self, item): - if not self.queue.maxlen or len(self.queue) < self.queue.maxlen : + if not self.queue.maxlen or len(self.queue) < self.queue.maxlen: self.queue.append(item) - else : + else: raise Exception('FIFOQueue is full') def extend(self, items): - if not self.queue.maxlen or len(self.queue) + len(items) <= self.queue.maxlen : + if not self.queue.maxlen or len(self.queue) + len(items) <= self.queue.maxlen: self.queue.extend(items) - else : + else: raise Exception('FIFOQueue max length exceeded') def pop(self): - if len(self.queue) > 0 : + if len(self.queue) > 0: return self.queue.popleft() else : raise Exception('FIFOQueue is empty') @@ -633,6 +634,7 @@ def __len__(self): def __contains__(self, item): return item in self.queue + class PriorityQueue(Queue): """A queue in which the minimum (or maximum) element (as determined by f and