aboutsummaryrefslogtreecommitdiff
path: root/crosperf/results_columns.py
blob: 09e97d0b36e45587023495e8e2f75bb39980041d (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
#!/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