Index: tools/telemetry/telemetry/value/list_of_scalar_values.py |
diff --git a/tools/telemetry/telemetry/value/list_of_scalar_values.py b/tools/telemetry/telemetry/value/list_of_scalar_values.py |
new file mode 100644 |
index 0000000000000000000000000000000000000000..88020b2dac02b99268ffbb0f90a02a0c4fbf3091 |
--- /dev/null |
+++ b/tools/telemetry/telemetry/value/list_of_scalar_values.py |
@@ -0,0 +1,93 @@ |
+# Copyright (c) 2013 The Chromium Authors. All rights reserved. |
+# Use of this source code is governed by a BSD-style license that can be |
+# found in the LICENSE file. |
+from telemetry import value as value_module |
+ |
+def _Mean(values): |
+ return float(sum(values)) / len(values) if len(values) > 0 else 0.0 |
+ |
+class ListOfScalarValues(value_module.Value): |
+ def __init__(self, page, name, units, values, |
+ important=True, same_page_merge_policy=value_module.CONCATENATE): |
+ super(ListOfScalarValues, self).__init__(page, name, units, important) |
+ assert len(values) > 0 |
+ assert isinstance(values, list) |
+ for v in values: |
+ assert isinstance(v, int) or isinstance(v, float) |
+ self.values = values |
+ self.same_page_merge_policy = same_page_merge_policy |
+ |
+ def __repr__(self): |
+ if self.page: |
+ page_name = self.page.url |
+ else: |
+ page_name = None |
+ if self.same_page_merge_policy == value_module.CONCATENATE: |
+ merge_policy = 'CONCATENATE' |
+ else: |
+ merge_policy = 'PICK_FIRST' |
+ return ('ListOfScalarValues(%s, %s, %s, %s, ' + |
+ 'important=%s, same_page_merge_policy=%s)') % ( |
+ page_name, |
+ self.name, self.units, |
+ repr(self.values), |
+ self.important, |
+ merge_policy) |
+ |
+ def GetBuildbotDataType(self, output_context): |
+ if self._IsImportantGivenOutputIntent(output_context): |
+ return 'default' |
+ return 'unimportant' |
+ |
+ def GetBuildbotValue(self): |
+ return self.values |
+ |
+ def GetRepresentativeNumber(self): |
+ return _Mean(self.values) |
+ |
+ def GetRepresentativeString(self): |
+ return repr(self.values) |
+ |
+ def IsMergableWith(self, that): |
+ return (super(ListOfScalarValues, self).IsMergableWith(that) and |
+ self.same_page_merge_policy == that.same_page_merge_policy) |
+ |
+ @classmethod |
+ def MergeLikeValuesFromSamePage(cls, values): |
+ assert len(values) > 0 |
+ v0 = values[0] |
+ |
+ if v0.same_page_merge_policy == value_module.PICK_FIRST: |
+ return ListOfScalarValues( |
+ v0.page, v0.name, v0.units, |
+ values[0].values, |
+ important=v0.important, |
+ same_page_merge_policy=v0.same_page_merge_policy) |
+ |
+ assert v0.same_page_merge_policy == value_module.CONCATENATE |
+ all_values = [] |
+ for v in values: |
+ all_values.extend(v.values) |
+ return ListOfScalarValues( |
+ v0.page, v0.name, v0.units, |
+ all_values, |
+ important=v0.important, |
+ same_page_merge_policy=v0.same_page_merge_policy) |
+ |
+ @classmethod |
+ def MergeLikeValuesFromDifferentPages(cls, values, |
+ group_by_name_suffix=False): |
+ assert len(values) > 0 |
+ v0 = values[0] |
+ all_values = [] |
+ for v in values: |
+ all_values.extend(v.values) |
+ if not group_by_name_suffix: |
+ name = v0.name |
+ else: |
+ name = v0.name_suffix |
+ return ListOfScalarValues( |
+ None, name, v0.units, |
+ all_values, |
+ important=v0.important, |
+ same_page_merge_policy=v0.same_page_merge_policy) |