Mercurial > dive4elements > river
view flys-artifacts/src/main/java/de/intevation/flys/artifacts/model/sq/Outlier.java @ 5138:fc0cdcae8f07
New facet types and renaming for infoldings.
author | Raimund Renkert <rrenkert@intevation.de> |
---|---|
date | Thu, 28 Feb 2013 13:09:26 +0100 |
parents | 846b0441f905 |
children | aaf810d4ec82 |
line wrap: on
line source
package de.intevation.flys.artifacts.model.sq; import de.intevation.artifacts.common.utils.Config; import de.intevation.flys.artifacts.math.GrubbsOutlier; import de.intevation.flys.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 OUTLIER_METHOD = "/artifact-database/options/minfo-sq/outlier-method/@name"; private static final String GRUBBS = "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 ) throws MathException { boolean debug = log.isDebugEnabled(); String method = Config.getStringXPath(OUTLIER_METHOD); 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 :