+ self.binary_search(rate, b_max, traffic_type, True, True)
+
+ def combined_search(self, start_rate, traffic_type):
+ """Combined search of rate with loss below acceptance criteria.
+
+ :param start_rate: Initial rate.
+ :param traffic_type: Traffic profile.
+ :type start_rate: float
+ :type traffic_type: str
+ :returns: nothing
+ :raises RuntimeError: If linear search failed.
+ """
+
+ self.linear_search(start_rate, traffic_type)
+
+ if self._search_result in [SearchResults.SUCCESS,
+ SearchResults.SUSPICIOUS]:
+ b_min = self._search_result_rate
+ b_max = self._search_result_rate + self._rate_linear_step
+
+ # we found max rate by linear search
+ if self.floats_are_close_equal(float(b_min), self._rate_max):
+ return
+
+ # limiting binary range max value into max range
+ if float(b_max) > self._rate_max:
+ b_max = self._rate_max
+
+ # reset result rate
+ temp_rate = self._search_result_rate
+ 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, True)
+
+ # linear and binary search succeed
+ if self._search_result == SearchResults.SUCCESS:
+ return
+ # linear search succeed but binary failed or suspicious
+ else:
+ self._search_result = SearchResults.SUSPICIOUS
+ self._search_result_rate = temp_rate