+
+ def _ndrpdr_loss_fraction(self, state, ndr_lo, ndr_hi, pdr_lo, pdr_hi,
+ ndr_rel_width, pdr_rel_width):
+ """Perform loss_fraction-based trials within a ndrpdr phase
+
+ :param state: current state
+ :param ndr_lo: ndr interval measured low
+ :param ndr_hi: ndr interval measured high
+ :param pdr_lo: pdr interval measured low
+ :param pdr_hi: pdr interval measured high
+ :param ndr_rel_width: ndr interval relative width
+ :param pdr_rel_width: pdr interval relative width
+ :type state: ProgressState
+ :type ndr_lo: ReceiveRateMeasurement.ReceiveRateMeasurement
+ :type ndr_hi: ReceiveRateMeasurement.ReceiveRateMeasurement
+ :type pdr_lo: ReceiveRateMeasurement.ReceiveRateMeasurement
+ :type pdr_hi: ReceiveRateMeasurement.ReceiveRateMeasurement
+ :type ndr_rel_width: float
+ :type pdr_rel_width: float
+ :returns: a new transmit rate if one should be applied
+ :rtype: float
+ """
+ result = None
+ if ndr_lo.loss_fraction > 0.0:
+ if ndr_lo.target_tr > state.minimum_transmit_rate:
+ result = max(
+ state.minimum_transmit_rate,
+ self.expand_down(
+ ndr_rel_width, self.doublings, ndr_lo.target_tr))
+ logging.info("ndr lo external %s", result)
+ elif ndr_lo.duration < state.duration:
+ result = state.minimum_transmit_rate
+ logging.info("ndr lo minimal re-measure")
+
+ if result is None and pdr_lo.loss_fraction > state.packet_loss_ratio:
+ if pdr_lo.target_tr > state.minimum_transmit_rate:
+ result = max(
+ state.minimum_transmit_rate,
+ self.expand_down(
+ pdr_rel_width, self.doublings, pdr_lo.target_tr))
+ logging.info("pdr lo external %s", result)
+ elif pdr_lo.duration < state.duration:
+ result = state.minimum_transmit_rate
+ logging.info("pdr lo minimal re-measure")
+
+ if result is None and ndr_hi.loss_fraction <= 0.0:
+ if ndr_hi.target_tr < state.maximum_transmit_rate:
+ result = min(
+ state.maximum_transmit_rate,
+ self.expand_up(
+ ndr_rel_width, self.doublings, ndr_hi.target_tr))
+ logging.info("ndr hi external %s", result)
+ elif ndr_hi.duration < state.duration:
+ result = state.maximum_transmit_rate
+ logging.info("ndr hi maximal re-measure")
+
+ if result is None and pdr_hi.loss_fraction <= state.packet_loss_ratio:
+ if pdr_hi.target_tr < state.maximum_transmit_rate:
+ result = min(
+ state.maximum_transmit_rate,
+ self.expand_up(
+ pdr_rel_width, self.doublings, pdr_hi.target_tr))
+ logging.info("pdr hi external %s", result)
+ elif pdr_hi.duration < state.duration:
+ result = state.maximum_transmit_rate
+ logging.info("ndr hi maximal re-measure")
+ return result
+
+ def _ndrpdr_width_goal(self, state, ndr_lo, pdr_lo,
+ ndr_rel_width, pdr_rel_width):
+ """Perform width_goal-based trials within a ndrpdr phase
+
+ :param state: current state
+ :param ndr_lo: ndr interval measured low
+ :param pdr_lo: pdr interval measured low
+ :param ndr_rel_width: ndr interval relative width
+ :param pdr_rel_width: pdr interval relative width
+ :type state: ProgressState
+ :type ndr_lo: ReceiveRateMeasurement.ReceiveRateMeasurement
+ :type pdr_lo: ReceiveRateMeasurement.ReceiveRateMeasurement
+ :type ndr_rel_width: float
+ :type pdr_rel_width: float
+ :returns: a new transmit rate if one should be applied
+ :rtype: float
+ Return a new transmit rate if one should be applied.
+ """
+ if ndr_rel_width > state.width_goal:
+ # We have to narrow NDR width first, as NDR internal search
+ # can invalidate PDR (but not vice versa).
+ result = self.half_step_up(ndr_rel_width, ndr_lo.target_tr)
+ logging.info("Bisecting for NDR at %s", result)
+ elif pdr_rel_width > state.width_goal:
+ # PDR iternal search.
+ result = self.half_step_up(pdr_rel_width, pdr_lo.target_tr)
+ logging.info("Bisecting for PDR at %s", result)
+ else:
+ result = None
+ return result
+
+ @staticmethod
+ def _ndrpdr_duration(state, ndr_lo, pdr_lo, ndr_hi, pdr_hi,
+ ndr_rel_width, pdr_rel_width):
+ """Perform duration-based trials within a ndrpdr phase
+
+ :param state: current state
+ :param ndr_lo: ndr interval measured low
+ :param ndr_hi: ndr interval measured high
+ :param pdr_lo: pdr interval measured low
+ :param pdr_hi: pdr interval measured high
+ :param ndr_rel_width: ndr interval relative width
+ :param pdr_rel_width: pdr interval relative width
+ :type state: ProgressState
+ :type ndr_lo: ReceiveRateMeasurement.ReceiveRateMeasurement
+ :type ndr_hi: ReceiveRateMeasurement.ReceiveRateMeasurement
+ :type pdr_lo: ReceiveRateMeasurement.ReceiveRateMeasurement
+ :type pdr_hi: ReceiveRateMeasurement.ReceiveRateMeasurement
+ :type ndr_rel_width: float
+ :type pdr_rel_width: float
+ :returns: a new transmit rate if one should be applied
+ :rtype: float
+ """
+ # We need to re-measure with full duration, possibly
+ # creating invalid bounds to resolve (thus broadening width).
+ if ndr_lo.duration < state.duration:
+ result = ndr_lo.target_tr
+ logging.info("re-measuring NDR lower bound")
+ elif pdr_lo.duration < state.duration:
+ result = pdr_lo.target_tr
+ logging.info("re-measuring PDR lower bound")
+ # Except when lower bounds have high loss fraction, in that case
+ # we do not need to re-measure _upper_ bounds.
+ elif ndr_hi.duration < state.duration and ndr_rel_width > 0.0:
+ result = ndr_hi.target_tr
+ logging.info("re-measuring NDR upper bound")
+ elif pdr_hi.duration < state.duration and pdr_rel_width > 0.0:
+ result = pdr_hi.target_tr
+ logging.info("re-measuring PDR upper bound")
+ else:
+ result = None
+ return result