Mercurial > dive4elements > river
annotate artifacts/src/main/java/org/dive4elements/river/artifacts/model/sq/Fitting.java @ 6780:b8f94e865875
S/Q relation: Part I of 'faking' fitting linear data. S/Qs can now be subclassed and processed through views. TODO: Add knob to setup a linear data path.
author | Sascha L. Teichmann <teichmann@intevation.de> |
---|---|
date | Thu, 08 Aug 2013 12:17:03 +0200 |
parents | 48f6780c372d |
children | 51eb6491c537 |
rev | line source |
---|---|
5863
4897a58c8746
River artifacts: Added new copyright headers.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
5838
diff
changeset
|
1 /* Copyright (C) 2011, 2012, 2013 by Bundesanstalt für Gewässerkunde |
4897a58c8746
River artifacts: Added new copyright headers.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
5838
diff
changeset
|
2 * Software engineering by Intevation GmbH |
4897a58c8746
River artifacts: Added new copyright headers.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
5838
diff
changeset
|
3 * |
5994
af13ceeba52a
Removed trailing whitespace.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
5863
diff
changeset
|
4 * This file is Free Software under the GNU AGPL (>=v3) |
5863
4897a58c8746
River artifacts: Added new copyright headers.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
5838
diff
changeset
|
5 * and comes with ABSOLUTELY NO WARRANTY! Check out the |
5994
af13ceeba52a
Removed trailing whitespace.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
5863
diff
changeset
|
6 * documentation coming with Dive4Elements River for details. |
5863
4897a58c8746
River artifacts: Added new copyright headers.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
5838
diff
changeset
|
7 */ |
4897a58c8746
River artifacts: Added new copyright headers.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
5838
diff
changeset
|
8 |
5831
bd047b71ab37
Repaired internal references
Sascha L. Teichmann <teichmann@intevation.de>
parents:
5396
diff
changeset
|
9 package org.dive4elements.river.artifacts.model.sq; |
3188
1e46ced2bb57
SQ: Added fitting shell for SQ curves.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
10 |
5831
bd047b71ab37
Repaired internal references
Sascha L. Teichmann <teichmann@intevation.de>
parents:
5396
diff
changeset
|
11 import org.dive4elements.river.artifacts.math.fitting.Function; |
3188
1e46ced2bb57
SQ: Added fitting shell for SQ curves.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
12 |
1e46ced2bb57
SQ: Added fitting shell for SQ curves.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
13 import java.util.ArrayList; |
1e46ced2bb57
SQ: Added fitting shell for SQ curves.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
14 import java.util.List; |
1e46ced2bb57
SQ: Added fitting shell for SQ curves.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
15 |
1e46ced2bb57
SQ: Added fitting shell for SQ curves.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
16 import org.apache.commons.math.MathException; |
1e46ced2bb57
SQ: Added fitting shell for SQ curves.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
17 |
1e46ced2bb57
SQ: Added fitting shell for SQ curves.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
18 import org.apache.commons.math.optimization.fitting.CurveFitter; |
1e46ced2bb57
SQ: Added fitting shell for SQ curves.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
19 |
1e46ced2bb57
SQ: Added fitting shell for SQ curves.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
20 import org.apache.commons.math.optimization.general.LevenbergMarquardtOptimizer; |
6777
48f6780c372d
S/Q relation: More Excel compat.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
6761
diff
changeset
|
21 import org.apache.commons.math.stat.regression.SimpleRegression; |
3188
1e46ced2bb57
SQ: Added fitting shell for SQ curves.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
22 |
1e46ced2bb57
SQ: Added fitting shell for SQ curves.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
23 import org.apache.log4j.Logger; |
1e46ced2bb57
SQ: Added fitting shell for SQ curves.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
24 |
1e46ced2bb57
SQ: Added fitting shell for SQ curves.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
25 public class Fitting |
3552
1df6984628c3
S/Q: Extented the result data model of the S/Q calculation to
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
3190
diff
changeset
|
26 implements Outlier.Callback |
3188
1e46ced2bb57
SQ: Added fitting shell for SQ curves.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
27 { |
6761
9479cb7c8cd5
flys/issue748: Force linear curve fitting. This is a real hack! Set the system property "minfo.sq.fitting.nonlinear" to re-enable the old behavior.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
5994
diff
changeset
|
28 // XXX: Hack to force linear fitting! |
9479cb7c8cd5
flys/issue748: Force linear curve fitting. This is a real hack! Set the system property "minfo.sq.fitting.nonlinear" to re-enable the old behavior.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
5994
diff
changeset
|
29 private static final boolean USE_NON_LINEAR_FITTING = |
9479cb7c8cd5
flys/issue748: Force linear curve fitting. This is a real hack! Set the system property "minfo.sq.fitting.nonlinear" to re-enable the old behavior.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
5994
diff
changeset
|
30 Boolean.getBoolean("minfo.sq.fitting.nonlinear"); |
9479cb7c8cd5
flys/issue748: Force linear curve fitting. This is a real hack! Set the system property "minfo.sq.fitting.nonlinear" to re-enable the old behavior.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
5994
diff
changeset
|
31 |
3188
1e46ced2bb57
SQ: Added fitting shell for SQ curves.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
32 private static Logger log = Logger.getLogger(Fitting.class); |
1e46ced2bb57
SQ: Added fitting shell for SQ curves.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
33 |
3552
1df6984628c3
S/Q: Extented the result data model of the S/Q calculation to
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
3190
diff
changeset
|
34 public interface Callback { |
1df6984628c3
S/Q: Extented the result data model of the S/Q calculation to
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
3190
diff
changeset
|
35 |
1df6984628c3
S/Q: Extented the result data model of the S/Q calculation to
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
3190
diff
changeset
|
36 void afterIteration( |
1df6984628c3
S/Q: Extented the result data model of the S/Q calculation to
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
3190
diff
changeset
|
37 double [] parameters, |
1df6984628c3
S/Q: Extented the result data model of the S/Q calculation to
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
3190
diff
changeset
|
38 SQ [] measurements, |
1df6984628c3
S/Q: Extented the result data model of the S/Q calculation to
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
3190
diff
changeset
|
39 SQ [] outliers, |
1df6984628c3
S/Q: Extented the result data model of the S/Q calculation to
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
3190
diff
changeset
|
40 double standardDeviation, |
1df6984628c3
S/Q: Extented the result data model of the S/Q calculation to
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
3190
diff
changeset
|
41 double chiSqr); |
1df6984628c3
S/Q: Extented the result data model of the S/Q calculation to
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
3190
diff
changeset
|
42 } // interfacte |
1df6984628c3
S/Q: Extented the result data model of the S/Q calculation to
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
3190
diff
changeset
|
43 |
3188
1e46ced2bb57
SQ: Added fitting shell for SQ curves.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
44 protected Function function; |
1e46ced2bb57
SQ: Added fitting shell for SQ curves.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
45 |
3552
1df6984628c3
S/Q: Extented the result data model of the S/Q calculation to
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
3190
diff
changeset
|
46 protected double [] coeffs; |
3188
1e46ced2bb57
SQ: Added fitting shell for SQ curves.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
47 |
5831
bd047b71ab37
Repaired internal references
Sascha L. Teichmann <teichmann@intevation.de>
parents:
5396
diff
changeset
|
48 protected org.dive4elements.river.artifacts.math.Function instance; |
3552
1df6984628c3
S/Q: Extented the result data model of the S/Q calculation to
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
3190
diff
changeset
|
49 |
1df6984628c3
S/Q: Extented the result data model of the S/Q calculation to
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
3190
diff
changeset
|
50 protected double stdDevFactor; |
3188
1e46ced2bb57
SQ: Added fitting shell for SQ curves.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
51 protected double chiSqr; |
1e46ced2bb57
SQ: Added fitting shell for SQ curves.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
52 |
3552
1df6984628c3
S/Q: Extented the result data model of the S/Q calculation to
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
3190
diff
changeset
|
53 protected Callback callback; |
3188
1e46ced2bb57
SQ: Added fitting shell for SQ curves.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
54 |
6780
b8f94e865875
S/Q relation: Part I of 'faking' fitting linear data. S/Qs can now be subclassed and processed through views. TODO: Add knob to setup a linear data path.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
6777
diff
changeset
|
55 protected SQ.View sqView; |
b8f94e865875
S/Q relation: Part I of 'faking' fitting linear data. S/Qs can now be subclassed and processed through views. TODO: Add knob to setup a linear data path.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
6777
diff
changeset
|
56 |
3188
1e46ced2bb57
SQ: Added fitting shell for SQ curves.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
57 public Fitting() { |
1e46ced2bb57
SQ: Added fitting shell for SQ curves.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
58 } |
1e46ced2bb57
SQ: Added fitting shell for SQ curves.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
59 |
6780
b8f94e865875
S/Q relation: Part I of 'faking' fitting linear data. S/Qs can now be subclassed and processed through views. TODO: Add knob to setup a linear data path.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
6777
diff
changeset
|
60 public Fitting(Function function, double stdDevFactor, SQ.View sqView) { |
3188
1e46ced2bb57
SQ: Added fitting shell for SQ curves.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
61 this.function = function; |
1e46ced2bb57
SQ: Added fitting shell for SQ curves.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
62 this.stdDevFactor = stdDevFactor; |
6780
b8f94e865875
S/Q relation: Part I of 'faking' fitting linear data. S/Qs can now be subclassed and processed through views. TODO: Add knob to setup a linear data path.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
6777
diff
changeset
|
63 this.sqView = sqView; |
3188
1e46ced2bb57
SQ: Added fitting shell for SQ curves.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
64 } |
1e46ced2bb57
SQ: Added fitting shell for SQ curves.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
65 |
1e46ced2bb57
SQ: Added fitting shell for SQ curves.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
66 public Function getFunction() { |
1e46ced2bb57
SQ: Added fitting shell for SQ curves.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
67 return function; |
1e46ced2bb57
SQ: Added fitting shell for SQ curves.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
68 } |
1e46ced2bb57
SQ: Added fitting shell for SQ curves.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
69 |
1e46ced2bb57
SQ: Added fitting shell for SQ curves.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
70 public void setFunction(Function function) { |
1e46ced2bb57
SQ: Added fitting shell for SQ curves.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
71 this.function = function; |
1e46ced2bb57
SQ: Added fitting shell for SQ curves.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
72 } |
1e46ced2bb57
SQ: Added fitting shell for SQ curves.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
73 |
1e46ced2bb57
SQ: Added fitting shell for SQ curves.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
74 public double getStdDevFactor() { |
1e46ced2bb57
SQ: Added fitting shell for SQ curves.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
75 return stdDevFactor; |
1e46ced2bb57
SQ: Added fitting shell for SQ curves.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
76 } |
1e46ced2bb57
SQ: Added fitting shell for SQ curves.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
77 |
1e46ced2bb57
SQ: Added fitting shell for SQ curves.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
78 public void setStdDevFactor(double stdDevFactor) { |
1e46ced2bb57
SQ: Added fitting shell for SQ curves.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
79 this.stdDevFactor = stdDevFactor; |
1e46ced2bb57
SQ: Added fitting shell for SQ curves.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
80 } |
1e46ced2bb57
SQ: Added fitting shell for SQ curves.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
81 |
3552
1df6984628c3
S/Q: Extented the result data model of the S/Q calculation to
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
3190
diff
changeset
|
82 @Override |
3566
8d0f06b76e09
S/Q relation: Fixed flys/issue748
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
3552
diff
changeset
|
83 public void initialize(List<SQ> sqs) throws MathException { |
3552
1df6984628c3
S/Q: Extented the result data model of the S/Q calculation to
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
3190
diff
changeset
|
84 |
6777
48f6780c372d
S/Q relation: More Excel compat.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
6761
diff
changeset
|
85 if (USE_NON_LINEAR_FITTING |
48f6780c372d
S/Q relation: More Excel compat.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
6761
diff
changeset
|
86 || function.getInitialGuess().length != 2) { |
48f6780c372d
S/Q relation: More Excel compat.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
6761
diff
changeset
|
87 nonLinearFitting(sqs); |
48f6780c372d
S/Q relation: More Excel compat.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
6761
diff
changeset
|
88 } |
48f6780c372d
S/Q relation: More Excel compat.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
6761
diff
changeset
|
89 else { |
48f6780c372d
S/Q relation: More Excel compat.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
6761
diff
changeset
|
90 linearFitting(sqs); |
48f6780c372d
S/Q relation: More Excel compat.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
6761
diff
changeset
|
91 } |
48f6780c372d
S/Q relation: More Excel compat.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
6761
diff
changeset
|
92 } |
48f6780c372d
S/Q relation: More Excel compat.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
6761
diff
changeset
|
93 |
48f6780c372d
S/Q relation: More Excel compat.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
6761
diff
changeset
|
94 protected void linearFitting(List<SQ> sqs) { |
48f6780c372d
S/Q relation: More Excel compat.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
6761
diff
changeset
|
95 |
48f6780c372d
S/Q relation: More Excel compat.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
6761
diff
changeset
|
96 coeffs = linearRegression(sqs); |
48f6780c372d
S/Q relation: More Excel compat.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
6761
diff
changeset
|
97 |
48f6780c372d
S/Q relation: More Excel compat.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
6761
diff
changeset
|
98 instance = function.instantiate(coeffs); |
48f6780c372d
S/Q relation: More Excel compat.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
6761
diff
changeset
|
99 } |
48f6780c372d
S/Q relation: More Excel compat.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
6761
diff
changeset
|
100 |
48f6780c372d
S/Q relation: More Excel compat.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
6761
diff
changeset
|
101 protected double [] linearRegression(List<SQ> sqs) { |
48f6780c372d
S/Q relation: More Excel compat.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
6761
diff
changeset
|
102 |
48f6780c372d
S/Q relation: More Excel compat.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
6761
diff
changeset
|
103 SimpleRegression reg = new SimpleRegression(); |
48f6780c372d
S/Q relation: More Excel compat.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
6761
diff
changeset
|
104 |
48f6780c372d
S/Q relation: More Excel compat.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
6761
diff
changeset
|
105 int invalidPoints = 0; |
48f6780c372d
S/Q relation: More Excel compat.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
6761
diff
changeset
|
106 for (SQ sq: sqs) { |
48f6780c372d
S/Q relation: More Excel compat.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
6761
diff
changeset
|
107 double s = sq.getS(); |
48f6780c372d
S/Q relation: More Excel compat.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
6761
diff
changeset
|
108 double q = sq.getQ(); |
48f6780c372d
S/Q relation: More Excel compat.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
6761
diff
changeset
|
109 if (s <= 0d || q <= 0d) { |
48f6780c372d
S/Q relation: More Excel compat.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
6761
diff
changeset
|
110 ++invalidPoints; |
48f6780c372d
S/Q relation: More Excel compat.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
6761
diff
changeset
|
111 continue; |
48f6780c372d
S/Q relation: More Excel compat.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
6761
diff
changeset
|
112 } |
48f6780c372d
S/Q relation: More Excel compat.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
6761
diff
changeset
|
113 reg.addData(Math.log(q), Math.log(s)); |
48f6780c372d
S/Q relation: More Excel compat.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
6761
diff
changeset
|
114 } |
48f6780c372d
S/Q relation: More Excel compat.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
6761
diff
changeset
|
115 |
48f6780c372d
S/Q relation: More Excel compat.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
6761
diff
changeset
|
116 if (sqs.size() - invalidPoints < 2) { |
48f6780c372d
S/Q relation: More Excel compat.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
6761
diff
changeset
|
117 log.debug("not enough points"); |
48f6780c372d
S/Q relation: More Excel compat.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
6761
diff
changeset
|
118 return new double [] { 0, 0 }; |
48f6780c372d
S/Q relation: More Excel compat.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
6761
diff
changeset
|
119 } |
48f6780c372d
S/Q relation: More Excel compat.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
6761
diff
changeset
|
120 |
48f6780c372d
S/Q relation: More Excel compat.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
6761
diff
changeset
|
121 double a = Math.exp(reg.getIntercept()); |
48f6780c372d
S/Q relation: More Excel compat.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
6761
diff
changeset
|
122 double b = reg.getSlope(); |
48f6780c372d
S/Q relation: More Excel compat.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
6761
diff
changeset
|
123 |
48f6780c372d
S/Q relation: More Excel compat.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
6761
diff
changeset
|
124 if (log.isDebugEnabled()) { |
48f6780c372d
S/Q relation: More Excel compat.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
6761
diff
changeset
|
125 log.debug("invalid points: " + |
48f6780c372d
S/Q relation: More Excel compat.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
6761
diff
changeset
|
126 invalidPoints + " (" + sqs.size() + ")"); |
48f6780c372d
S/Q relation: More Excel compat.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
6761
diff
changeset
|
127 log.debug("a: " + a + " (" + Math.log(a) + ")"); |
48f6780c372d
S/Q relation: More Excel compat.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
6761
diff
changeset
|
128 log.debug("b: " + b); |
48f6780c372d
S/Q relation: More Excel compat.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
6761
diff
changeset
|
129 } |
48f6780c372d
S/Q relation: More Excel compat.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
6761
diff
changeset
|
130 |
48f6780c372d
S/Q relation: More Excel compat.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
6761
diff
changeset
|
131 return new double [] { a, b }; |
48f6780c372d
S/Q relation: More Excel compat.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
6761
diff
changeset
|
132 } |
48f6780c372d
S/Q relation: More Excel compat.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
6761
diff
changeset
|
133 |
48f6780c372d
S/Q relation: More Excel compat.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
6761
diff
changeset
|
134 |
48f6780c372d
S/Q relation: More Excel compat.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
6761
diff
changeset
|
135 protected void nonLinearFitting(List<SQ> sqs) throws MathException { |
48f6780c372d
S/Q relation: More Excel compat.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
6761
diff
changeset
|
136 |
48f6780c372d
S/Q relation: More Excel compat.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
6761
diff
changeset
|
137 LevenbergMarquardtOptimizer optimizer = |
48f6780c372d
S/Q relation: More Excel compat.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
6761
diff
changeset
|
138 new LevenbergMarquardtOptimizer(); |
3552
1df6984628c3
S/Q: Extented the result data model of the S/Q calculation to
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
3190
diff
changeset
|
139 |
6761
9479cb7c8cd5
flys/issue748: Force linear curve fitting. This is a real hack! Set the system property "minfo.sq.fitting.nonlinear" to re-enable the old behavior.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
5994
diff
changeset
|
140 CurveFitter cf = new CurveFitter(optimizer); |
6777
48f6780c372d
S/Q relation: More Excel compat.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
6761
diff
changeset
|
141 |
3566
8d0f06b76e09
S/Q relation: Fixed flys/issue748
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
3552
diff
changeset
|
142 for (SQ sq: sqs) { |
6777
48f6780c372d
S/Q relation: More Excel compat.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
6761
diff
changeset
|
143 cf.addObservedPoint(sq.getS(), sq.getQ()); |
3552
1df6984628c3
S/Q: Extented the result data model of the S/Q calculation to
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
3190
diff
changeset
|
144 } |
1df6984628c3
S/Q: Extented the result data model of the S/Q calculation to
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
3190
diff
changeset
|
145 |
1df6984628c3
S/Q: Extented the result data model of the S/Q calculation to
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
3190
diff
changeset
|
146 coeffs = cf.fit( |
1df6984628c3
S/Q: Extented the result data model of the S/Q calculation to
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
3190
diff
changeset
|
147 function, function.getInitialGuess()); |
1df6984628c3
S/Q: Extented the result data model of the S/Q calculation to
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
3190
diff
changeset
|
148 |
1df6984628c3
S/Q: Extented the result data model of the S/Q calculation to
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
3190
diff
changeset
|
149 instance = function.instantiate(coeffs); |
1df6984628c3
S/Q: Extented the result data model of the S/Q calculation to
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
3190
diff
changeset
|
150 |
6761
9479cb7c8cd5
flys/issue748: Force linear curve fitting. This is a real hack! Set the system property "minfo.sq.fitting.nonlinear" to re-enable the old behavior.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
5994
diff
changeset
|
151 chiSqr = optimizer.getChiSquare(); |
9479cb7c8cd5
flys/issue748: Force linear curve fitting. This is a real hack! Set the system property "minfo.sq.fitting.nonlinear" to re-enable the old behavior.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
5994
diff
changeset
|
152 } |
9479cb7c8cd5
flys/issue748: Force linear curve fitting. This is a real hack! Set the system property "minfo.sq.fitting.nonlinear" to re-enable the old behavior.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
5994
diff
changeset
|
153 |
3552
1df6984628c3
S/Q: Extented the result data model of the S/Q calculation to
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
3190
diff
changeset
|
154 @Override |
1df6984628c3
S/Q: Extented the result data model of the S/Q calculation to
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
3190
diff
changeset
|
155 public double eval(SQ sq) { |
6780
b8f94e865875
S/Q relation: Part I of 'faking' fitting linear data. S/Qs can now be subclassed and processed through views. TODO: Add knob to setup a linear data path.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
6777
diff
changeset
|
156 double s = instance.value(sqView.getQ(sq)); |
b8f94e865875
S/Q relation: Part I of 'faking' fitting linear data. S/Qs can now be subclassed and processed through views. TODO: Add knob to setup a linear data path.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
6777
diff
changeset
|
157 return sqView.getS(sq) - s; |
3552
1df6984628c3
S/Q: Extented the result data model of the S/Q calculation to
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
3190
diff
changeset
|
158 } |
1df6984628c3
S/Q: Extented the result data model of the S/Q calculation to
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
3190
diff
changeset
|
159 |
1df6984628c3
S/Q: Extented the result data model of the S/Q calculation to
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
3190
diff
changeset
|
160 @Override |
3566
8d0f06b76e09
S/Q relation: Fixed flys/issue748
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
3552
diff
changeset
|
161 public void iterationFinished( |
8d0f06b76e09
S/Q relation: Fixed flys/issue748
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
3552
diff
changeset
|
162 double standardDeviation, |
8d0f06b76e09
S/Q relation: Fixed flys/issue748
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
3552
diff
changeset
|
163 SQ outlier, |
8d0f06b76e09
S/Q relation: Fixed flys/issue748
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
3552
diff
changeset
|
164 List<SQ> remainings |
8d0f06b76e09
S/Q relation: Fixed flys/issue748
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
3552
diff
changeset
|
165 ) { |
3552
1df6984628c3
S/Q: Extented the result data model of the S/Q calculation to
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
3190
diff
changeset
|
166 if (log.isDebugEnabled()) { |
1df6984628c3
S/Q: Extented the result data model of the S/Q calculation to
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
3190
diff
changeset
|
167 log.debug("iterationFinished ----"); |
1df6984628c3
S/Q: Extented the result data model of the S/Q calculation to
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
3190
diff
changeset
|
168 log.debug(" num remainings: " + remainings.size()); |
3566
8d0f06b76e09
S/Q relation: Fixed flys/issue748
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
3552
diff
changeset
|
169 log.debug(" has outlier: " + outlier != null); |
3552
1df6984628c3
S/Q: Extented the result data model of the S/Q calculation to
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
3190
diff
changeset
|
170 log.debug(" standardDeviation: " + standardDeviation); |
1df6984628c3
S/Q: Extented the result data model of the S/Q calculation to
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
3190
diff
changeset
|
171 log.debug(" Chi^2: " + chiSqr); |
1df6984628c3
S/Q: Extented the result data model of the S/Q calculation to
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
3190
diff
changeset
|
172 log.debug("---- iterationFinished"); |
1df6984628c3
S/Q: Extented the result data model of the S/Q calculation to
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
3190
diff
changeset
|
173 } |
1df6984628c3
S/Q: Extented the result data model of the S/Q calculation to
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
3190
diff
changeset
|
174 callback.afterIteration( |
1df6984628c3
S/Q: Extented the result data model of the S/Q calculation to
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
3190
diff
changeset
|
175 coeffs, |
1df6984628c3
S/Q: Extented the result data model of the S/Q calculation to
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
3190
diff
changeset
|
176 remainings.toArray(new SQ[remainings.size()]), |
3566
8d0f06b76e09
S/Q relation: Fixed flys/issue748
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
3552
diff
changeset
|
177 outlier != null ? new SQ [] { outlier} : new SQ [] {}, |
3552
1df6984628c3
S/Q: Extented the result data model of the S/Q calculation to
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
3190
diff
changeset
|
178 standardDeviation, |
1df6984628c3
S/Q: Extented the result data model of the S/Q calculation to
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
3190
diff
changeset
|
179 chiSqr); |
3188
1e46ced2bb57
SQ: Added fitting shell for SQ curves.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
180 } |
1e46ced2bb57
SQ: Added fitting shell for SQ curves.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
181 |
6780
b8f94e865875
S/Q relation: Part I of 'faking' fitting linear data. S/Qs can now be subclassed and processed through views. TODO: Add knob to setup a linear data path.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
6777
diff
changeset
|
182 public boolean fit(List<SQ> sqs, String method, Callback callback) { |
3188
1e46ced2bb57
SQ: Added fitting shell for SQ curves.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
183 |
1e46ced2bb57
SQ: Added fitting shell for SQ curves.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
184 if (sqs.size() < 2) { |
1e46ced2bb57
SQ: Added fitting shell for SQ curves.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
185 log.warn("Too less points for fitting."); |
1e46ced2bb57
SQ: Added fitting shell for SQ curves.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
186 return false; |
1e46ced2bb57
SQ: Added fitting shell for SQ curves.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
187 } |
1e46ced2bb57
SQ: Added fitting shell for SQ curves.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
188 |
6780
b8f94e865875
S/Q relation: Part I of 'faking' fitting linear data. S/Qs can now be subclassed and processed through views. TODO: Add knob to setup a linear data path.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
6777
diff
changeset
|
189 sqs = new ArrayList<SQ>(sqs); |
b8f94e865875
S/Q relation: Part I of 'faking' fitting linear data. S/Qs can now be subclassed and processed through views. TODO: Add knob to setup a linear data path.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
6777
diff
changeset
|
190 |
3552
1df6984628c3
S/Q: Extented the result data model of the S/Q calculation to
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
3190
diff
changeset
|
191 this.callback = callback; |
3188
1e46ced2bb57
SQ: Added fitting shell for SQ curves.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
192 |
1e46ced2bb57
SQ: Added fitting shell for SQ curves.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
193 try { |
5396
aaf810d4ec82
Use new state 'outlier mehtod selection' in SQ-relation.
Raimund Renkert <rrenkert@intevation.de>
parents:
3572
diff
changeset
|
194 Outlier.detectOutliers(this, sqs, stdDevFactor, method); |
3188
1e46ced2bb57
SQ: Added fitting shell for SQ curves.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
195 } |
1e46ced2bb57
SQ: Added fitting shell for SQ curves.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
196 catch (MathException me) { |
1e46ced2bb57
SQ: Added fitting shell for SQ curves.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
197 log.warn(me); |
1e46ced2bb57
SQ: Added fitting shell for SQ curves.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
198 return false; |
1e46ced2bb57
SQ: Added fitting shell for SQ curves.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
199 } |
1e46ced2bb57
SQ: Added fitting shell for SQ curves.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
200 |
1e46ced2bb57
SQ: Added fitting shell for SQ curves.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
201 return true; |
1e46ced2bb57
SQ: Added fitting shell for SQ curves.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
202 } |
1e46ced2bb57
SQ: Added fitting shell for SQ curves.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
203 } |
1e46ced2bb57
SQ: Added fitting shell for SQ curves.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
204 // vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 : |