X-Git-Url: https://gerrit.fd.io/r/gitweb?p=csit.git;a=blobdiff_plain;f=resources%2Flibraries%2Fpython%2FDropRateSearch.py;h=8f8e371adde70faaad406f08ec938f34697acaee;hp=c25f34fcf695ec0dadfc67b03df28a06d3fbbf76;hb=3be854caa158bd5f150b6e0f50981ec2da73473a;hpb=1739f04bbed020135f2bbf0ffcedf961fc1b5474 diff --git a/resources/libraries/python/DropRateSearch.py b/resources/libraries/python/DropRateSearch.py index c25f34fcf6..8f8e371add 100644 --- a/resources/libraries/python/DropRateSearch.py +++ b/resources/libraries/python/DropRateSearch.py @@ -320,14 +320,13 @@ class DropRateSearch(object): else: raise ValueError("Unknown search result type") - def linear_search(self, start_rate, traffic_type): """Linear search of rate with loss below acceptance criteria. :param start_rate: Initial rate. :param traffic_type: Traffic profile. :type start_rate: float - :param traffic_type: str + :type traffic_type: str :return: nothing """ @@ -350,7 +349,7 @@ class DropRateSearch(object): res = self._get_res_based_on_search_type(res) if self._search_linear_direction == SearchDirection.BOTTOM_UP: - # loss occured and it was above acceptance criteria + # loss occurred and it was above acceptance criteria if not res: # if this is first run then we didn't find drop rate if prev_rate is None: @@ -381,7 +380,7 @@ class DropRateSearch(object): raise RuntimeError("Unknown search result") elif self._search_linear_direction == SearchDirection.TOP_DOWN: - # loss occured, decrease rate + # loss occurred, decrease rate if not res: prev_rate = rate rate -= self._rate_linear_step @@ -420,15 +419,17 @@ class DropRateSearch(object): SearchResults.SUSPICIOUS]: return self._search_result_rate - def binary_search(self, b_min, b_max, traffic_type): + def binary_search(self, b_min, b_max, traffic_type, skip_max_rate=False): """Binary search of rate with loss below acceptance criteria. :param b_min: Min range rate. :param b_max: Max range rate. :param traffic_type: Traffic profile. + :param skip_max_rate: Start with max rate first :type b_min: float :type b_max: float :type traffic_type: str + :type skip_max_rate: bool :return: nothing """ @@ -437,11 +438,15 @@ class DropRateSearch(object): if not self._rate_min <= float(b_max) <= self._rate_max: raise ValueError("Max rate is not in min,max range") if float(b_max) < float(b_min): - raise ValueError("Min rate is greater then max rate") + raise ValueError("Min rate is greater than max rate") # binary search - # rate is half of interval + start of interval - rate = ((float(b_max) - float(b_min)) / 2) + float(b_min) + if skip_max_rate: + # rate is half of interval + start of interval + rate = ((float(b_max) - float(b_min)) / 2) + float(b_min) + else: + # rate is max of interval + rate = float(b_max) # rate diff with previous run rate_diff = abs(self._last_binary_rate - rate) @@ -464,13 +469,13 @@ class DropRateSearch(object): res = self._get_res_based_on_search_type(res) - # loss occured and it was above acceptance criteria + # loss occurred and it was above acceptance criteria if not res: - self.binary_search(b_min, rate, traffic_type) + self.binary_search(b_min, rate, traffic_type, True) # there was no loss / loss below acceptance criteria else: self._search_result_rate = rate - self.binary_search(rate, b_max, traffic_type) + self.binary_search(rate, b_max, traffic_type, True) def combined_search(self, start_rate, traffic_type): """Combined search of rate with loss below acceptance criteria. @@ -502,7 +507,7 @@ class DropRateSearch(object): self._search_result_rate = None # we will use binary search to refine search in one linear step - self.binary_search(b_min, b_max, traffic_type) + self.binary_search(b_min, b_max, traffic_type, True) # linear and binary search succeed if self._search_result == SearchResults.SUCCESS: