• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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