sascha@3187: package de.intevation.flys.artifacts.model.sq; sascha@3187: teichmann@4795: import de.intevation.artifacts.common.utils.Config; teichmann@4795: teichmann@4795: import de.intevation.flys.artifacts.math.GrubbsOutlier; teichmann@4795: import de.intevation.flys.artifacts.math.StdDevOutlier; teichmann@4795: 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@3552: import org.apache.log4j.Logger; sascha@3552: 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: teichmann@4795: //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: rrenkert@4794: String method = Config.getStringXPath(OUTLIER_METHOD); teichmann@4795: rrenkert@4794: if (method == null) { rrenkert@4794: method = "std-dev"; rrenkert@4794: } teichmann@4795: teichmann@4795: if (debug) { teichmann@4795: log.debug("stdDevFactor: " + stdDevFactor); teichmann@4795: log.debug("method: " + method); teichmann@4795: } teichmann@4795: sascha@3566: List data = new ArrayList(sqs); sascha@3187: teichmann@4795: double [] stdDev = new double[1]; teichmann@4795: teichmann@4795: boolean useGrubbs = method.equals(GRUBBS); teichmann@4795: teichmann@4795: if (useGrubbs) { teichmann@4795: stdDevFactor = Math.max(0d, Math.min(stdDevFactor/100d, 1d)); teichmann@4795: } teichmann@4795: teichmann@4795: List values = new ArrayList(data.size()); teichmann@4795: sascha@3566: while (data.size() > 2) { sascha@3187: sascha@3566: callback.initialize(data); sascha@3187: rrenkert@4794: for (SQ sq: data) { rrenkert@4794: values.add(callback.eval(sq)); sascha@3187: } sascha@3187: teichmann@4795: Integer ndx = useGrubbs teichmann@4795: ? GrubbsOutlier.findOutlier(values, stdDevFactor, stdDev) teichmann@4795: : StdDevOutlier.findOutlier(values, stdDevFactor, stdDev); teichmann@4795: rrenkert@4794: if (ndx == null) { rrenkert@4794: callback.iterationFinished(stdDev[0], null, data); rrenkert@4794: break; sascha@3187: } sascha@3187: teichmann@4795: SQ outlier = data.remove(ndx.intValue()); teichmann@4795: if (debug) { teichmann@4795: log.debug("stdDev: " + stdDev[0]); teichmann@4795: log.debug("removed " + ndx + teichmann@4795: "; S: " + outlier.getS() + " Q: " + outlier.getQ()); teichmann@4795: } rrenkert@4794: callback.iterationFinished(stdDev[0], outlier, data); teichmann@4795: values.clear(); sascha@3566: } sascha@3188: } sascha@3187: } sascha@3187: // vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 :