| 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 |