/* * Created on Feb 7, 2008 */ package org.seqcode.math.probability; import java.util.*; public class NormalDistributionCalculator { private LinkedList<Double> values; private double sum; public NormalDistributionCalculator() { values = new LinkedList<Double>(); sum = 0.0; } public NormalDistribution calculateDistribution() { double divisor = (double)Math.max(1, values.size()); double mean = sum / divisor; double varsum = 0.0; for(double v : values) { double diff = v - mean; varsum += (diff*diff); } double var = values.size() >= 1 ? varsum / divisor : 1.0; return new NormalDistribution(mean, var); } public void reset() { values.clear(); sum = 0.0; } public double getMean() { return sum / (double)Math.max(1, values.size()); } public void addValues(Collection<Double> vs) { for(double v : vs) { addValue(v); } } public void addValue(double v) { if(Double.isNaN(v) || Double.isInfinite(v)) { String msg = Double.isNaN(v) ? "NaN" : "Infinite"; throw new IllegalArgumentException(msg); } values.add(v); sum += v; } }