blob: 3b4713c8a8daa36e8829b072be6bdce765a7d7ab [file] [log] [blame]
/*
* Copyright (c) 2016 Google Inc. All Rights Reserved.
*
* 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.proto.VtsReportMessage.VtsProfilingRegressionMode;
/** Helper object for storing statistics. */
public class StatSummary {
private String label;
private double min;
private double max;
private double mean;
private double sumSq;
private int n;
private VtsProfilingRegressionMode regression_mode;
/**
* Create a statistical summary.
*
* <p>Sets the label, min, max, mean, sum of squared error, n, and mode as provided.
*
* @param label The (String) label to assign to the summary.
* @param min The minimum observed value.
* @param max The maximum observed value.
* @param mean The average observed value.
* @param sumSq The sum of squared error.
* @param n The number of values observed.
* @param mode The VtsProfilingRegressionMode to use when analyzing performance.
*/
public StatSummary(
String label,
double min,
double max,
double mean,
double sumSq,
int n,
VtsProfilingRegressionMode mode) {
this.label = label;
this.min = min;
this.max = max;
this.mean = mean;
this.sumSq = sumSq;
this.n = n;
this.regression_mode = mode;
}
/**
* Initializes the statistical summary.
*
* <p>Sets the label as provided. Initializes the mean, variance, and n (number of values seen)
* to 0.
*
* @param label The (String) label to assign to the summary.
* @param mode The VtsProfilingRegressionMode to use when analyzing performance.
*/
public StatSummary(String label, VtsProfilingRegressionMode mode) {
this(label, Double.MAX_VALUE, Double.MIN_VALUE, 0, 0, 0, mode);
}
/**
* Update the mean and variance using Welford's single-pass method.
*
* @param value The observed value in the stream.
*/
public void updateStats(double value) {
n += 1;
double oldMean = mean;
mean = oldMean + (value - oldMean) / n;
sumSq = sumSq + (value - mean) * (value - oldMean);
if (value < min) min = value;
if (value > max) max = value;
}
/**
* Combine the mean and variance with another StatSummary.
*
* @param stat The StatSummary to combine with.
*/
public void merge(StatSummary stat) {
double delta = stat.getMean() - mean;
int newN = n + stat.getCount();
sumSq = sumSq + stat.getSumSq() + delta / newN * delta * n * stat.getCount();
double recipN = 1.0 / newN;
mean = n * recipN * mean + stat.getCount() * recipN * stat.getMean();
n = newN;
}
/**
* Gets the best case of the stream.
*
* @return The min or max.
*/
public double getBestCase() {
switch (regression_mode) {
case VTS_REGRESSION_MODE_DECREASING:
return getMax();
default:
return getMin();
}
}
/**
* Gets the calculated min of the stream.
*
* @return The min.
*/
public double getMin() {
return min;
}
/**
* Gets the calculated max of the stream.
*
* @return The max.
*/
public double getMax() {
return max;
}
/**
* Gets the calculated mean of the stream.
*
* @return The mean.
*/
public double getMean() {
return mean;
}
/**
* Gets the calculated sum of squared error of the stream.
*
* @return The sum of squared error.
*/
public double getSumSq() {
return sumSq;
}
/**
* Gets the calculated standard deviation of the stream.
*
* @return The standard deviation.
*/
public double getStd() {
return Math.sqrt(sumSq / (n - 1));
}
/**
* Gets the number of elements that have passed through the stream.
*
* @return Number of elements.
*/
public int getCount() {
return n;
}
/**
* Gets the label for the summarized statistics.
*
* @return The (string) label.
*/
public String getLabel() {
return label;
}
/**
* Gets the regression mode.
*
* @return The VtsProfilingRegressionMode value.
*/
public VtsProfilingRegressionMode getRegressionMode() {
return regression_mode;
}
}