From a5de671823a1c0863e401224efb49069fdf9b344 Mon Sep 17 00:00:00 2001 From: Anton Beloglazov Date: Thu, 30 Aug 2012 16:33:22 +1000 Subject: [PATCH] Added a deque contract --- neat/contracts_extra.py | 2 + .../overload/mhod/multisize_estimation.py | 32 +++++++ .../mhod/test_multisize_estimation.py | 84 +++++++++++++++++++ 3 files changed, 118 insertions(+) diff --git a/neat/contracts_extra.py b/neat/contracts_extra.py index ad39079..8511360 100644 --- a/neat/contracts_extra.py +++ b/neat/contracts_extra.py @@ -14,11 +14,13 @@ from contracts import new_contract +import collections import libvirt import sqlalchemy import neat.db +new_contract('deque', collections.deque) new_contract('function', lambda x: hasattr(x, '__call__')) new_contract('virConnect', libvirt.virConnect) new_contract('virDomain', libvirt.virDomain) diff --git a/neat/local/overload/mhod/multisize_estimation.py b/neat/local/overload/mhod/multisize_estimation.py index 54e6c51..66f565b 100644 --- a/neat/local/overload/mhod/multisize_estimation.py +++ b/neat/local/overload/mhod/multisize_estimation.py @@ -85,3 +85,35 @@ def estimate_probability(data, window_size, state): :rtype: float,>=0 """ return float(data.count(state)) / window_size + + +@contract +def update_request_windows(request_windows, max_window_size, previous_state, current_state): + """ Update and return the updated request windows. +(defn update-request-windows [request-windows max-window-size previous-state current-state] + {:pre [(vector? request-windows) + (posnum? max-window-size) + (not-negnum? previous-state) + (not-negnum? current-state)] + :post [(coll? %)]} + (let [window (get request-windows previous-state)] + (assoc request-windows previous-state + (conj (take (dec max-window-size) window) current-state)))) + + :param request_windows: The previous request windows. + :type request_windows: list(int) + + :param max_window_size: The maximum window size. + :type max_window_size: int + + :param previous_state: The previous state. + :type previous_state: int + + :param current_state: The current state. + :type current_state: int + + :return: The updated request windows. + :rtype: list(int) + """ + window = request_windows[previous_state] + request_windows[previous_state] diff --git a/tests/local/overload/mhod/test_multisize_estimation.py b/tests/local/overload/mhod/test_multisize_estimation.py index 7f5d843..9f3fc9b 100644 --- a/tests/local/overload/mhod/test_multisize_estimation.py +++ b/tests/local/overload/mhod/test_multisize_estimation.py @@ -15,6 +15,8 @@ from mocktest import * from pyqcy import * +from collections import deque + import neat.local.overload.mhod.multisize_estimation as m @@ -60,3 +62,85 @@ class Multisize(TestCase): m.estimate_probability([1, 1, 0, 0, 1, 1, 1, 1, 1, 1], 200, 0), 0.01) self.assertEqual( m.estimate_probability([1, 1, 0, 0, 1, 1, 1, 1, 1, 1], 200, 1), 0.04) + + def test_update_request_windows(self): + windows = [[0, 0], + [1, 1]] + + self.assertEqual(m.update_request_windows(windows, 4, 0, 0), [[0, 0, 0], + [1, 1]]) + self.assertEqual(m.update_request_windows(windows, 4, 0, 1), [[0, 0, 1], + [1, 1]]) + self.assertEqual(m.update_request_windows(windows, 4, 1, 0), [[0, 0], + [1, 1, 0]]) + self.assertEqual(m.update_request_windows(windows, 4, 1, 1), [[0, 0], + [1, 1, 1]]) + + self.assertEqual(m.update_request_windows(windows, 2, 0, 0), [[0, 0], + [1, 1]]) + self.assertEqual(m.update_request_windows(windows, 2, 0, 1), [[0, 1], + [1, 1]]) + self.assertEqual(m.update_request_windows(windows, 2, 1, 0), [[0, 0], + [1, 0]]) + self.assertEqual(m.update_request_windows(windows, 2, 1, 1), [[0, 0], + [1, 1]]) + + windows = [[0, 0], + [1, 1], + [2, 2]] + + self.assertEqual(m.update_request_windows(windows, 4, 0, 0), [[0, 0, 0], + [1, 1], + [2, 2]]) + self.assertEqual(m.update_request_windows(windows, 4, 0, 1), [[0, 0, 1], + [1, 1], + [2, 2]]) + self.assertEqual(m.update_request_windows(windows, 4, 0, 2), [[0, 0, 2], + [1, 1], + [2, 2]]) + self.assertEqual(m.update_request_windows(windows, 4, 1, 0), [[0, 0], + [1, 1, 0], + [2, 2]]) + self.assertEqual(m.update_request_windows(windows, 4, 1, 1), [[0, 0], + [1, 1, 1], + [2, 2]]) + self.assertEqual(m.update_request_windows(windows, 4, 1, 2), [[0, 0], + [1, 1, 2], + [2, 2]]) + self.assertEqual(m.update_request_windows(windows, 4, 2, 0), [[0, 0], + [1, 1], + [2, 2, 0]]) + self.assertEqual(m.update_request_windows(windows, 4, 2, 1), [[0, 0], + [1, 1], + [2, 2, 1]]) + self.assertEqual(m.update_request_windows(windows, 4, 2, 2), [[0, 0], + [1, 1], + [2, 2, 2]]) + + self.assertEqual(m.update_request_windows(windows, 2, 0, 0), [[0, 0], + [1, 1], + [2, 2]]) + self.assertEqual(m.update_request_windows(windows, 2, 0, 1), [[0, 1], + [1, 1], + [2, 2]]) + self.assertEqual(m.update_request_windows(windows, 2, 0, 2), [[0, 2], + [1, 1], + [2, 2]]) + self.assertEqual(m.update_request_windows(windows, 2, 1, 0), [[0, 0], + [1, 0], + [2, 2]]) + self.assertEqual(m.update_request_windows(windows, 2, 1, 1), [[0, 0], + [1, 1], + [2, 2]]) + self.assertEqual(m.update_request_windows(windows, 2, 1, 2), [[0, 0], + [1, 2], + [2, 2]]) + self.assertEqual(m.update_request_windows(windows, 2, 2, 0), [[0, 0], + [1, 1], + [2, 0]]) + self.assertEqual(m.update_request_windows(windows, 2, 2, 1), [[0, 0], + [1, 1], + [2, 1]]) + self.assertEqual(m.update_request_windows(windows, 2, 2, 2), [[0, 0], + [1, 1], + [2, 2]])