Index: tools/telemetry/telemetry/value/merge_values.py |
diff --git a/tools/telemetry/telemetry/value/merge_values.py b/tools/telemetry/telemetry/value/merge_values.py |
deleted file mode 100644 |
index ef6d0ab7a97a712c4a1857b31d37c4c88010c257..0000000000000000000000000000000000000000 |
--- a/tools/telemetry/telemetry/value/merge_values.py |
+++ /dev/null |
@@ -1,140 +0,0 @@ |
-# Copyright 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.value import failure |
-from telemetry.value import skip |
- |
- |
-# TODO(eakuefner): Get rid of this as part of crbug.com/525688 |
-def DefaultKeyFunc(value): |
- """Keys values in a standard way for grouping in merging and summary. |
- |
- Merging and summarization can be parameterized by a function that groups |
- values into equivalence classes. Any function that returns a comparable |
- object can be used as a key_func, but merge_values and summary both use this |
- function by default, to allow the default grouping to change as Telemtry does. |
- |
- Args: |
- value: A Telemetry Value instance |
- |
- Returns: |
- A comparable object used to group values. |
- """ |
- return value.name, value.tir_label |
- |
- |
-def MergeLikeValuesFromSamePage(all_values, key_func=DefaultKeyFunc): |
- """Merges values that measure the same thing on the same page. |
- |
- A page may end up being measured multiple times, meaning that we may end up |
- with something like this: |
- ScalarValue(page1, 'x', 1, 'foo') |
- ScalarValue(page2, 'x', 4, 'bar') |
- ScalarValue(page1, 'x', 2, 'foo') |
- ScalarValue(page2, 'x', 5, 'baz') |
- |
- This function will produce: |
- ListOfScalarValues(page1, 'x', [1, 2], 'foo') |
- ListOfScalarValues(page2, 'x', [4], 'bar') |
- ListOfScalarValues(page2, 'x', [5], 'baz') |
- |
- The workhorse of this code is Value.MergeLikeValuesFromSamePage. |
- |
- This requires (but assumes) that the values passed in with the same grouping |
- key pass the Value.IsMergableWith test. If this is not obeyed, the |
- results will be undefined. |
- """ |
- return _MergeLikeValuesCommon( |
- all_values, |
- lambda x: (x.page, key_func(x)), |
- lambda v0, merge_group: v0.MergeLikeValuesFromSamePage(merge_group)) |
- |
- |
-def MergeLikeValuesFromDifferentPages(all_values, key_func=DefaultKeyFunc): |
- """Merges values that measure the same thing on different pages. |
- |
- After using MergeLikeValuesFromSamePage, one still ends up with values from |
- different pages: |
- ScalarValue(page1, 'x', 1, 'foo') |
- ScalarValue(page1, 'y', 30, 'bar') |
- ScalarValue(page2, 'x', 2, 'foo') |
- ScalarValue(page2, 'y', 40, 'baz') |
- |
- This function will group values with the same name and tir_label together: |
- ListOfScalarValues(None, 'x', [1, 2], 'foo') |
- ListOfScalarValues(None, 'y', [30], 'bar') |
- ListOfScalarValues(None, 'y', [40], 'baz') |
- |
- The workhorse of this code is Value.MergeLikeValuesFromDifferentPages. |
- |
- Not all values that go into this function will come out: not every value can |
- be merged across pages. Values whose MergeLikeValuesFromDifferentPages returns |
- None will be omitted from the results. |
- |
- This requires (but assumes) that the values passed in with the same name pass |
- the Value.IsMergableWith test. If this is not obeyed, the results |
- will be undefined. |
- """ |
- return _MergeLikeValuesCommon( |
- all_values, |
- key_func, |
- lambda v0, merge_group: v0.MergeLikeValuesFromDifferentPages(merge_group)) |
- |
- |
-def _MergeLikeValuesCommon(all_values, key_func, merge_func): |
- """Groups all_values by key_func then applies merge_func to the groups. |
- |
- This takes the all_values list and groups each item in that using the key |
- provided by key_func. This produces groups of values with like keys. Thes are |
- then handed to the merge_func to produce a new key. If merge_func produces a |
- non-None return, it is added to the list of returned values. |
- """ |
- # When merging, we want to merge values in a consistent order, e.g. so that |
- # Scalar(1), Scalar(2) predictably produces ListOfScalarValues([1,2]) rather |
- # than 2,1. |
- # |
- # To do this, the values are sorted by key up front. Then, grouping is |
- # performed using a dictionary, but as new groups are found, the order in |
- # which they were found is also noted. |
- # |
- # Merging is then performed on groups in group-creation-order. This ensures |
- # that the returned array is in a stable order, group by group. |
- # |
- # Within a group, the order is stable because of the original sort. |
- all_values = list(all_values) |
- merge_groups = GroupStably(all_values, key_func) |
- |
- res = [] |
- for merge_group in merge_groups: |
- v0 = merge_group[0] |
- vM = merge_func(v0, merge_group) |
- if vM: |
- res.append(vM) |
- return res |
- |
-def GroupStably(all_values, key_func): |
- """Groups an array by key_func, with the groups returned in a stable order. |
- |
- Returns a list of groups. |
- """ |
- all_values = list(all_values) |
- |
- merge_groups = {} |
- merge_groups_in_creation_order = [] |
- for value in all_values: |
- # TODO(chrishenry): This is temporary. When we figure out the |
- # right summarization strategy for page runs with failures/skips, we |
- # should use that instead. |
- should_skip_value = (isinstance(value, failure.FailureValue) or |
- isinstance(value, skip.SkipValue)) |
- |
- if should_skip_value: |
- continue |
- |
- key = key_func(value) |
- if key not in merge_groups: |
- merge_groups[key] = [] |
- merge_groups_in_creation_order.append(merge_groups[key]) |
- merge_groups[key].append(value) |
- return merge_groups_in_creation_order |