OLD | NEW |
1 # Copyright 2013 The Chromium Authors. All rights reserved. | 1 # Copyright 2013 The Chromium Authors. All rights reserved. |
2 # Use of this source code is governed by a BSD-style license that can be | 2 # Use of this source code is governed by a BSD-style license that can be |
3 # found in the LICENSE file. | 3 # found in the LICENSE file. |
4 | 4 |
5 import numbers | 5 import numbers |
6 | 6 |
7 from telemetry import value as value_module | 7 from telemetry import value as value_module |
8 from telemetry.value import none_values | 8 from telemetry.value import none_values |
| 9 from telemetry.value import summarizable |
9 | 10 |
10 | 11 |
11 def _Mean(values): | 12 def _Mean(values): |
12 return float(sum(values)) / len(values) if len(values) > 0 else 0.0 | 13 return float(sum(values)) / len(values) if len(values) > 0 else 0.0 |
13 | 14 |
14 | 15 |
15 class ListOfScalarValues(value_module.Value): | 16 class ListOfScalarValues(summarizable.SummarizableValue): |
16 def __init__(self, page, name, units, values, | 17 def __init__(self, page, name, units, values, |
17 important=True, description=None, none_value_reason=None, | 18 important=True, description=None, none_value_reason=None, |
18 same_page_merge_policy=value_module.CONCATENATE): | 19 same_page_merge_policy=value_module.CONCATENATE, |
| 20 improvement_direction=None): |
19 super(ListOfScalarValues, self).__init__(page, name, units, important, | 21 super(ListOfScalarValues, self).__init__(page, name, units, important, |
20 description) | 22 description, improvement_direction) |
21 if values is not None: | 23 if values is not None: |
22 assert isinstance(values, list) | 24 assert isinstance(values, list) |
23 assert len(values) > 0 | 25 assert len(values) > 0 |
24 assert all(isinstance(v, numbers.Number) for v in values) | 26 assert all(isinstance(v, numbers.Number) for v in values) |
25 none_values.ValidateNoneValueReason(values, none_value_reason) | 27 none_values.ValidateNoneValueReason(values, none_value_reason) |
26 self.values = values | 28 self.values = values |
27 self.none_value_reason = none_value_reason | 29 self.none_value_reason = none_value_reason |
28 self.same_page_merge_policy = same_page_merge_policy | 30 self.same_page_merge_policy = same_page_merge_policy |
29 | 31 |
30 def __repr__(self): | 32 def __repr__(self): |
31 if self.page: | 33 if self.page: |
32 page_name = self.page.url | 34 page_name = self.page.url |
33 else: | 35 else: |
34 page_name = None | 36 page_name = None |
35 if self.same_page_merge_policy == value_module.CONCATENATE: | 37 if self.same_page_merge_policy == value_module.CONCATENATE: |
36 merge_policy = 'CONCATENATE' | 38 merge_policy = 'CONCATENATE' |
37 else: | 39 else: |
38 merge_policy = 'PICK_FIRST' | 40 merge_policy = 'PICK_FIRST' |
39 return ('ListOfScalarValues(%s, %s, %s, %s, ' | 41 return ('ListOfScalarValues(%s, %s, %s, %s, ' |
40 'important=%s, description=%s, same_page_merge_policy=%s)') % ( | 42 'important=%s, description=%s, same_page_merge_policy=%s, ' |
| 43 'improvement_direction=%s)') % ( |
41 page_name, | 44 page_name, |
42 self.name, | 45 self.name, |
43 self.units, | 46 self.units, |
44 repr(self.values), | 47 repr(self.values), |
45 self.important, | 48 self.important, |
46 self.description, | 49 self.description, |
47 merge_policy) | 50 merge_policy, |
| 51 self.improvement_direction) |
48 | 52 |
49 def GetBuildbotDataType(self, output_context): | 53 def GetBuildbotDataType(self, output_context): |
50 if self._IsImportantGivenOutputIntent(output_context): | 54 if self._IsImportantGivenOutputIntent(output_context): |
51 return 'default' | 55 return 'default' |
52 return 'unimportant' | 56 return 'unimportant' |
53 | 57 |
54 def GetBuildbotValue(self): | 58 def GetBuildbotValue(self): |
55 return self.values | 59 return self.values |
56 | 60 |
57 def GetRepresentativeNumber(self): | 61 def GetRepresentativeNumber(self): |
(...skipping 16 matching lines...) Expand all Loading... |
74 | 78 |
75 if self.none_value_reason is not None: | 79 if self.none_value_reason is not None: |
76 d['none_value_reason'] = self.none_value_reason | 80 d['none_value_reason'] = self.none_value_reason |
77 | 81 |
78 return d | 82 return d |
79 | 83 |
80 @staticmethod | 84 @staticmethod |
81 def FromDict(value_dict, page_dict): | 85 def FromDict(value_dict, page_dict): |
82 kwargs = value_module.Value.GetConstructorKwArgs(value_dict, page_dict) | 86 kwargs = value_module.Value.GetConstructorKwArgs(value_dict, page_dict) |
83 kwargs['values'] = value_dict['values'] | 87 kwargs['values'] = value_dict['values'] |
| 88 kwargs['improvement_direction'] = value_dict['improvement_direction'] |
84 | 89 |
85 if 'none_value_reason' in value_dict: | 90 if 'none_value_reason' in value_dict: |
86 kwargs['none_value_reason'] = value_dict['none_value_reason'] | 91 kwargs['none_value_reason'] = value_dict['none_value_reason'] |
87 | 92 |
88 return ListOfScalarValues(**kwargs) | 93 return ListOfScalarValues(**kwargs) |
89 | 94 |
90 @classmethod | 95 @classmethod |
91 def MergeLikeValuesFromSamePage(cls, values): | 96 def MergeLikeValuesFromSamePage(cls, values): |
92 assert len(values) > 0 | 97 assert len(values) > 0 |
93 v0 = values[0] | 98 v0 = values[0] |
94 | 99 |
95 if v0.same_page_merge_policy == value_module.PICK_FIRST: | 100 if v0.same_page_merge_policy == value_module.PICK_FIRST: |
96 return ListOfScalarValues( | 101 return ListOfScalarValues( |
97 v0.page, v0.name, v0.units, | 102 v0.page, v0.name, v0.units, |
98 values[0].values, | 103 values[0].values, |
99 important=v0.important, | 104 important=v0.important, |
100 same_page_merge_policy=v0.same_page_merge_policy, | 105 same_page_merge_policy=v0.same_page_merge_policy, |
101 none_value_reason=v0.none_value_reason) | 106 none_value_reason=v0.none_value_reason, |
| 107 improvement_direction=v0.improvement_direction) |
102 | 108 |
103 assert v0.same_page_merge_policy == value_module.CONCATENATE | 109 assert v0.same_page_merge_policy == value_module.CONCATENATE |
104 return cls._MergeLikeValues(values, v0.page, v0.name) | 110 return cls._MergeLikeValues(values, v0.page, v0.name) |
105 | 111 |
106 @classmethod | 112 @classmethod |
107 def MergeLikeValuesFromDifferentPages(cls, values, | 113 def MergeLikeValuesFromDifferentPages(cls, values, |
108 group_by_name_suffix=False): | 114 group_by_name_suffix=False): |
109 assert len(values) > 0 | 115 assert len(values) > 0 |
110 v0 = values[0] | 116 v0 = values[0] |
111 name = v0.name_suffix if group_by_name_suffix else v0.name | 117 name = v0.name_suffix if group_by_name_suffix else v0.name |
112 return cls._MergeLikeValues(values, None, name) | 118 return cls._MergeLikeValues(values, None, name) |
113 | 119 |
114 @classmethod | 120 @classmethod |
115 def _MergeLikeValues(cls, values, page, name): | 121 def _MergeLikeValues(cls, values, page, name): |
116 v0 = values[0] | 122 v0 = values[0] |
117 merged_values = [] | 123 merged_values = [] |
118 none_value_reason = None | 124 none_value_reason = None |
119 for v in values: | 125 for v in values: |
120 if v.values is None: | 126 if v.values is None: |
121 merged_values = None | 127 merged_values = None |
122 none_value_reason = none_values.MERGE_FAILURE_REASON | 128 none_value_reason = none_values.MERGE_FAILURE_REASON |
123 break | 129 break |
124 merged_values.extend(v.values) | 130 merged_values.extend(v.values) |
125 return ListOfScalarValues( | 131 return ListOfScalarValues( |
126 page, name, v0.units, | 132 page, name, v0.units, |
127 merged_values, | 133 merged_values, |
128 important=v0.important, | 134 important=v0.important, |
129 same_page_merge_policy=v0.same_page_merge_policy, | 135 same_page_merge_policy=v0.same_page_merge_policy, |
130 none_value_reason=none_value_reason) | 136 none_value_reason=none_value_reason, |
| 137 improvement_direction=v0.improvement_direction) |
OLD | NEW |