/* * Copyright (C) 2017 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); you * may not use this file except in compliance with the License. You may * obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or * implied. See the License for the specific language governing * permissions and limitations under the License. */ package com.android.vts.util; import com.android.vts.entity.ProfilingPointSummaryEntity; import com.android.vts.proto.VtsReportMessage.VtsProfilingRegressionMode; import java.util.ArrayList; import java.util.HashMap; import java.util.Iterator; import java.util.List; import java.util.Map; /** Represents statistical summaries of each profiling point. */ public class ProfilingPointSummary implements Iterable { private List statSummaries; private Map labelIndices; private List labels; private VtsProfilingRegressionMode regressionMode; public String xLabel; public String yLabel; /** Initializes the summary with empty arrays. */ public ProfilingPointSummary( String xLabel, String yLabel, VtsProfilingRegressionMode regressionMode) { statSummaries = new ArrayList<>(); labelIndices = new HashMap<>(); labels = new ArrayList<>(); this.regressionMode = regressionMode; this.xLabel = xLabel; this.yLabel = yLabel; } /** * Determines if a data label is present in the profiling point. * * @param label The name of the label. * @return true if the label is present, false otherwise. */ public boolean hasLabel(String label) { return labelIndices.containsKey(label); } /** * Gets the statistical summary for a specified data label. * * @param label The name of the label. * @return The StatSummary object if it exists, or null otherwise. */ public StatSummary getStatSummary(String label) { if (!hasLabel(label)) return null; return statSummaries.get(labelIndices.get(label)); } /** * Gets the last-seen regression mode. * * @return The VtsProfilingRegressionMode value. */ public VtsProfilingRegressionMode getRegressionMode() { return regressionMode; } /** * Updates the profiling summary with the data from a new profiling report. * * @param ppSummary The profiling point run entity object containing profiling data. */ public void update(ProfilingPointSummaryEntity ppSummary) { for (String label : ppSummary.getLabels()) { if (!ppSummary.getLabelStats().containsKey(label)) continue; if (!labelIndices.containsKey(label)) { labelIndices.put(label, statSummaries.size()); labels.add(label); statSummaries.add(ppSummary.getLabelStats().get(label)); } else { StatSummary summary = getStatSummary(label); summary.merge(ppSummary.getLabelStats().get(label)); } } } /** * Updates the profiling summary at a label with the data from a new profiling report. * *

Updates the summary specified by the label with all values provided in the report. If * labels are provided in the report, they will be ignored -- all values are updated only to the * provided label. * * @param ppSummary The ProfilingPointSummaryEntity object containing profiling data. * @param label The String label for which all values in the report will be updated. */ public void updateLabel(ProfilingPointSummaryEntity ppSummary, String label) { if (!labelIndices.containsKey(label)) { labelIndices.put(label, labels.size()); labels.add(label); StatSummary stat = new StatSummary( label, ppSummary.getGlobalStats().getMin(), ppSummary.getGlobalStats().getMax(), ppSummary.getGlobalStats().getMean(), ppSummary.getGlobalStats().getSumSq(), ppSummary.getGlobalStats().getCount(), ppSummary.getGlobalStats().getRegressionMode()); statSummaries.add(stat); } else { StatSummary summary = getStatSummary(label); summary.merge(ppSummary.getGlobalStats()); } } /** * Gets an iterator that returns stat summaries in the ordered the labels were specified in the * ProfilingReportMessage objects. */ @Override public Iterator iterator() { Iterator it = new Iterator() { private int currentIndex = 0; @Override public boolean hasNext() { return labels != null && currentIndex < labels.size(); } @Override public StatSummary next() { String label = labels.get(currentIndex++); return statSummaries.get(labelIndices.get(label)); } @Override public void remove() { // Not supported throw new UnsupportedOperationException(); } }; return it; } }