comparison flys-artifacts/src/main/java/de/intevation/flys/artifacts/model/fixings/FixCalculation.java @ 3010:05a3fe8800b3

FixA: Store Chi^2 of fitting into result, too. flys-artifacts/trunk@4575 c6561f87-3c4e-4783-a992-168aeb5c3f6f
author Sascha L. Teichmann <sascha.teichmann@intevation.de>
date Mon, 04 Jun 2012 10:13:20 +0000
parents 9e0500d64524
children ab81ffd1343e
comparison
equal deleted inserted replaced
3009:4dda67a893da 3010:05a3fe8800b3
23 import de.intevation.flys.artifacts.model.FixingsOverviewFactory; 23 import de.intevation.flys.artifacts.model.FixingsOverviewFactory;
24 import de.intevation.flys.artifacts.model.Parameters; 24 import de.intevation.flys.artifacts.model.Parameters;
25 25
26 import de.intevation.flys.utils.DateAverager; 26 import de.intevation.flys.utils.DateAverager;
27 import de.intevation.flys.utils.DoubleUtil; 27 import de.intevation.flys.utils.DoubleUtil;
28 import de.intevation.flys.utils.Pair;
28 29
29 import java.util.ArrayList; 30 import java.util.ArrayList;
30 import java.util.Date; 31 import java.util.Date;
31 import java.util.HashMap; 32 import java.util.HashMap;
32 import java.util.List; 33 import java.util.List;
195 196
196 if (debug) { 197 if (debug) {
197 log.debug("number of kms: " + kms.length); 198 log.debug("number of kms: " + kms.length);
198 } 199 }
199 200
201 int kmIndex = results.columnIndex("km");
202 int chiSqrIndex = results.columnIndex("chi_sqr");
203
200 int numFailed = 0; 204 int numFailed = 0;
201 205
202 for (int i = 0; i < kms.length; ++i) { 206 for (int i = 0; i < kms.length; ++i) {
203 double km = kms[i]; 207 double km = kms[i];
204 208
207 qs[j] = column.getQ(km); 211 qs[j] = column.getQ(km);
208 boolean interpolated = column.getW(km, ws, j); 212 boolean interpolated = column.getW(km, ws, j);
209 // TODO: mark as interpolated. 213 // TODO: mark as interpolated.
210 } 214 }
211 215
216 Pair<double [], Double> fitResult = fit(func, km, ws, qs);
217
212 // TODO: Do preprocessing here! 218 // TODO: Do preprocessing here!
213 double [] parameters = fit(func, km, ws, qs); 219 if (fitResult == null) { // Problems are reported already.
214 if (parameters == null) { // Problems are reported already.
215 ++numFailed; 220 ++numFailed;
216 continue; 221 continue;
217 } 222 }
218 223
219 int row = results.newRow(); 224 int row = results.newRow();
220 225
221 results.set(row, "km", km); 226 results.set(row, kmIndex, km);
227 results.set(row, chiSqrIndex, fitResult.getB());
228
229 double [] parameters = fitResult.getA();
222 for (int j = 0; j < parameters.length; ++j) { 230 for (int j = 0; j < parameters.length; ++j) {
223 if (Double.isNaN(parameters[j])) { 231 if (Double.isNaN(parameters[j])) {
224 invalid = true; 232 invalid = true;
225 } 233 }
226 else { 234 else {
227 results.set(row, parameterNames[j], parameters[j]); 235 results.set(row, parameterNames[j], parameters[j]);
228 } 236 }
229 } 237 }
230 // TODO: Calculate statistics, too!
231 } 238 }
232 239
233 if (debug) { 240 if (debug) {
234 log.debug("success: " + (kms.length - numFailed)); 241 log.debug("success: " + (kms.length - numFailed));
235 log.debug("failed: " + numFailed); 242 log.debug("failed: " + numFailed);
572 579
573 return columns; 580 return columns;
574 } 581 }
575 582
576 protected static String [] createColumnNames(String [] parameters) { 583 protected static String [] createColumnNames(String [] parameters) {
577 String [] result = new String[parameters.length + 1]; 584 String [] result = new String[parameters.length + 2];
578 result[0] = "km"; 585 result[0] = "km";
579 // TODO: Add statistic columns, too. 586 result[0] = "chi_sqr";
580 System.arraycopy(parameters, 0, result, 1, parameters.length); 587 System.arraycopy(parameters, 0, result, 2, parameters.length);
581 return result; 588 return result;
582 } 589 }
583 590
584 protected double [] fit( 591 protected Pair<double [], Double> fit(
585 Function function, 592 Function function,
586 double km, 593 double km,
587 double [] ws, 594 double [] ws,
588 double [] qs 595 double [] qs
589 ) { 596 ) {
595 cf.addObservedPoint(qs[i], ws[i]); 602 cf.addObservedPoint(qs[i], ws[i]);
596 } 603 }
597 } 604 }
598 605
599 try { 606 try {
600 return cf.fit(function, function.getInitialGuess()); 607 double [] parameters =
608 cf.fit(function, function.getInitialGuess());
609 double chiSqr = lmo.getChiSquare();
610
611 return new Pair<double [], Double>(parameters, chiSqr);
601 } 612 }
602 catch (MathException me) { 613 catch (MathException me) {
603 log.warn(me, me); 614 log.warn(me, me);
604 addProblem(km, "fix.fitting.failed"); 615 addProblem(km, "fix.fitting.failed");
605 } 616 }

http://dive4elements.wald.intevation.org