/*******************************************************************************
* Copyright 2014 Virginia Polytechnic Institute and State University
*
* 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 edu.vt.vbi.patric.common;
/*************************************************************************
* Compilation: javac StdStats.java
* Execution: java StdStats < input.txt
*
* Library of statistical functions.
*
* The test client reads an array of real numbers from standard
* input, and computes the minimum, mean, maximum, and
* standard deviation.
*
* The functions all throw a NullPointerException if the array
* passed in is null.
* % more tiny.txt
* 5
* 3.0 1.0 2.0 5.0 4.0
*
* % java StdStats < tiny.txt
* min 1.000
* mean 3.000
* max 5.000
* std dev 1.581
*
*************************************************************************/
/**
* <i>Standard statistics</i>. This class provides methods for computing statistics such as min, max, mean, sample standard deviation, and sample
* variance.
* <p>
* For additional documentation, see <a href="http://introcs.cs.princeton.edu/22library">Section 2.2</a> of <i>Introduction to Programming in Java: An
* Interdisciplinary Approach</i> by Robert Sedgewick and Kevin Wayne.
*/
public final class StdStats {
StdStats() {
}
/**
* Return maximum value in array, -infinity if no such value.
*/
public double max(double[] a) {
double max = Double.NEGATIVE_INFINITY;
for (int i = 0; i < a.length; i++) {
if (a[i] > max)
max = a[i];
}
return max;
}
/**
* Return maximum value in subarray a[lo..hi], -infinity if no such value.
*/
public double max(double[] a, int lo, int hi) {
if (lo < 0 || hi >= a.length || lo > hi)
throw new RuntimeException("Subarray indices out of bounds");
double max = Double.NEGATIVE_INFINITY;
for (int i = lo; i <= hi; i++) {
if (a[i] > max)
max = a[i];
}
return max;
}
/**
* Return maximum value of array, Integer.MIN_VALUE if no such value
*/
public int max(int[] a) {
int max = Integer.MIN_VALUE;
for (int i = 0; i < a.length; i++) {
if (a[i] > max)
max = a[i];
}
return max;
}
/**
* Return minimum value in array, +infinity if no such value.
*/
public double min(double[] a) {
double min = Double.POSITIVE_INFINITY;
for (int i = 0; i < a.length; i++) {
if (a[i] < min)
min = a[i];
}
return min;
}
/**
* Return minimum value in subarray a[lo..hi], +infinity if no such value.
*/
public double min(double[] a, int lo, int hi) {
if (lo < 0 || hi >= a.length || lo > hi)
throw new RuntimeException("Subarray indices out of bounds");
double min = Double.POSITIVE_INFINITY;
for (int i = lo; i <= hi; i++) {
if (a[i] < min)
min = a[i];
}
return min;
}
/**
* Return minimum value of array, Integer.MAX_VALUE if no such value
*/
public int min(int[] a) {
int min = Integer.MAX_VALUE;
for (int i = 0; i < a.length; i++) {
if (a[i] < min)
min = a[i];
}
return min;
}
/**
* Return average value in array, NaN if no such value.
*/
public double mean(double[] a) {
if (a.length == 0)
return Double.NaN;
double sum = sum(a);
return sum / a.length;
}
/**
* Return average value in subarray a[lo..hi], NaN if no such value.
*/
public double mean(double[] a, int lo, int hi) {
int length = hi - lo + 1;
if (lo < 0 || hi >= a.length || lo > hi)
throw new RuntimeException("Subarray indices out of bounds");
if (length == 0)
return Double.NaN;
double sum = sum(a, lo, hi);
return sum / length;
}
/**
* Return average value in array, NaN if no such value.
*/
public double mean(int[] a) {
if (a.length == 0)
return Double.NaN;
double sum = 0.0;
for (int i = 0; i < a.length; i++) {
sum = sum + a[i];
}
return sum / a.length;
}
/**
* Return sample variance of array, NaN if no such value.
*/
public double var(double[] a) {
if (a.length == 0)
return Double.NaN;
double avg = mean(a);
double sum = 0.0;
for (int i = 0; i < a.length; i++) {
sum += (a[i] - avg) * (a[i] - avg);
}
return sum / (a.length - 1);
}
/**
* Return sample variance of subarray a[lo..hi], NaN if no such value.
*/
public double var(double[] a, int lo, int hi) {
int length = hi - lo + 1;
if (lo < 0 || hi >= a.length || lo > hi)
throw new RuntimeException("Subarray indices out of bounds");
if (length == 0)
return Double.NaN;
double avg = mean(a, lo, hi);
double sum = 0.0;
for (int i = lo; i <= hi; i++) {
sum += (a[i] - avg) * (a[i] - avg);
}
return sum / (length - 1);
}
/**
* Return sample variance of array, NaN if no such value.
*/
public double var(int[] a) {
if (a.length == 0)
return Double.NaN;
double avg = mean(a);
double sum = 0.0;
for (int i = 0; i < a.length; i++) {
sum += (a[i] - avg) * (a[i] - avg);
}
return sum / (a.length - 1);
}
/**
* Return population variance of array, NaN if no such value.
*/
public double varp(double[] a) {
if (a.length == 0)
return Double.NaN;
double avg = mean(a);
double sum = 0.0;
for (int i = 0; i < a.length; i++) {
sum += (a[i] - avg) * (a[i] - avg);
}
return sum / a.length;
}
/**
* Return population variance of subarray a[lo..hi], NaN if no such value.
*/
public double varp(double[] a, int lo, int hi) {
int length = hi - lo + 1;
if (lo < 0 || hi >= a.length || lo > hi)
throw new RuntimeException("Subarray indices out of bounds");
if (length == 0)
return Double.NaN;
double avg = mean(a, lo, hi);
double sum = 0.0;
for (int i = lo; i <= hi; i++) {
sum += (a[i] - avg) * (a[i] - avg);
}
return sum / length;
}
/**
* Return sample standard deviation of array, NaN if no such value.
*/
public double stddev(double[] a) {
return Math.sqrt(var(a));
}
/**
* Return sample standard deviation of subarray a[lo..hi], NaN if no such value.
*/
public double stddev(double[] a, int lo, int hi) {
return Math.sqrt(var(a, lo, hi));
}
/**
* Return sample standard deviation of array, NaN if no such value.
*/
public double stddev(int[] a) {
return Math.sqrt(var(a));
}
/**
* Return population standard deviation of array, NaN if no such value.
*/
public double stddevp(double[] a) {
return Math.sqrt(varp(a));
}
/**
* Return population standard deviation of subarray a[lo..hi], NaN if no such value.
*/
public double stddevp(double[] a, int lo, int hi) {
return Math.sqrt(varp(a, lo, hi));
}
/**
* Return sum of all values in array.
*/
public double sum(double[] a) {
double sum = 0.0;
for (int i = 0; i < a.length; i++) {
sum += a[i];
}
return sum;
}
/**
* Return sum of all values in subarray a[lo..hi].
*/
public double sum(double[] a, int lo, int hi) {
if (lo < 0 || hi >= a.length || lo > hi)
throw new RuntimeException("Subarray indices out of bounds");
double sum = 0.0;
for (int i = lo; i <= hi; i++) {
sum += a[i];
}
return sum;
}
/**
* Return sum of all values in array.
*/
public int sum(int[] a) {
int sum = 0;
for (int i = 0; i < a.length; i++) {
sum += a[i];
}
return sum;
}
}