| #!/usr/bin/python |
| |
| # Copyright 2011 Google Inc. All Rights Reserved. |
| |
| import math |
| |
| |
| class Column(object): |
| def __init__(self, name): |
| self.name = name |
| |
| def _ContainsString(self, results): |
| for result in results: |
| if isinstance(result, str): |
| return True |
| return False |
| |
| def _StripNone(self, results): |
| res = [] |
| for result in results: |
| if result is not None: |
| res.append(result) |
| return res |
| |
| |
| class MinColumn(Column): |
| def Compute(self, results, baseline_results): |
| if self._ContainsString(results): |
| return "-" |
| results = self._StripNone(results) |
| if not results: |
| return "-" |
| return min(results) |
| |
| |
| class MaxColumn(Column): |
| def Compute(self, results, baseline_results): |
| if self._ContainsString(results): |
| return "-" |
| results = self._StripNone(results) |
| if not results: |
| return "-" |
| return max(results) |
| |
| |
| class MeanColumn(Column): |
| def Compute(self, results, baseline_results): |
| all_pass = True |
| all_fail = True |
| if self._ContainsString(results): |
| for result in results: |
| if result != "PASSED": |
| all_pass = False |
| if result != "FAILED": |
| all_fail = False |
| |
| if all_pass: |
| return "ALL PASS" |
| elif all_fail: |
| return "ALL FAIL" |
| else: |
| return "-" |
| |
| results = self._StripNone(results) |
| if not results: |
| return "-" |
| return float(sum(results)) / len(results) |
| |
| |
| class StandardDeviationColumn(Column): |
| def __init__(self, name): |
| super(StandardDeviationColumn, self).__init__(name) |
| |
| def Compute(self, results, baseline_results): |
| if self._ContainsString(results): |
| return "-" |
| |
| results = self._StripNone(results) |
| if not results: |
| return "-" |
| n = len(results) |
| average = sum(results) / n |
| total = 0 |
| for result in results: |
| total += (result - average) ** 2 |
| |
| return math.sqrt(total / n) |
| |
| |
| class RatioColumn(Column): |
| def __init__(self, name): |
| super(RatioColumn, self).__init__(name) |
| |
| def Compute(self, results, baseline_results): |
| if self._ContainsString(results) or self._ContainsString(baseline_results): |
| return "-" |
| |
| results = self._StripNone(results) |
| baseline_results = self._StripNone(baseline_results) |
| if not results or not baseline_results: |
| return "-" |
| result_mean = sum(results) / len(results) |
| baseline_mean = sum(baseline_results) / len(baseline_results) |
| |
| if not baseline_mean: |
| return "-" |
| |
| return result_mean / baseline_mean |
| |
| |
| class DeltaColumn(Column): |
| def __init__(self, name): |
| super(DeltaColumn, self).__init__(name) |
| |
| def Compute(self, results, baseline_results): |
| if self._ContainsString(results) or self._ContainsString(baseline_results): |
| return "-" |
| |
| results = self._StripNone(results) |
| baseline_results = self._StripNone(baseline_results) |
| if not results or not baseline_results: |
| return "-" |
| result_mean = sum(results) / len(results) |
| baseline_mean = sum(baseline_results) / len(baseline_results) |
| |
| if not baseline_mean: |
| return "-" |
| |
| res = 100 * (result_mean - baseline_mean) / baseline_mean |
| return res |
| |
| |
| class IterationsCompleteColumn(Column): |
| def __init__(self, name): |
| super(IterationsCompleteColumn, self).__init__(name) |
| |
| def Compute(self, results, baseline_results): |
| return len(self._StripNone(results)) |
| |
| |
| class IterationColumn(Column): |
| def __init__(self, name, iteration): |
| super(IterationColumn, self).__init__(name) |
| self.iteration = iteration |
| |
| def Compute(self, results, baseline_results): |
| if self.iteration > len(results): |
| return "" |
| res = results[self.iteration - 1] |
| if not res: |
| return "-" |
| return res |