Mercurial > dive4elements > river
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 :