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 3# found in the LICENSE file. 4 5import numbers 6 7from telemetry import value as value_module 8 9def _Mean(values): 10 return float(sum(values)) / len(values) if len(values) > 0 else 0.0 11 12class ListOfScalarValues(value_module.Value): 13 def __init__(self, page, name, units, values, 14 important=True, same_page_merge_policy=value_module.CONCATENATE): 15 super(ListOfScalarValues, self).__init__(page, name, units, important) 16 assert len(values) > 0 17 assert isinstance(values, list) 18 for v in values: 19 assert isinstance(v, numbers.Number) 20 self.values = values 21 self.same_page_merge_policy = same_page_merge_policy 22 23 def __repr__(self): 24 if self.page: 25 page_name = self.page.url 26 else: 27 page_name = None 28 if self.same_page_merge_policy == value_module.CONCATENATE: 29 merge_policy = 'CONCATENATE' 30 else: 31 merge_policy = 'PICK_FIRST' 32 return ('ListOfScalarValues(%s, %s, %s, %s, ' + 33 'important=%s, same_page_merge_policy=%s)') % ( 34 page_name, 35 self.name, self.units, 36 repr(self.values), 37 self.important, 38 merge_policy) 39 40 def GetBuildbotDataType(self, output_context): 41 if self._IsImportantGivenOutputIntent(output_context): 42 return 'default' 43 return 'unimportant' 44 45 def GetBuildbotValue(self): 46 return self.values 47 48 def GetRepresentativeNumber(self): 49 return _Mean(self.values) 50 51 def GetRepresentativeString(self): 52 return repr(self.values) 53 54 def IsMergableWith(self, that): 55 return (super(ListOfScalarValues, self).IsMergableWith(that) and 56 self.same_page_merge_policy == that.same_page_merge_policy) 57 58 @classmethod 59 def MergeLikeValuesFromSamePage(cls, values): 60 assert len(values) > 0 61 v0 = values[0] 62 63 if v0.same_page_merge_policy == value_module.PICK_FIRST: 64 return ListOfScalarValues( 65 v0.page, v0.name, v0.units, 66 values[0].values, 67 important=v0.important, 68 same_page_merge_policy=v0.same_page_merge_policy) 69 70 assert v0.same_page_merge_policy == value_module.CONCATENATE 71 all_values = [] 72 for v in values: 73 all_values.extend(v.values) 74 return ListOfScalarValues( 75 v0.page, v0.name, v0.units, 76 all_values, 77 important=v0.important, 78 same_page_merge_policy=v0.same_page_merge_policy) 79 80 @classmethod 81 def MergeLikeValuesFromDifferentPages(cls, values, 82 group_by_name_suffix=False): 83 assert len(values) > 0 84 v0 = values[0] 85 all_values = [] 86 for v in values: 87 all_values.extend(v.values) 88 if not group_by_name_suffix: 89 name = v0.name 90 else: 91 name = v0.name_suffix 92 return ListOfScalarValues( 93 None, name, v0.units, 94 all_values, 95 important=v0.important, 96 same_page_merge_policy=v0.same_page_merge_policy) 97