package util; import java.util.Vector; public class Asymptote { Vector values = null; boolean isConverged = false; private final double k = .25; // critical value for FTest convergence int interval = 8; int numIntervals = 3; public Asymptote(){ values = new Vector(); } public int size(){return values.size();} public boolean isConverged(){return isConverged;} public void addValue(double value){ values.add(new Double(value)); testConverge(); } public double getConvergeWindowAverage(){ double result = 0.0; int startIndex = getConvergeStartIndex(); result = BasicStats.average(BasicStats.subVec(values, startIndex, values.size()-1), values.size()-startIndex); return result; } public double getTrialsToConverge(){ return values.size(); } /** * Get the start index of the convergence window * @return */ private int getConvergeStartIndex(){ return values.size()-interval*numIntervals; } private void testConverge(){ if(isConverged) return; // basic F-test double fTest = Double.NEGATIVE_INFINITY; // sentinal value // Gideon debug // int startIndex = values.size()+1-interval*numIntervals; // int startIndex = values.size()-interval*numIntervals; int startIndex = getConvergeStartIndex(); if(startIndex < 0) return; // Gideon debug //if(startIndex+interval*numIntervals > values.size()) return; try{ // TODO: make a faster method than basicFTest()... it's very slow! fTest = BasicStats.basicFTest(values, startIndex, interval, numIntervals); }catch(Exception e){ // didn't converge if something messed up return; } if(fTest < k) isConverged = true; } public String toString(){ return values.toString(); } }