/* * Variate.java * * Copyright (c) 2002-2015 Alexei Drummond, Andrew Rambaut and Marc Suchard * * This file is part of BEAST. * See the NOTICE file distributed with this work for additional * information regarding copyright ownership and licensing. * * BEAST is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as * published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * BEAST is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with BEAST; if not, write to the * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, * Boston, MA 02110-1301 USA */ package dr.stats; import java.util.ArrayList; import java.util.List; /** * interface for a continuous variate. * * @author Andrew Rambaut * @version $Id: Variate.java,v 1.15 2006/02/20 17:36:23 rambaut Exp $ */ public interface Variate<T> { /** * @return the number of values in this Variate */ int getCount(); /** * @return the ith value. Returns NaN if it is missing */ T get(int index); /** * @return the minimum value. */ T getMin(); /** * @return the maximum value. */ T getMax(); /** * @return the range. */ T getRange(); /** * @return the sum. */ T getSum(); /** * @return the mean. */ T getMean(); /** * compute the q-th quantile for the distribution * (= inverse cdf) * * @param q quantile (0 <= q <= 1) */ double getQuantile(T q); /** * add a value */ void add(T value); /** * add all the values */ void add(Variate values); /** * add all the values */ void add(T[] values); /** * remove a value */ void remove(int index); /** * remove all values */ void removeAll(); public abstract class N<Number> implements Variate<Number> { protected List<Number> values = new ArrayList<Number>(); // public N() {} // public N(List<Number> values) { // add(values); // } public int getCount() { return values.size(); } public void add(Variate values) { for (int i = 0; i < values.getCount(); i++) { add((Number) values.get(i)); } } public void add(Number value) { values.add(value); } public Number get(int index) { return values.get(index); } public void remove(int index) { values.remove(index); } public void removeAll() { values.clear(); } public void add(List<Number> values) { this.values.addAll(values); } public void add(Number[] values) { for (Number value : values) { add(value); } } } /** * A double precision concrete implementation of Variate */ public class D extends N<Double> { public D() {} public D(List<Double> values) { // super(values); add(values); } public D(Double[] values) { add(values); } /** * @return the minimum value. */ public Double getMin() { Double minValue = java.lang.Double.POSITIVE_INFINITY; for (Double value : values) { if (value < minValue) minValue = value; } return minValue; } /** * @return the maximum value. */ public Double getMax() { Double maxValue = java.lang.Double.NEGATIVE_INFINITY; for (Double value : values) { if (value > maxValue) maxValue = value; } return maxValue; } /** * @return the range. */ public Double getRange() { return getMin() - getMax(); } /** * @return the mean. */ public Double getMean() { return getSum() / getCount(); } /** * @return the sum. */ public Double getSum() { Double sum = 0.0; for (Double value : values) { sum += value; } return sum; } /** * compute the q-th quantile for the distribution * (= inverse cdf) * * @param q quantile (0 <= q <= 1) */ public double getQuantile(Double q) { double[] dv = new double[values.size()]; for (int i = 0; i < values.size(); i++) { dv[i] = values.get(i); } return DiscreteStatistics.quantile(q.doubleValue(), dv); } } /** * A single precision concrete implementation of Variate */ public class I extends N<Integer> { public I() {} public I(List<Integer> values) { // super(values); add(values); } public I(Integer[] values) { add(values); } /** * @return the minimum value. */ public Integer getMin() { Integer minValue = java.lang.Integer.MAX_VALUE; for (Integer value : values) { if (value < minValue) minValue = value; } return minValue; } /** * @return the maximum value. */ public Integer getMax() { Integer maxValue = java.lang.Integer.MIN_VALUE; for (Integer value : values) { if (value > maxValue) maxValue = value; } return maxValue; } /** * @return the range. */ public Integer getRange() { return getMin() - getMax(); } /** * @return the mean. */ public Integer getMean() { return getSum() / getCount(); } /** * @return the sum. */ public Integer getSum() { Integer sum = 0; for (Integer value : values) { sum += value; } return sum; } /** * compute the q-th quantile for the distribution * (= inverse cdf) * * @param q quantile (0 <= q <= 1) */ public double getQuantile(Integer q) { double[] dv = new double[values.size()]; for (int i = 0; i < values.size(); i++) { dv[i] = values.get(i).doubleValue(); } return DiscreteStatistics.quantile(q.doubleValue(), dv); } } }