diff flys-artifacts/src/main/java/de/intevation/flys/artifacts/model/sq/Outlier.java @ 3188:1e46ced2bb57

SQ: Added fitting shell for SQ curves. flys-artifacts/trunk@4803 c6561f87-3c4e-4783-a992-168aeb5c3f6f
author Sascha L. Teichmann <sascha.teichmann@intevation.de>
date Tue, 26 Jun 2012 17:05:11 +0000
parents 1e2733f749b5
children 49fe2ed03c12
line wrap: on
line diff
--- a/flys-artifacts/src/main/java/de/intevation/flys/artifacts/model/sq/Outlier.java	Tue Jun 26 16:00:59 2012 +0000
+++ b/flys-artifacts/src/main/java/de/intevation/flys/artifacts/model/sq/Outlier.java	Tue Jun 26 17:05:11 2012 +0000
@@ -1,8 +1,11 @@
 package de.intevation.flys.artifacts.model.sq;
 
 import java.util.ArrayList;
+import java.util.Iterator;
 import java.util.List;
 
+import org.apache.commons.math.MathException;
+
 import org.apache.commons.math.stat.descriptive.moment.StandardDeviation;
 
 public class Outlier
@@ -17,6 +20,10 @@
 
         void outlier(SQ sq);
 
+        void standardDeviation(double stdDev);
+
+        void reinitialize(Iterator<SQ> good) throws MathException;
+
         void finished();
 
     } // interface Callback
@@ -34,7 +41,9 @@
         Callback callback,
         List<SQ> sqs,
         double   stdDevFactor
-    ) {
+    )
+    throws MathException
+    {
         List<EvalSQ> data = new ArrayList<EvalSQ>(sqs.size());
 
         for (SQ sq: sqs) {
@@ -43,7 +52,7 @@
 
         List<EvalSQ> good = new ArrayList<EvalSQ>(sqs.size());
 
-        for (int i = 0; i < MAX_ITERATIONS && data.size() > 2; ++i) {
+        for (int i = 1; i <= MAX_ITERATIONS && data.size() > 2; ++i) {
 
             StandardDeviation stdDev = new StandardDeviation();
 
@@ -51,7 +60,11 @@
                 stdDev.increment(esq.value = callback.eval(esq.sq));
             }
 
-            double accepted = stdDevFactor * stdDev.getResult();
+            double sd = stdDev.getResult();
+
+            callback.standardDeviation(sd);
+
+            double accepted = stdDevFactor * sd;
 
             callback.iteration(i);
 
@@ -68,6 +81,8 @@
                 break;
             }
 
+            callback.reinitialize(asSQIterator(good));
+
             List<EvalSQ> tmp = good;
             good = data;
             data = tmp;
@@ -84,5 +99,25 @@
 
         return result;
     }
+
+    protected static Iterator<SQ> asSQIterator(List<EvalSQ> esqs) {
+        final Iterator<EvalSQ> parent = esqs.iterator();
+        return new Iterator<SQ>() {
+            @Override
+            public boolean hasNext() {
+                return parent.hasNext();
+            }
+
+            @Override
+            public SQ next() {
+                return parent.next().sq;
+            }
+
+            @Override
+            public void remove() {
+                throw new UnsupportedOperationException();
+            }
+        };
+    }
 }
 // vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 :

http://dive4elements.wald.intevation.org