sascha@3187: package de.intevation.flys.artifacts.model.sq; sascha@3187: sascha@3187: import java.util.ArrayList; sascha@3187: import java.util.List; sascha@3187: sascha@3188: import org.apache.commons.math.MathException; sascha@3188: sascha@3187: import org.apache.commons.math.stat.descriptive.moment.StandardDeviation; sascha@3187: sascha@3552: import org.apache.log4j.Logger; sascha@3552: rrenkert@4794: import de.intevation.artifacts.GlobalContext; rrenkert@4794: import de.intevation.artifacts.common.utils.Config; rrenkert@4794: import de.intevation.flys.artifacts.context.FLYSContext; rrenkert@4794: import de.intevation.flys.artifacts.math.GrubbsOutlier; rrenkert@4794: import de.intevation.flys.artifacts.math.StdDevOutlier; rrenkert@4794: sascha@3187: public class Outlier sascha@3187: { sascha@3552: private static Logger log = Logger.getLogger(Outlier.class); sascha@3552: rrenkert@4794: private static final String OUTLIER_METHOD = rrenkert@4794: "/artifact-database/options/minfo-sq/outlier-method/@name"; rrenkert@4794: rrenkert@4794: private static final String GRUBBS = "grubbs"; rrenkert@4794: rrenkert@4794: private static final String STD_DEV = "std-dev"; rrenkert@4794: sascha@3187: public interface Callback { sascha@3187: sascha@3566: void initialize(List sqs) throws MathException; sascha@3552: sascha@3187: double eval(SQ sq); sascha@3187: sascha@3566: void iterationFinished( sascha@3566: double stdDev, sascha@3566: SQ outlier, sascha@3566: List remaining); sascha@3187: sascha@3187: } // interface Callback sascha@3187: sascha@3552: public static void detectOutliers( sascha@3187: Callback callback, sascha@3187: List sqs, sascha@3187: double stdDevFactor sascha@3188: ) sascha@3188: throws MathException sascha@3188: { sascha@3552: boolean debug = log.isDebugEnabled(); sascha@3552: sascha@3552: if (debug) { sascha@3552: log.debug("stdDevFactor: " + stdDevFactor); sascha@3552: } rrenkert@4794: String method = Config.getStringXPath(OUTLIER_METHOD); rrenkert@4794: log.debug("method: " + method); rrenkert@4794: if (method == null) { rrenkert@4794: method = "std-dev"; rrenkert@4794: } sascha@3566: List data = new ArrayList(sqs); sascha@3187: sascha@3566: while (data.size() > 2) { sascha@3187: sascha@3566: callback.initialize(data); sascha@3187: rrenkert@4794: List values = new ArrayList(); rrenkert@4794: for (SQ sq: data) { rrenkert@4794: values.add(callback.eval(sq)); sascha@3187: } sascha@3187: rrenkert@4794: Integer ndx = null; rrenkert@4794: double[] stdDev = new double[1]; rrenkert@4794: if (method.equals(GRUBBS)) { rrenkert@4794: ndx = GrubbsOutlier.findOutlier(values, stdDevFactor/100, stdDev); rrenkert@4794: } rrenkert@4794: else { rrenkert@4794: ndx = StdDevOutlier.findOutlier(values, stdDevFactor, stdDev); rrenkert@4794: } rrenkert@4794: if (ndx == null) { rrenkert@4794: callback.iterationFinished(stdDev[0], null, data); rrenkert@4794: break; sascha@3187: } sascha@3187: rrenkert@4794: SQ outlier = data.remove((int)ndx); rrenkert@4794: log.debug("stdDev: " + stdDev[0]); rrenkert@4794: log.debug("removed " + ndx + "; S: " + outlier.getS() + " Q: " + outlier.getQ()); rrenkert@4794: callback.iterationFinished(stdDev[0], outlier, data); sascha@3566: } sascha@3188: } sascha@3187: } sascha@3187: // vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 :