def _check_threshold(key: metric_types.MetricKey, metric: Any) -> bool:
     """Verify a metric given its metric key and metric value."""
     threshold = thresholds[key]
     if isinstance(threshold, config.GenericValueThreshold):
         lower_bound, upper_bound = -np.inf, np.inf
         if threshold.HasField('lower_bound'):
             lower_bound = threshold.lower_bound.value
         if threshold.HasField('upper_bound'):
             upper_bound = threshold.upper_bound.value
         return metric > lower_bound and metric < upper_bound
     elif isinstance(threshold, config.GenericChangeThreshold):
         diff = metric
         ratio = diff / metrics[key.make_baseline_key(baseline_model_name)]
         if threshold.direction == config.MetricDirection.LOWER_IS_BETTER:
             absolute, relative = np.inf, np.inf
         elif threshold.direction == config.MetricDirection.HIGHER_IS_BETTER:
             absolute, relative = -np.inf, -np.inf
         else:
             raise ValueError('"UNKNOWN" direction for change threshold.')
         if threshold.HasField('absolute'):
             absolute = threshold.absolute.value
         if threshold.HasField('relative'):
             relative = threshold.relative.value
         if threshold.direction == config.MetricDirection.LOWER_IS_BETTER:
             return diff < absolute and ratio < relative
         elif threshold.direction == config.MetricDirection.HIGHER_IS_BETTER:
             return diff > absolute and ratio > relative
    def _check_threshold(key: metric_types.MetricKey,
                         slicing_spec: Optional[config.SlicingSpec],
                         threshold: _ThresholdType, metric: Any) -> bool:
        """Verify a metric given its metric key and metric value."""
        if (slicing_spec is not None and not slicer.SingleSliceSpec(
                spec=slicing_spec).is_slice_applicable(sliced_key)):
            return True

        if isinstance(threshold, config.GenericValueThreshold):
            lower_bound, upper_bound = -np.inf, np.inf
            if threshold.HasField('lower_bound'):
                lower_bound = threshold.lower_bound.value
            if threshold.HasField('upper_bound'):
                upper_bound = threshold.upper_bound.value
            return metric > lower_bound and metric < upper_bound
        elif isinstance(threshold, config.GenericChangeThreshold):
            diff = metric
            ratio = diff / metrics[key.make_baseline_key(baseline_model_name)]
            if threshold.direction == config.MetricDirection.LOWER_IS_BETTER:
                absolute, relative = np.inf, np.inf
            elif threshold.direction == config.MetricDirection.HIGHER_IS_BETTER:
                absolute, relative = -np.inf, -np.inf
            else:
                raise ValueError('"UNKNOWN" direction for change threshold.')
            if threshold.HasField('absolute'):
                absolute = threshold.absolute.value
            if threshold.HasField('relative'):
                relative = threshold.relative.value
            if threshold.direction == config.MetricDirection.LOWER_IS_BETTER:
                return diff < absolute and ratio < relative
            elif threshold.direction == config.MetricDirection.HIGHER_IS_BETTER:
                return diff > absolute and ratio > relative
 def _check_threshold(key: metric_types.MetricKey,
                      threshold: _ThresholdType, metric: Any) -> bool:
     """Verify a metric given its metric key and metric value."""
     metric = float(metric)
     if isinstance(threshold, config.GenericValueThreshold):
         lower_bound, upper_bound = -np.inf, np.inf
         if threshold.HasField('lower_bound'):
             lower_bound = threshold.lower_bound.value
         if threshold.HasField('upper_bound'):
             upper_bound = threshold.upper_bound.value
         return metric >= lower_bound and metric <= upper_bound
     elif isinstance(threshold, config.GenericChangeThreshold):
         diff = metric
         metric_baseline = float(
             metrics[key.make_baseline_key(baseline_model_name)])
         ratio = diff / metric_baseline
         if threshold.direction == config.MetricDirection.LOWER_IS_BETTER:
             absolute, relative = np.inf, np.inf
         elif threshold.direction == config.MetricDirection.HIGHER_IS_BETTER:
             absolute, relative = -np.inf, -np.inf
         else:
             raise ValueError(
                 '"UNKNOWN" direction for change threshold: {}.'.format(
                     threshold))
         if threshold.HasField('absolute'):
             absolute = threshold.absolute.value
         if threshold.HasField('relative'):
             relative = threshold.relative.value
         if threshold.direction == config.MetricDirection.LOWER_IS_BETTER:
             return diff <= absolute and ratio <= relative
         elif threshold.direction == config.MetricDirection.HIGHER_IS_BETTER:
             return diff >= absolute and ratio >= relative
     else:
         raise ValueError('Unknown threshold: {}'.format(threshold))
Esempio n. 4
0
 def add_threshold(key: metric_types.MetricKey,
                   slice_spec: Optional[config.SlicingSpec],
                   threshold: config.MetricThreshold):
     """Adds thresholds to results."""
     if threshold.HasField('value_threshold'):
         add_if_not_exists(key, slice_spec, threshold.value_threshold)
     if threshold.HasField('change_threshold'):
         key = key.make_diff_key()
         add_if_not_exists(key, slice_spec, threshold.change_threshold)