diff flys-artifacts/src/main/java/de/intevation/flys/artifacts/model/sq/SQRelationCalculation.java @ 3552:1df6984628c3

S/Q: Extented the result data model of the S/Q calculation to store the curve coefficients for each iteration step of the outlier elimination. flys-artifacts/trunk@5146 c6561f87-3c4e-4783-a992-168aeb5c3f6f
author Sascha L. Teichmann <sascha.teichmann@intevation.de>
date Fri, 27 Jul 2012 12:36:09 +0000
parents e7a67407dea1
children ba2f0bff0697
line wrap: on
line diff
--- a/flys-artifacts/src/main/java/de/intevation/flys/artifacts/model/sq/SQRelationCalculation.java	Fri Jul 27 08:36:24 2012 +0000
+++ b/flys-artifacts/src/main/java/de/intevation/flys/artifacts/model/sq/SQRelationCalculation.java	Fri Jul 27 12:36:09 2012 +0000
@@ -12,6 +12,7 @@
 
 import de.intevation.flys.backend.SedDBSessionHolder;
 
+import java.util.ArrayList;
 import java.util.List;
 
 import org.apache.log4j.Logger;
@@ -35,7 +36,7 @@
 
         String    river    = access.getRiver();
         Double    location = access.getLocation();
-        DateRange period  = access.getPeriod();
+        DateRange period   = access.getPeriod();
         Double    outliers = access.getOutliers();
 
         //river = "Rhein";
@@ -99,13 +100,10 @@
             addProblem("sq.missing.sq.function");
         }
 
-
         String [] parameterNames = function.getParameterNames();
 
-        Fitting fitting = new Fitting(function, outliers);
-
-            Measurements measurements =
-                MeasurementFactory.getMeasurements(river, location, period);
+        Measurements measurements =
+            MeasurementFactory.getMeasurements(river, location, period);
 
         SQFractionResult [] fractionResults =
             new SQFractionResult[SQResult.NUMBER_FRACTIONS];
@@ -115,27 +113,20 @@
 
             SQFractionResult fractionResult;
 
-            if (!fitting.fit(sqs)) {
+            List<SQFractionResult.Iteration> iterations =
+                doFitting(function, sqs);
+
+            if (iterations == null) {
                 // TODO: i18n
                 addProblem("sq.fitting.failed." + i);
                 fractionResult = new SQFractionResult();
             }
             else {
-                Parameters parameters = createParameters(parameterNames);
-                int row = parameters.newRow();
-                double [] coeffs = fitting.getParameters();
-                for (int j = 0; j < parameterNames.length; ++j) {
-                    parameters.set(row, parameterNames[j], coeffs[j]);
-                }
-                parameters.set(row, "chi_sqr", fitting.getChiSqr());
-                parameters.set(row, "std_dev", fitting.getStandardDeviation());
+                fractionResult = new SQFractionResult(
+                    sqs.toArray(new SQ[sqs.size()]),
+                    iterations);
+            }
 
-                fractionResult = new SQFractionResult(
-                    parameters,
-                    fitting.getRemaining(),
-                    fitting.getOutliers());
-            }
-            fitting.reset();
             fractionResults[i] = fractionResult;
         }
 
@@ -144,13 +135,55 @@
             this);
     }
 
-    public static final Parameters createParameters(String [] names) {
+    protected List<SQFractionResult.Iteration> doFitting(
+        final Function function,
+        List<SQ> sqs
+    ) {
+        final List<SQFractionResult.Iteration> iterations =
+            new ArrayList<SQFractionResult.Iteration>();
 
+        boolean success = new Fitting(function, outliers).fit(
+            sqs,
+            new Fitting.Callback() {
+                @Override
+                public void afterIteration(
+                    double [] coeffs,
+                    SQ []     measurements,
+                    SQ []     outliers,
+                    double    standardDeviation,
+                    double    chiSqr
+                ) {
+                    Parameters parameters = createParameters(
+                        function.getParameterNames(),
+                        coeffs,
+                        standardDeviation,
+                        chiSqr);
+                    iterations.add(new SQFractionResult.Iteration(
+                        parameters,
+                        measurements,
+                        outliers));
+                }
+            });
+
+        return success ? iterations : null;
+    }
+
+    public static final Parameters createParameters(
+        String [] names,
+        double [] values,
+        double    standardDeviation,
+        double    chiSqr
+    ) {
         String [] columns = new String[names.length + 2];
         columns[0] = "chi_sqr";
         columns[1] = "std_dev";
         System.arraycopy(names, 0, columns, 2, names.length);
-        return new Parameters(columns);
+        Parameters parameters = new Parameters(columns);
+        int row = parameters.newRow();
+        parameters.set(row, names, values);
+        parameters.set(row, "chi_sqr", chiSqr);
+        parameters.set(row, "std_dev", standardDeviation);
+        return parameters;
     }
 }
 // vim:set ts=4 sw=4 si et sta sts=4 fenc=utf-8 :

http://dive4elements.wald.intevation.org