blob: b08615a58256d1feb04ecb7a695565905fe8d9eb [file] [log] [blame]
/*
* 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<StatSummary> {
private List<StatSummary> statSummaries;
private Map<String, Integer> labelIndices;
private List<String> 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.
*
* <p>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<StatSummary> iterator() {
Iterator<StatSummary> it =
new Iterator<StatSummary>() {
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;
}
}