Mercurial > dive4elements > river
diff flys-artifacts/src/main/java/org/dive4elements/river/artifacts/model/sq/Outlier.java @ 5831:bd047b71ab37
Repaired internal references
author | Sascha L. Teichmann <teichmann@intevation.de> |
---|---|
date | Thu, 25 Apr 2013 12:06:39 +0200 |
parents | flys-artifacts/src/main/java/de/intevation/flys/artifacts/model/sq/Outlier.java@2fe120e1e4df |
children |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/flys-artifacts/src/main/java/org/dive4elements/river/artifacts/model/sq/Outlier.java Thu Apr 25 12:06:39 2013 +0200 @@ -0,0 +1,93 @@ +package org.dive4elements.river.artifacts.model.sq; + +import org.dive4elements.river.artifacts.math.GrubbsOutlier; +import org.dive4elements.river.artifacts.math.StdDevOutlier; + +import java.util.ArrayList; +import java.util.List; + +import org.apache.commons.math.MathException; + +import org.apache.log4j.Logger; + +public class Outlier +{ + private static Logger log = Logger.getLogger(Outlier.class); + + private static final String GRUBBS = "outlier.method.grubbs"; + + //private static final String STD_DEV = "std-dev"; + + public interface Callback { + + void initialize(List<SQ> sqs) throws MathException; + + double eval(SQ sq); + + void iterationFinished( + double stdDev, + SQ outlier, + List<SQ> remaining); + + } // interface Callback + + public static void detectOutliers( + Callback callback, + List<SQ> sqs, + double stdDevFactor, + String method + ) + throws MathException + { + boolean debug = log.isDebugEnabled(); + + if (method == null) { + method = "std-dev"; + } + + if (debug) { + log.debug("stdDevFactor: " + stdDevFactor); + log.debug("method: " + method); + } + + List<SQ> data = new ArrayList<SQ>(sqs); + + double [] stdDev = new double[1]; + + boolean useGrubbs = method.equals(GRUBBS); + + if (useGrubbs) { + stdDevFactor = Math.max(0d, Math.min(stdDevFactor/100d, 1d)); + } + + List<Double> values = new ArrayList<Double>(data.size()); + + while (data.size() > 2) { + + callback.initialize(data); + + for (SQ sq: data) { + values.add(callback.eval(sq)); + } + + Integer ndx = useGrubbs + ? GrubbsOutlier.findOutlier(values, stdDevFactor, stdDev) + : StdDevOutlier.findOutlier(values, stdDevFactor, stdDev); + + if (ndx == null) { + callback.iterationFinished(stdDev[0], null, data); + break; + } + + SQ outlier = data.remove(ndx.intValue()); + if (debug) { + log.debug("stdDev: " + stdDev[0]); + log.debug("removed " + ndx + + "; S: " + outlier.getS() + " Q: " + outlier.getQ()); + } + callback.iterationFinished(stdDev[0], outlier, data); + values.clear(); + } + } +} +// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 :