Mercurial > dive4elements > river
annotate artifacts/src/main/java/org/dive4elements/river/utils/DoubleUtil.java @ 9801:1d7a72a50183 3.2.x tip
Assume Compose V2, consistently
author | Tom Gottfried <tom@intevation.de> |
---|---|
date | Thu, 23 Nov 2023 10:14:13 +0100 |
parents | 0a5239a1e46e |
children |
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:
5151
diff
changeset
|
9 package org.dive4elements.river.utils; |
655
913b52064449
Refactored version of "Berechnung 4"
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
10 |
5831
bd047b71ab37
Repaired internal references
Sascha L. Teichmann <teichmann@intevation.de>
parents:
5151
diff
changeset
|
11 import org.dive4elements.river.artifacts.math.Linear; |
3776
1ddbf66a2b0a
Implemented the access for 'Auslagerung extremer Wasserspiegellagen'
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2569
diff
changeset
|
12 |
8581
073ea4bcea58
(issue1755) Interpolate BedQuality Results
Andre Heinecke <andre.heinecke@intevation.de>
parents:
8202
diff
changeset
|
13 import org.apache.commons.math.analysis.interpolation.LinearInterpolator; |
073ea4bcea58
(issue1755) Interpolate BedQuality Results
Andre Heinecke <andre.heinecke@intevation.de>
parents:
8202
diff
changeset
|
14 import org.apache.commons.math.analysis.polynomials.PolynomialSplineFunction; |
073ea4bcea58
(issue1755) Interpolate BedQuality Results
Andre Heinecke <andre.heinecke@intevation.de>
parents:
8202
diff
changeset
|
15 |
073ea4bcea58
(issue1755) Interpolate BedQuality Results
Andre Heinecke <andre.heinecke@intevation.de>
parents:
8202
diff
changeset
|
16 import org.apache.commons.math.exception.DimensionMismatchException; |
073ea4bcea58
(issue1755) Interpolate BedQuality Results
Andre Heinecke <andre.heinecke@intevation.de>
parents:
8202
diff
changeset
|
17 import org.apache.commons.math.exception.NumberIsTooSmallException; |
073ea4bcea58
(issue1755) Interpolate BedQuality Results
Andre Heinecke <andre.heinecke@intevation.de>
parents:
8202
diff
changeset
|
18 import org.apache.commons.math.exception.NonMonotonousSequenceException; |
073ea4bcea58
(issue1755) Interpolate BedQuality Results
Andre Heinecke <andre.heinecke@intevation.de>
parents:
8202
diff
changeset
|
19 |
3776
1ddbf66a2b0a
Implemented the access for 'Auslagerung extremer Wasserspiegellagen'
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2569
diff
changeset
|
20 import gnu.trove.TDoubleArrayList; |
1ddbf66a2b0a
Implemented the access for 'Auslagerung extremer Wasserspiegellagen'
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2569
diff
changeset
|
21 |
1666
09c1292cf36d
Bugfix: #351 Modified determination of single values specified by min/max values and an interval.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents:
655
diff
changeset
|
22 import java.util.Arrays; |
6434
898afcce1d0a
Partial fix for flys/1303
Sascha L. Teichmann <teichmann@intevation.de>
parents:
5994
diff
changeset
|
23 import java.util.Comparator; |
1666
09c1292cf36d
Bugfix: #351 Modified determination of single values specified by min/max values and an interval.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents:
655
diff
changeset
|
24 |
9726 | 25 import org.apache.logging.log4j.Logger; |
26 import org.apache.logging.log4j.LogManager; | |
1666
09c1292cf36d
Bugfix: #351 Modified determination of single values specified by min/max values and an interval.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents:
655
diff
changeset
|
27 |
4052
6d8c7a00e74e
Do cumentation.
Felix Wolfsteller <felix.wolfsteller@intevation.de>
parents:
3785
diff
changeset
|
28 /** Utils to deal with Double precision values. */ |
655
913b52064449
Refactored version of "Berechnung 4"
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
29 public class DoubleUtil |
913b52064449
Refactored version of "Berechnung 4"
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
30 { |
8202
e4606eae8ea5
sed src/**/*.java 's/logger/log/g'
Sascha L. Teichmann <teichmann@intevation.de>
parents:
8053
diff
changeset
|
31 /** Private log. */ |
9726 | 32 private static Logger log = LogManager.getLogger(DoubleUtil.class); |
3776
1ddbf66a2b0a
Implemented the access for 'Auslagerung extremer Wasserspiegellagen'
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2569
diff
changeset
|
33 |
655
913b52064449
Refactored version of "Berechnung 4"
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
34 public static final double DEFAULT_STEP_PRECISION = 1e6; |
913b52064449
Refactored version of "Berechnung 4"
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
35 |
6434
898afcce1d0a
Partial fix for flys/1303
Sascha L. Teichmann <teichmann@intevation.de>
parents:
5994
diff
changeset
|
36 public static final Comparator<double []> DOUBLE_PAIR_CMP = |
898afcce1d0a
Partial fix for flys/1303
Sascha L. Teichmann <teichmann@intevation.de>
parents:
5994
diff
changeset
|
37 new Comparator<double []>() { |
898afcce1d0a
Partial fix for flys/1303
Sascha L. Teichmann <teichmann@intevation.de>
parents:
5994
diff
changeset
|
38 @Override |
898afcce1d0a
Partial fix for flys/1303
Sascha L. Teichmann <teichmann@intevation.de>
parents:
5994
diff
changeset
|
39 public int compare(double [] a, double [] b) { |
898afcce1d0a
Partial fix for flys/1303
Sascha L. Teichmann <teichmann@intevation.de>
parents:
5994
diff
changeset
|
40 double diff = a[0] - b[0]; |
898afcce1d0a
Partial fix for flys/1303
Sascha L. Teichmann <teichmann@intevation.de>
parents:
5994
diff
changeset
|
41 if (diff < 0d) return -1; |
898afcce1d0a
Partial fix for flys/1303
Sascha L. Teichmann <teichmann@intevation.de>
parents:
5994
diff
changeset
|
42 if (diff > 0d) return +1; |
898afcce1d0a
Partial fix for flys/1303
Sascha L. Teichmann <teichmann@intevation.de>
parents:
5994
diff
changeset
|
43 return 0; |
898afcce1d0a
Partial fix for flys/1303
Sascha L. Teichmann <teichmann@intevation.de>
parents:
5994
diff
changeset
|
44 } |
898afcce1d0a
Partial fix for flys/1303
Sascha L. Teichmann <teichmann@intevation.de>
parents:
5994
diff
changeset
|
45 }; |
898afcce1d0a
Partial fix for flys/1303
Sascha L. Teichmann <teichmann@intevation.de>
parents:
5994
diff
changeset
|
46 |
5151
240ff7aeb6de
DoubleUtil: Use tolerance when comparing doubles in explode(). Fixes flys/issue1132.
Felix Wolfsteller <felix.wolfsteller@intevation.de>
parents:
5150
diff
changeset
|
47 /** EPSILON for comparison of double precision values. */ |
240ff7aeb6de
DoubleUtil: Use tolerance when comparing doubles in explode(). Fixes flys/issue1132.
Felix Wolfsteller <felix.wolfsteller@intevation.de>
parents:
5150
diff
changeset
|
48 public static final double EPSILON = 1e-4; |
240ff7aeb6de
DoubleUtil: Use tolerance when comparing doubles in explode(). Fixes flys/issue1132.
Felix Wolfsteller <felix.wolfsteller@intevation.de>
parents:
5150
diff
changeset
|
49 |
655
913b52064449
Refactored version of "Berechnung 4"
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
50 private DoubleUtil() { |
913b52064449
Refactored version of "Berechnung 4"
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
51 } |
913b52064449
Refactored version of "Berechnung 4"
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
52 |
8856 | 53 public static final double [] explode( |
54 double from, | |
55 double to, | |
56 double step | |
57 ) { | |
655
913b52064449
Refactored version of "Berechnung 4"
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
58 return explode(from, to, step, DEFAULT_STEP_PRECISION); |
913b52064449
Refactored version of "Berechnung 4"
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
59 } |
913b52064449
Refactored version of "Berechnung 4"
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
60 |
913b52064449
Refactored version of "Berechnung 4"
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
61 public static final double round(double x, double precision) { |
913b52064449
Refactored version of "Berechnung 4"
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
62 return Math.round(x * precision)/precision; |
913b52064449
Refactored version of "Berechnung 4"
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
63 } |
913b52064449
Refactored version of "Berechnung 4"
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
64 |
913b52064449
Refactored version of "Berechnung 4"
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
65 public static final double round(double x) { |
913b52064449
Refactored version of "Berechnung 4"
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
66 return Math.round(x * DEFAULT_STEP_PRECISION)/DEFAULT_STEP_PRECISION; |
913b52064449
Refactored version of "Berechnung 4"
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
67 } |
913b52064449
Refactored version of "Berechnung 4"
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
68 |
5150
345f3bba6f15
Doc fixes.
Felix Wolfsteller <felix.wolfsteller@intevation.de>
parents:
5104
diff
changeset
|
69 /** |
8856 | 70 * Returns array with values from parameter from to to |
71 * with given step width. | |
5150
345f3bba6f15
Doc fixes.
Felix Wolfsteller <felix.wolfsteller@intevation.de>
parents:
5104
diff
changeset
|
72 * from and to are included. |
345f3bba6f15
Doc fixes.
Felix Wolfsteller <felix.wolfsteller@intevation.de>
parents:
5104
diff
changeset
|
73 */ |
655
913b52064449
Refactored version of "Berechnung 4"
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
74 public static final double [] explode( |
913b52064449
Refactored version of "Berechnung 4"
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
75 double from, |
913b52064449
Refactored version of "Berechnung 4"
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
76 double to, |
913b52064449
Refactored version of "Berechnung 4"
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
77 double step, |
913b52064449
Refactored version of "Berechnung 4"
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
78 double precision |
913b52064449
Refactored version of "Berechnung 4"
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
79 ) { |
913b52064449
Refactored version of "Berechnung 4"
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
80 double lower = from; |
913b52064449
Refactored version of "Berechnung 4"
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
81 |
913b52064449
Refactored version of "Berechnung 4"
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
82 double diff = to - from; |
913b52064449
Refactored version of "Berechnung 4"
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
83 double tmp = diff / step; |
913b52064449
Refactored version of "Berechnung 4"
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
84 int num = (int)Math.abs(Math.ceil(tmp)) + 1; |
913b52064449
Refactored version of "Berechnung 4"
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
85 |
4163
2b4f78ccfbaa
Made DoubleUtil.explode() more robust against invalid result array sizes.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
4052
diff
changeset
|
86 if (num < 1) { |
2b4f78ccfbaa
Made DoubleUtil.explode() more robust against invalid result array sizes.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
4052
diff
changeset
|
87 return new double[0]; |
2b4f78ccfbaa
Made DoubleUtil.explode() more robust against invalid result array sizes.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
4052
diff
changeset
|
88 } |
2b4f78ccfbaa
Made DoubleUtil.explode() more robust against invalid result array sizes.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
4052
diff
changeset
|
89 |
655
913b52064449
Refactored version of "Berechnung 4"
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
90 double [] values = new double[num]; |
913b52064449
Refactored version of "Berechnung 4"
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
91 |
913b52064449
Refactored version of "Berechnung 4"
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
92 if (from > to) { |
913b52064449
Refactored version of "Berechnung 4"
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
93 step = -step; |
913b52064449
Refactored version of "Berechnung 4"
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
94 } |
913b52064449
Refactored version of "Berechnung 4"
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
95 |
1666
09c1292cf36d
Bugfix: #351 Modified determination of single values specified by min/max values and an interval.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents:
655
diff
changeset
|
96 double max = Math.max(from, to); |
09c1292cf36d
Bugfix: #351 Modified determination of single values specified by min/max values and an interval.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents:
655
diff
changeset
|
97 |
655
913b52064449
Refactored version of "Berechnung 4"
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
98 for (int idx = 0; idx < num; idx++) { |
5151
240ff7aeb6de
DoubleUtil: Use tolerance when comparing doubles in explode(). Fixes flys/issue1132.
Felix Wolfsteller <felix.wolfsteller@intevation.de>
parents:
5150
diff
changeset
|
99 if (lower - max > EPSILON) { |
1666
09c1292cf36d
Bugfix: #351 Modified determination of single values specified by min/max values and an interval.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents:
655
diff
changeset
|
100 return Arrays.copyOfRange(values, 0, idx); |
09c1292cf36d
Bugfix: #351 Modified determination of single values specified by min/max values and an interval.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents:
655
diff
changeset
|
101 } |
09c1292cf36d
Bugfix: #351 Modified determination of single values specified by min/max values and an interval.
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents:
655
diff
changeset
|
102 |
655
913b52064449
Refactored version of "Berechnung 4"
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
103 values[idx] = round(lower, precision); |
913b52064449
Refactored version of "Berechnung 4"
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
104 lower += step; |
913b52064449
Refactored version of "Berechnung 4"
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
105 } |
913b52064449
Refactored version of "Berechnung 4"
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
106 |
913b52064449
Refactored version of "Berechnung 4"
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
107 return values; |
913b52064449
Refactored version of "Berechnung 4"
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
108 } |
1671
da872168a899
Added code to interpolate double values in a sorted array
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
1666
diff
changeset
|
109 |
da872168a899
Added code to interpolate double values in a sorted array
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
1666
diff
changeset
|
110 public static final double interpolateSorted( |
da872168a899
Added code to interpolate double values in a sorted array
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
1666
diff
changeset
|
111 double [] xs, |
da872168a899
Added code to interpolate double values in a sorted array
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
1666
diff
changeset
|
112 double [] ys, |
da872168a899
Added code to interpolate double values in a sorted array
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
1666
diff
changeset
|
113 double x |
da872168a899
Added code to interpolate double values in a sorted array
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
1666
diff
changeset
|
114 ) { |
da872168a899
Added code to interpolate double values in a sorted array
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
1666
diff
changeset
|
115 int lo = 0, hi = xs.length-1; |
da872168a899
Added code to interpolate double values in a sorted array
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
1666
diff
changeset
|
116 |
da872168a899
Added code to interpolate double values in a sorted array
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
1666
diff
changeset
|
117 int mid = -1; |
da872168a899
Added code to interpolate double values in a sorted array
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
1666
diff
changeset
|
118 |
da872168a899
Added code to interpolate double values in a sorted array
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
1666
diff
changeset
|
119 while (lo <= hi) { |
da872168a899
Added code to interpolate double values in a sorted array
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
1666
diff
changeset
|
120 mid = (lo + hi) >> 1; |
da872168a899
Added code to interpolate double values in a sorted array
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
1666
diff
changeset
|
121 double mx = xs[mid]; |
da872168a899
Added code to interpolate double values in a sorted array
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
1666
diff
changeset
|
122 if (x < mx) hi = mid - 1; |
da872168a899
Added code to interpolate double values in a sorted array
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
1666
diff
changeset
|
123 else if (x > mx) lo = mid + 1; |
da872168a899
Added code to interpolate double values in a sorted array
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
1666
diff
changeset
|
124 else return ys[mid]; |
da872168a899
Added code to interpolate double values in a sorted array
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
1666
diff
changeset
|
125 } |
da872168a899
Added code to interpolate double values in a sorted array
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
1666
diff
changeset
|
126 if (mid < lo) { |
da872168a899
Added code to interpolate double values in a sorted array
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
1666
diff
changeset
|
127 return lo >= xs.length |
da872168a899
Added code to interpolate double values in a sorted array
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
1666
diff
changeset
|
128 ? Double.NaN |
da872168a899
Added code to interpolate double values in a sorted array
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
1666
diff
changeset
|
129 : Linear.linear(x, xs[mid], xs[mid+1], ys[mid], ys[mid+1]); |
da872168a899
Added code to interpolate double values in a sorted array
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
1666
diff
changeset
|
130 } |
da872168a899
Added code to interpolate double values in a sorted array
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
1666
diff
changeset
|
131 return hi < 0 |
da872168a899
Added code to interpolate double values in a sorted array
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
1666
diff
changeset
|
132 ? Double.NaN |
da872168a899
Added code to interpolate double values in a sorted array
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
1666
diff
changeset
|
133 : Linear.linear(x, xs[mid-1], xs[mid], ys[mid-1], ys[mid]); |
da872168a899
Added code to interpolate double values in a sorted array
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
1666
diff
changeset
|
134 } |
1672
0b6dac664bbb
Moved some generic double array code from BackjumpCorrector to DoubleUtil
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
1671
diff
changeset
|
135 |
0b6dac664bbb
Moved some generic double array code from BackjumpCorrector to DoubleUtil
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
1671
diff
changeset
|
136 public static final boolean isIncreasing(double [] array) { |
0b6dac664bbb
Moved some generic double array code from BackjumpCorrector to DoubleUtil
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
1671
diff
changeset
|
137 int inc = 0; |
0b6dac664bbb
Moved some generic double array code from BackjumpCorrector to DoubleUtil
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
1671
diff
changeset
|
138 int dec = 0; |
0b6dac664bbb
Moved some generic double array code from BackjumpCorrector to DoubleUtil
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
1671
diff
changeset
|
139 int sweet = (array.length-1)/2; |
0b6dac664bbb
Moved some generic double array code from BackjumpCorrector to DoubleUtil
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
1671
diff
changeset
|
140 for (int i = 1; i < array.length; ++i) { |
0b6dac664bbb
Moved some generic double array code from BackjumpCorrector to DoubleUtil
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
1671
diff
changeset
|
141 if (array[i] > array[i-1]) { |
0b6dac664bbb
Moved some generic double array code from BackjumpCorrector to DoubleUtil
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
1671
diff
changeset
|
142 if (++inc > sweet) { |
0b6dac664bbb
Moved some generic double array code from BackjumpCorrector to DoubleUtil
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
1671
diff
changeset
|
143 return true; |
0b6dac664bbb
Moved some generic double array code from BackjumpCorrector to DoubleUtil
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
1671
diff
changeset
|
144 } |
0b6dac664bbb
Moved some generic double array code from BackjumpCorrector to DoubleUtil
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
1671
diff
changeset
|
145 } |
0b6dac664bbb
Moved some generic double array code from BackjumpCorrector to DoubleUtil
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
1671
diff
changeset
|
146 else if (++dec > sweet) { |
0b6dac664bbb
Moved some generic double array code from BackjumpCorrector to DoubleUtil
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
1671
diff
changeset
|
147 return false; |
0b6dac664bbb
Moved some generic double array code from BackjumpCorrector to DoubleUtil
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
1671
diff
changeset
|
148 } |
0b6dac664bbb
Moved some generic double array code from BackjumpCorrector to DoubleUtil
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
1671
diff
changeset
|
149 } |
0b6dac664bbb
Moved some generic double array code from BackjumpCorrector to DoubleUtil
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
1671
diff
changeset
|
150 return inc > sweet; |
0b6dac664bbb
Moved some generic double array code from BackjumpCorrector to DoubleUtil
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
1671
diff
changeset
|
151 } |
0b6dac664bbb
Moved some generic double array code from BackjumpCorrector to DoubleUtil
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
1671
diff
changeset
|
152 |
0b6dac664bbb
Moved some generic double array code from BackjumpCorrector to DoubleUtil
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
1671
diff
changeset
|
153 public static final double [] swap(double [] array) { |
0b6dac664bbb
Moved some generic double array code from BackjumpCorrector to DoubleUtil
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
1671
diff
changeset
|
154 int lo = 0; |
0b6dac664bbb
Moved some generic double array code from BackjumpCorrector to DoubleUtil
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
1671
diff
changeset
|
155 int hi = array.length-1; |
0b6dac664bbb
Moved some generic double array code from BackjumpCorrector to DoubleUtil
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
1671
diff
changeset
|
156 while (hi > lo) { |
0b6dac664bbb
Moved some generic double array code from BackjumpCorrector to DoubleUtil
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
1671
diff
changeset
|
157 double t = array[lo]; |
0b6dac664bbb
Moved some generic double array code from BackjumpCorrector to DoubleUtil
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
1671
diff
changeset
|
158 array[lo] = array[hi]; |
0b6dac664bbb
Moved some generic double array code from BackjumpCorrector to DoubleUtil
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
1671
diff
changeset
|
159 array[hi] = t; |
0b6dac664bbb
Moved some generic double array code from BackjumpCorrector to DoubleUtil
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
1671
diff
changeset
|
160 ++lo; |
0b6dac664bbb
Moved some generic double array code from BackjumpCorrector to DoubleUtil
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
1671
diff
changeset
|
161 --hi; |
0b6dac664bbb
Moved some generic double array code from BackjumpCorrector to DoubleUtil
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
1671
diff
changeset
|
162 } |
0b6dac664bbb
Moved some generic double array code from BackjumpCorrector to DoubleUtil
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
1671
diff
changeset
|
163 |
0b6dac664bbb
Moved some generic double array code from BackjumpCorrector to DoubleUtil
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
1671
diff
changeset
|
164 return array; |
0b6dac664bbb
Moved some generic double array code from BackjumpCorrector to DoubleUtil
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
1671
diff
changeset
|
165 } |
0b6dac664bbb
Moved some generic double array code from BackjumpCorrector to DoubleUtil
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
1671
diff
changeset
|
166 |
0b6dac664bbb
Moved some generic double array code from BackjumpCorrector to DoubleUtil
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
1671
diff
changeset
|
167 public static final double [] swapClone(double [] in) { |
0b6dac664bbb
Moved some generic double array code from BackjumpCorrector to DoubleUtil
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
1671
diff
changeset
|
168 double [] out = new double[in.length]; |
0b6dac664bbb
Moved some generic double array code from BackjumpCorrector to DoubleUtil
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
1671
diff
changeset
|
169 |
0b6dac664bbb
Moved some generic double array code from BackjumpCorrector to DoubleUtil
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
1671
diff
changeset
|
170 for (int j = out.length-1, i = 0; j >= 0;) { |
0b6dac664bbb
Moved some generic double array code from BackjumpCorrector to DoubleUtil
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
1671
diff
changeset
|
171 out[j--] = in[i++]; |
0b6dac664bbb
Moved some generic double array code from BackjumpCorrector to DoubleUtil
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
1671
diff
changeset
|
172 } |
0b6dac664bbb
Moved some generic double array code from BackjumpCorrector to DoubleUtil
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
1671
diff
changeset
|
173 |
0b6dac664bbb
Moved some generic double array code from BackjumpCorrector to DoubleUtil
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
1671
diff
changeset
|
174 return out; |
0b6dac664bbb
Moved some generic double array code from BackjumpCorrector to DoubleUtil
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
1671
diff
changeset
|
175 } |
0b6dac664bbb
Moved some generic double array code from BackjumpCorrector to DoubleUtil
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
1671
diff
changeset
|
176 |
0b6dac664bbb
Moved some generic double array code from BackjumpCorrector to DoubleUtil
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
1671
diff
changeset
|
177 public static final double [] sumDiffs(double [] in) { |
0b6dac664bbb
Moved some generic double array code from BackjumpCorrector to DoubleUtil
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
1671
diff
changeset
|
178 double [] out = new double[in.length]; |
0b6dac664bbb
Moved some generic double array code from BackjumpCorrector to DoubleUtil
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
1671
diff
changeset
|
179 |
0b6dac664bbb
Moved some generic double array code from BackjumpCorrector to DoubleUtil
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
1671
diff
changeset
|
180 for (int i = 1; i < out.length; ++i) { |
0b6dac664bbb
Moved some generic double array code from BackjumpCorrector to DoubleUtil
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
1671
diff
changeset
|
181 out[i] = out[i-1] + Math.abs(in[i-1] - in[i]); |
0b6dac664bbb
Moved some generic double array code from BackjumpCorrector to DoubleUtil
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
1671
diff
changeset
|
182 } |
0b6dac664bbb
Moved some generic double array code from BackjumpCorrector to DoubleUtil
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
1671
diff
changeset
|
183 |
0b6dac664bbb
Moved some generic double array code from BackjumpCorrector to DoubleUtil
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
1671
diff
changeset
|
184 return out; |
0b6dac664bbb
Moved some generic double array code from BackjumpCorrector to DoubleUtil
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
1671
diff
changeset
|
185 } |
2569
0dd58ab7e118
Added functions to be used for fitting in the "Fixierungsanalyse" and "Extremwertermittlung".
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
1672
diff
changeset
|
186 |
8053
72760ca2fc2b
Sediment load: dispatch calculation modes.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
7594
diff
changeset
|
187 public static final double sum(double [] values) { |
72760ca2fc2b
Sediment load: dispatch calculation modes.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
7594
diff
changeset
|
188 double sum = 0.0; |
72760ca2fc2b
Sediment load: dispatch calculation modes.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
7594
diff
changeset
|
189 for (double value: values) { |
72760ca2fc2b
Sediment load: dispatch calculation modes.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
7594
diff
changeset
|
190 sum += value; |
72760ca2fc2b
Sediment load: dispatch calculation modes.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
7594
diff
changeset
|
191 } |
72760ca2fc2b
Sediment load: dispatch calculation modes.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
7594
diff
changeset
|
192 return sum; |
72760ca2fc2b
Sediment load: dispatch calculation modes.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
7594
diff
changeset
|
193 } |
72760ca2fc2b
Sediment load: dispatch calculation modes.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
7594
diff
changeset
|
194 |
2569
0dd58ab7e118
Added functions to be used for fitting in the "Fixierungsanalyse" and "Extremwertermittlung".
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
1672
diff
changeset
|
195 public static final double [] fill(int N, double value) { |
0dd58ab7e118
Added functions to be used for fitting in the "Fixierungsanalyse" and "Extremwertermittlung".
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
1672
diff
changeset
|
196 double [] result = new double[N]; |
0dd58ab7e118
Added functions to be used for fitting in the "Fixierungsanalyse" and "Extremwertermittlung".
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
1672
diff
changeset
|
197 Arrays.fill(result, value); |
0dd58ab7e118
Added functions to be used for fitting in the "Fixierungsanalyse" and "Extremwertermittlung".
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
1672
diff
changeset
|
198 return result; |
0dd58ab7e118
Added functions to be used for fitting in the "Fixierungsanalyse" and "Extremwertermittlung".
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
1672
diff
changeset
|
199 } |
3776
1ddbf66a2b0a
Implemented the access for 'Auslagerung extremer Wasserspiegellagen'
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2569
diff
changeset
|
200 |
4052
6d8c7a00e74e
Do cumentation.
Felix Wolfsteller <felix.wolfsteller@intevation.de>
parents:
3785
diff
changeset
|
201 |
6d8c7a00e74e
Do cumentation.
Felix Wolfsteller <felix.wolfsteller@intevation.de>
parents:
3785
diff
changeset
|
202 /** Use with parseSegments. */ |
3776
1ddbf66a2b0a
Implemented the access for 'Auslagerung extremer Wasserspiegellagen'
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2569
diff
changeset
|
203 public interface SegmentCallback { |
1ddbf66a2b0a
Implemented the access for 'Auslagerung extremer Wasserspiegellagen'
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2569
diff
changeset
|
204 void newSegment(double from, double to, double [] values); |
1ddbf66a2b0a
Implemented the access for 'Auslagerung extremer Wasserspiegellagen'
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2569
diff
changeset
|
205 } |
1ddbf66a2b0a
Implemented the access for 'Auslagerung extremer Wasserspiegellagen'
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2569
diff
changeset
|
206 |
4052
6d8c7a00e74e
Do cumentation.
Felix Wolfsteller <felix.wolfsteller@intevation.de>
parents:
3785
diff
changeset
|
207 |
6d8c7a00e74e
Do cumentation.
Felix Wolfsteller <felix.wolfsteller@intevation.de>
parents:
3785
diff
changeset
|
208 /** Call callback for every string split by colon. |
4433
5b8919ef601d
Backed out changeset e8a4d2fd25cc
Felix Wolfsteller <felix.wolfsteller@intevation.de>
parents:
4432
diff
changeset
|
209 * Expected format FROM:TO:VALUE1,VALUE2,VALUE3*/ |
3776
1ddbf66a2b0a
Implemented the access for 'Auslagerung extremer Wasserspiegellagen'
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2569
diff
changeset
|
210 public static final void parseSegments( |
1ddbf66a2b0a
Implemented the access for 'Auslagerung extremer Wasserspiegellagen'
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2569
diff
changeset
|
211 String input, |
1ddbf66a2b0a
Implemented the access for 'Auslagerung extremer Wasserspiegellagen'
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2569
diff
changeset
|
212 SegmentCallback callback |
1ddbf66a2b0a
Implemented the access for 'Auslagerung extremer Wasserspiegellagen'
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2569
diff
changeset
|
213 ) { |
1ddbf66a2b0a
Implemented the access for 'Auslagerung extremer Wasserspiegellagen'
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2569
diff
changeset
|
214 TDoubleArrayList vs = new TDoubleArrayList(); |
1ddbf66a2b0a
Implemented the access for 'Auslagerung extremer Wasserspiegellagen'
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2569
diff
changeset
|
215 |
1ddbf66a2b0a
Implemented the access for 'Auslagerung extremer Wasserspiegellagen'
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2569
diff
changeset
|
216 for (String segmentStr: input.split(":")) { |
1ddbf66a2b0a
Implemented the access for 'Auslagerung extremer Wasserspiegellagen'
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2569
diff
changeset
|
217 String [] parts = segmentStr.split(";"); |
1ddbf66a2b0a
Implemented the access for 'Auslagerung extremer Wasserspiegellagen'
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2569
diff
changeset
|
218 if (parts.length < 3) { |
1ddbf66a2b0a
Implemented the access for 'Auslagerung extremer Wasserspiegellagen'
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2569
diff
changeset
|
219 log.warn("invalid segment: '" + segmentStr + "'"); |
1ddbf66a2b0a
Implemented the access for 'Auslagerung extremer Wasserspiegellagen'
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2569
diff
changeset
|
220 continue; |
1ddbf66a2b0a
Implemented the access for 'Auslagerung extremer Wasserspiegellagen'
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2569
diff
changeset
|
221 } |
1ddbf66a2b0a
Implemented the access for 'Auslagerung extremer Wasserspiegellagen'
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2569
diff
changeset
|
222 try { |
1ddbf66a2b0a
Implemented the access for 'Auslagerung extremer Wasserspiegellagen'
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2569
diff
changeset
|
223 double from = Double.parseDouble(parts[0].trim()); |
1ddbf66a2b0a
Implemented the access for 'Auslagerung extremer Wasserspiegellagen'
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2569
diff
changeset
|
224 double to = Double.parseDouble(parts[1].trim()); |
1ddbf66a2b0a
Implemented the access for 'Auslagerung extremer Wasserspiegellagen'
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2569
diff
changeset
|
225 |
1ddbf66a2b0a
Implemented the access for 'Auslagerung extremer Wasserspiegellagen'
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2569
diff
changeset
|
226 vs.resetQuick(); |
1ddbf66a2b0a
Implemented the access for 'Auslagerung extremer Wasserspiegellagen'
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2569
diff
changeset
|
227 |
5104
5f70c73b11ed
Display gauge names in WQAdapted input panel instead of gauge range.
Raimund Renkert <rrenkert@intevation.de>
parents:
4821
diff
changeset
|
228 for (String valueStr: parts[3].split(",")) { |
3776
1ddbf66a2b0a
Implemented the access for 'Auslagerung extremer Wasserspiegellagen'
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2569
diff
changeset
|
229 vs.add(round(Double.parseDouble(valueStr.trim()))); |
1ddbf66a2b0a
Implemented the access for 'Auslagerung extremer Wasserspiegellagen'
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2569
diff
changeset
|
230 } |
1ddbf66a2b0a
Implemented the access for 'Auslagerung extremer Wasserspiegellagen'
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2569
diff
changeset
|
231 |
1ddbf66a2b0a
Implemented the access for 'Auslagerung extremer Wasserspiegellagen'
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2569
diff
changeset
|
232 callback.newSegment(from, to, vs.toNativeArray()); |
1ddbf66a2b0a
Implemented the access for 'Auslagerung extremer Wasserspiegellagen'
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2569
diff
changeset
|
233 } |
1ddbf66a2b0a
Implemented the access for 'Auslagerung extremer Wasserspiegellagen'
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2569
diff
changeset
|
234 catch (NumberFormatException nfe) { |
1ddbf66a2b0a
Implemented the access for 'Auslagerung extremer Wasserspiegellagen'
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2569
diff
changeset
|
235 log.warn("invalid segment: '" + segmentStr + "'"); |
1ddbf66a2b0a
Implemented the access for 'Auslagerung extremer Wasserspiegellagen'
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2569
diff
changeset
|
236 } |
1ddbf66a2b0a
Implemented the access for 'Auslagerung extremer Wasserspiegellagen'
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2569
diff
changeset
|
237 } |
1ddbf66a2b0a
Implemented the access for 'Auslagerung extremer Wasserspiegellagen'
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2569
diff
changeset
|
238 } |
3785
a5f65e8983be
Merged revisions 5501-5502,5504-5508,5511-5513,5516-5519 via svnmerge from
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents:
3776
diff
changeset
|
239 |
a5f65e8983be
Merged revisions 5501-5502,5504-5508,5511-5513,5516-5519 via svnmerge from
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents:
3776
diff
changeset
|
240 public static final boolean isValid(double [][] data) { |
a5f65e8983be
Merged revisions 5501-5502,5504-5508,5511-5513,5516-5519 via svnmerge from
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents:
3776
diff
changeset
|
241 for (double [] ds: data) { |
7594
eb4ca9a7eaca
Add isValid method for single double arrays
Andre Heinecke <aheinecke@intevation.de>
parents:
6434
diff
changeset
|
242 if (!isValid(ds)) { |
eb4ca9a7eaca
Add isValid method for single double arrays
Andre Heinecke <aheinecke@intevation.de>
parents:
6434
diff
changeset
|
243 return false; |
3785
a5f65e8983be
Merged revisions 5501-5502,5504-5508,5511-5513,5516-5519 via svnmerge from
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents:
3776
diff
changeset
|
244 } |
a5f65e8983be
Merged revisions 5501-5502,5504-5508,5511-5513,5516-5519 via svnmerge from
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents:
3776
diff
changeset
|
245 } |
a5f65e8983be
Merged revisions 5501-5502,5504-5508,5511-5513,5516-5519 via svnmerge from
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents:
3776
diff
changeset
|
246 return true; |
a5f65e8983be
Merged revisions 5501-5502,5504-5508,5511-5513,5516-5519 via svnmerge from
Ingo Weinzierl <ingo.weinzierl@intevation.de>
parents:
3776
diff
changeset
|
247 } |
4340
64528d2a89c4
DoubleUtil: New function to find max in an double array.
Felix Wolfsteller <felix.wolfsteller@intevation.de>
parents:
4163
diff
changeset
|
248 |
7594
eb4ca9a7eaca
Add isValid method for single double arrays
Andre Heinecke <aheinecke@intevation.de>
parents:
6434
diff
changeset
|
249 public static final boolean isValid(double [] data) { |
eb4ca9a7eaca
Add isValid method for single double arrays
Andre Heinecke <aheinecke@intevation.de>
parents:
6434
diff
changeset
|
250 for (double d: data) { |
eb4ca9a7eaca
Add isValid method for single double arrays
Andre Heinecke <aheinecke@intevation.de>
parents:
6434
diff
changeset
|
251 if (Double.isNaN(d)) { |
eb4ca9a7eaca
Add isValid method for single double arrays
Andre Heinecke <aheinecke@intevation.de>
parents:
6434
diff
changeset
|
252 return false; |
eb4ca9a7eaca
Add isValid method for single double arrays
Andre Heinecke <aheinecke@intevation.de>
parents:
6434
diff
changeset
|
253 } |
eb4ca9a7eaca
Add isValid method for single double arrays
Andre Heinecke <aheinecke@intevation.de>
parents:
6434
diff
changeset
|
254 } |
eb4ca9a7eaca
Add isValid method for single double arrays
Andre Heinecke <aheinecke@intevation.de>
parents:
6434
diff
changeset
|
255 return true; |
eb4ca9a7eaca
Add isValid method for single double arrays
Andre Heinecke <aheinecke@intevation.de>
parents:
6434
diff
changeset
|
256 } |
4340
64528d2a89c4
DoubleUtil: New function to find max in an double array.
Felix Wolfsteller <felix.wolfsteller@intevation.de>
parents:
4163
diff
changeset
|
257 |
8053
72760ca2fc2b
Sediment load: dispatch calculation modes.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
7594
diff
changeset
|
258 public static final boolean isNaN(double [] values) { |
72760ca2fc2b
Sediment load: dispatch calculation modes.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
7594
diff
changeset
|
259 for (double value: values) { |
72760ca2fc2b
Sediment load: dispatch calculation modes.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
7594
diff
changeset
|
260 if (!Double.isNaN(value)) { |
72760ca2fc2b
Sediment load: dispatch calculation modes.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
7594
diff
changeset
|
261 return false; |
72760ca2fc2b
Sediment load: dispatch calculation modes.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
7594
diff
changeset
|
262 } |
72760ca2fc2b
Sediment load: dispatch calculation modes.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
7594
diff
changeset
|
263 } |
72760ca2fc2b
Sediment load: dispatch calculation modes.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
7594
diff
changeset
|
264 return true; |
72760ca2fc2b
Sediment load: dispatch calculation modes.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
7594
diff
changeset
|
265 } |
72760ca2fc2b
Sediment load: dispatch calculation modes.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
7594
diff
changeset
|
266 |
4340
64528d2a89c4
DoubleUtil: New function to find max in an double array.
Felix Wolfsteller <felix.wolfsteller@intevation.de>
parents:
4163
diff
changeset
|
267 /** In an array of doubles, search and return the maximum value. */ |
64528d2a89c4
DoubleUtil: New function to find max in an double array.
Felix Wolfsteller <felix.wolfsteller@intevation.de>
parents:
4163
diff
changeset
|
268 public static final double maxInArray(double[] values) { |
64528d2a89c4
DoubleUtil: New function to find max in an double array.
Felix Wolfsteller <felix.wolfsteller@intevation.de>
parents:
4163
diff
changeset
|
269 double max = - Double.MAX_VALUE; |
64528d2a89c4
DoubleUtil: New function to find max in an double array.
Felix Wolfsteller <felix.wolfsteller@intevation.de>
parents:
4163
diff
changeset
|
270 for (double d: values) { |
64528d2a89c4
DoubleUtil: New function to find max in an double array.
Felix Wolfsteller <felix.wolfsteller@intevation.de>
parents:
4163
diff
changeset
|
271 if (d > max) max = d; |
64528d2a89c4
DoubleUtil: New function to find max in an double array.
Felix Wolfsteller <felix.wolfsteller@intevation.de>
parents:
4163
diff
changeset
|
272 } |
64528d2a89c4
DoubleUtil: New function to find max in an double array.
Felix Wolfsteller <felix.wolfsteller@intevation.de>
parents:
4163
diff
changeset
|
273 return max; |
64528d2a89c4
DoubleUtil: New function to find max in an double array.
Felix Wolfsteller <felix.wolfsteller@intevation.de>
parents:
4163
diff
changeset
|
274 } |
4821
bcf25d8c183e
Moved NaN removal code from W to DoubleUtil. Create QKms when calculating the 'Umhuellende'.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
4433
diff
changeset
|
275 |
6434
898afcce1d0a
Partial fix for flys/1303
Sascha L. Teichmann <teichmann@intevation.de>
parents:
5994
diff
changeset
|
276 |
898afcce1d0a
Partial fix for flys/1303
Sascha L. Teichmann <teichmann@intevation.de>
parents:
5994
diff
changeset
|
277 |
898afcce1d0a
Partial fix for flys/1303
Sascha L. Teichmann <teichmann@intevation.de>
parents:
5994
diff
changeset
|
278 /** Sort a and b with a as key. b is ordered accordingly */ |
898afcce1d0a
Partial fix for flys/1303
Sascha L. Teichmann <teichmann@intevation.de>
parents:
5994
diff
changeset
|
279 public static final void sortByFirst(double [] a, double [] b) { |
898afcce1d0a
Partial fix for flys/1303
Sascha L. Teichmann <teichmann@intevation.de>
parents:
5994
diff
changeset
|
280 // XXX: Not efficient but bulletproof. |
898afcce1d0a
Partial fix for flys/1303
Sascha L. Teichmann <teichmann@intevation.de>
parents:
5994
diff
changeset
|
281 double [][] pairs = new double[a.length][2]; |
898afcce1d0a
Partial fix for flys/1303
Sascha L. Teichmann <teichmann@intevation.de>
parents:
5994
diff
changeset
|
282 for (int i = 0; i < a.length; ++i) { |
898afcce1d0a
Partial fix for flys/1303
Sascha L. Teichmann <teichmann@intevation.de>
parents:
5994
diff
changeset
|
283 double [] p = pairs[i]; |
898afcce1d0a
Partial fix for flys/1303
Sascha L. Teichmann <teichmann@intevation.de>
parents:
5994
diff
changeset
|
284 p[0] = a[i]; |
898afcce1d0a
Partial fix for flys/1303
Sascha L. Teichmann <teichmann@intevation.de>
parents:
5994
diff
changeset
|
285 p[1] = b[i]; |
898afcce1d0a
Partial fix for flys/1303
Sascha L. Teichmann <teichmann@intevation.de>
parents:
5994
diff
changeset
|
286 |
898afcce1d0a
Partial fix for flys/1303
Sascha L. Teichmann <teichmann@intevation.de>
parents:
5994
diff
changeset
|
287 } |
898afcce1d0a
Partial fix for flys/1303
Sascha L. Teichmann <teichmann@intevation.de>
parents:
5994
diff
changeset
|
288 Arrays.sort(pairs, DOUBLE_PAIR_CMP); |
898afcce1d0a
Partial fix for flys/1303
Sascha L. Teichmann <teichmann@intevation.de>
parents:
5994
diff
changeset
|
289 for (int i = 0; i < a.length; ++i) { |
898afcce1d0a
Partial fix for flys/1303
Sascha L. Teichmann <teichmann@intevation.de>
parents:
5994
diff
changeset
|
290 double [] p = pairs[i]; |
898afcce1d0a
Partial fix for flys/1303
Sascha L. Teichmann <teichmann@intevation.de>
parents:
5994
diff
changeset
|
291 a[i] = p[0]; |
898afcce1d0a
Partial fix for flys/1303
Sascha L. Teichmann <teichmann@intevation.de>
parents:
5994
diff
changeset
|
292 b[i] = p[1]; |
898afcce1d0a
Partial fix for flys/1303
Sascha L. Teichmann <teichmann@intevation.de>
parents:
5994
diff
changeset
|
293 } |
898afcce1d0a
Partial fix for flys/1303
Sascha L. Teichmann <teichmann@intevation.de>
parents:
5994
diff
changeset
|
294 } |
898afcce1d0a
Partial fix for flys/1303
Sascha L. Teichmann <teichmann@intevation.de>
parents:
5994
diff
changeset
|
295 |
4821
bcf25d8c183e
Moved NaN removal code from W to DoubleUtil. Create QKms when calculating the 'Umhuellende'.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
4433
diff
changeset
|
296 public static void removeNaNs(TDoubleArrayList [] arrays) { |
bcf25d8c183e
Moved NaN removal code from W to DoubleUtil. Create QKms when calculating the 'Umhuellende'.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
4433
diff
changeset
|
297 |
bcf25d8c183e
Moved NaN removal code from W to DoubleUtil. Create QKms when calculating the 'Umhuellende'.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
4433
diff
changeset
|
298 int dest = 0; |
bcf25d8c183e
Moved NaN removal code from W to DoubleUtil. Create QKms when calculating the 'Umhuellende'.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
4433
diff
changeset
|
299 |
bcf25d8c183e
Moved NaN removal code from W to DoubleUtil. Create QKms when calculating the 'Umhuellende'.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
4433
diff
changeset
|
300 int A = arrays.length; |
bcf25d8c183e
Moved NaN removal code from W to DoubleUtil. Create QKms when calculating the 'Umhuellende'.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
4433
diff
changeset
|
301 int N = arrays[0].size(); |
bcf25d8c183e
Moved NaN removal code from W to DoubleUtil. Create QKms when calculating the 'Umhuellende'.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
4433
diff
changeset
|
302 |
bcf25d8c183e
Moved NaN removal code from W to DoubleUtil. Create QKms when calculating the 'Umhuellende'.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
4433
diff
changeset
|
303 OUTER: for (int i = 0; i < N; ++i) { |
bcf25d8c183e
Moved NaN removal code from W to DoubleUtil. Create QKms when calculating the 'Umhuellende'.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
4433
diff
changeset
|
304 for (int j = 0; j < A; ++j) { |
bcf25d8c183e
Moved NaN removal code from W to DoubleUtil. Create QKms when calculating the 'Umhuellende'.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
4433
diff
changeset
|
305 TDoubleArrayList a = arrays[j]; |
bcf25d8c183e
Moved NaN removal code from W to DoubleUtil. Create QKms when calculating the 'Umhuellende'.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
4433
diff
changeset
|
306 double v = a.getQuick(i); |
bcf25d8c183e
Moved NaN removal code from W to DoubleUtil. Create QKms when calculating the 'Umhuellende'.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
4433
diff
changeset
|
307 if (Double.isNaN(v)) { |
bcf25d8c183e
Moved NaN removal code from W to DoubleUtil. Create QKms when calculating the 'Umhuellende'.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
4433
diff
changeset
|
308 continue OUTER; |
bcf25d8c183e
Moved NaN removal code from W to DoubleUtil. Create QKms when calculating the 'Umhuellende'.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
4433
diff
changeset
|
309 } |
bcf25d8c183e
Moved NaN removal code from W to DoubleUtil. Create QKms when calculating the 'Umhuellende'.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
4433
diff
changeset
|
310 a.setQuick(dest, v); |
bcf25d8c183e
Moved NaN removal code from W to DoubleUtil. Create QKms when calculating the 'Umhuellende'.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
4433
diff
changeset
|
311 } |
bcf25d8c183e
Moved NaN removal code from W to DoubleUtil. Create QKms when calculating the 'Umhuellende'.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
4433
diff
changeset
|
312 ++dest; |
bcf25d8c183e
Moved NaN removal code from W to DoubleUtil. Create QKms when calculating the 'Umhuellende'.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
4433
diff
changeset
|
313 } |
bcf25d8c183e
Moved NaN removal code from W to DoubleUtil. Create QKms when calculating the 'Umhuellende'.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
4433
diff
changeset
|
314 |
bcf25d8c183e
Moved NaN removal code from W to DoubleUtil. Create QKms when calculating the 'Umhuellende'.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
4433
diff
changeset
|
315 if (dest < N) { |
bcf25d8c183e
Moved NaN removal code from W to DoubleUtil. Create QKms when calculating the 'Umhuellende'.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
4433
diff
changeset
|
316 for (int i = 0; i < A; ++i) { |
bcf25d8c183e
Moved NaN removal code from W to DoubleUtil. Create QKms when calculating the 'Umhuellende'.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
4433
diff
changeset
|
317 arrays[i].remove(dest, N-dest); |
bcf25d8c183e
Moved NaN removal code from W to DoubleUtil. Create QKms when calculating the 'Umhuellende'.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
4433
diff
changeset
|
318 } |
bcf25d8c183e
Moved NaN removal code from W to DoubleUtil. Create QKms when calculating the 'Umhuellende'.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
4433
diff
changeset
|
319 } |
bcf25d8c183e
Moved NaN removal code from W to DoubleUtil. Create QKms when calculating the 'Umhuellende'.
Sascha L. Teichmann <teichmann@intevation.de>
parents:
4433
diff
changeset
|
320 } |
8581
073ea4bcea58
(issue1755) Interpolate BedQuality Results
Andre Heinecke <andre.heinecke@intevation.de>
parents:
8202
diff
changeset
|
321 |
073ea4bcea58
(issue1755) Interpolate BedQuality Results
Andre Heinecke <andre.heinecke@intevation.de>
parents:
8202
diff
changeset
|
322 /** Convieniance function for results to get an interpolator. |
073ea4bcea58
(issue1755) Interpolate BedQuality Results
Andre Heinecke <andre.heinecke@intevation.de>
parents:
8202
diff
changeset
|
323 * This is basically a static wrapper to for LinearInterpolator.interpolate |
073ea4bcea58
(issue1755) Interpolate BedQuality Results
Andre Heinecke <andre.heinecke@intevation.de>
parents:
8202
diff
changeset
|
324 * with error handling. Returns null on error.*/ |
8856 | 325 public static PolynomialSplineFunction getLinearInterpolator( |
326 double[] x, | |
327 double[] y | |
328 ) { | |
329 /* We want copies here to remove NaNs but don't | |
330 * change the original data. */ | |
8596
b486812f4f14
(issue1755) Filter out NaN values before creating the interplation function
Andre Heinecke <andre.heinecke@intevation.de>
parents:
8587
diff
changeset
|
331 TDoubleArrayList tX = new TDoubleArrayList(); |
b486812f4f14
(issue1755) Filter out NaN values before creating the interplation function
Andre Heinecke <andre.heinecke@intevation.de>
parents:
8587
diff
changeset
|
332 TDoubleArrayList tY = new TDoubleArrayList(); |
b486812f4f14
(issue1755) Filter out NaN values before creating the interplation function
Andre Heinecke <andre.heinecke@intevation.de>
parents:
8587
diff
changeset
|
333 for (int i = 0; i < x.length; i++) { |
b486812f4f14
(issue1755) Filter out NaN values before creating the interplation function
Andre Heinecke <andre.heinecke@intevation.de>
parents:
8587
diff
changeset
|
334 if (!Double.isNaN(y[i])) { |
b486812f4f14
(issue1755) Filter out NaN values before creating the interplation function
Andre Heinecke <andre.heinecke@intevation.de>
parents:
8587
diff
changeset
|
335 tX.add(x[i]); |
b486812f4f14
(issue1755) Filter out NaN values before creating the interplation function
Andre Heinecke <andre.heinecke@intevation.de>
parents:
8587
diff
changeset
|
336 tY.add(y[i]); |
b486812f4f14
(issue1755) Filter out NaN values before creating the interplation function
Andre Heinecke <andre.heinecke@intevation.de>
parents:
8587
diff
changeset
|
337 } |
b486812f4f14
(issue1755) Filter out NaN values before creating the interplation function
Andre Heinecke <andre.heinecke@intevation.de>
parents:
8587
diff
changeset
|
338 } |
8581
073ea4bcea58
(issue1755) Interpolate BedQuality Results
Andre Heinecke <andre.heinecke@intevation.de>
parents:
8202
diff
changeset
|
339 LinearInterpolator lpol = new LinearInterpolator(); |
073ea4bcea58
(issue1755) Interpolate BedQuality Results
Andre Heinecke <andre.heinecke@intevation.de>
parents:
8202
diff
changeset
|
340 try { |
8596
b486812f4f14
(issue1755) Filter out NaN values before creating the interplation function
Andre Heinecke <andre.heinecke@intevation.de>
parents:
8587
diff
changeset
|
341 return lpol.interpolate(tX.toNativeArray(), tY.toNativeArray()); |
8581
073ea4bcea58
(issue1755) Interpolate BedQuality Results
Andre Heinecke <andre.heinecke@intevation.de>
parents:
8202
diff
changeset
|
342 } catch (DimensionMismatchException e) { |
8856 | 343 log.error("KMs and Result values have different sizes. " |
344 + "Failed to interpolate: " | |
345 + e.getMessage()); | |
8581
073ea4bcea58
(issue1755) Interpolate BedQuality Results
Andre Heinecke <andre.heinecke@intevation.de>
parents:
8202
diff
changeset
|
346 } catch (NonMonotonousSequenceException e) { |
8856 | 347 log.error("KMs are not monotonous. Failed to interpolate: " |
348 + e.getMessage()); | |
8581
073ea4bcea58
(issue1755) Interpolate BedQuality Results
Andre Heinecke <andre.heinecke@intevation.de>
parents:
8202
diff
changeset
|
349 } catch (NumberIsTooSmallException e) { |
8856 | 350 log.error("Result is to small. Failed to interpolate: " |
351 + e.getMessage()); | |
8581
073ea4bcea58
(issue1755) Interpolate BedQuality Results
Andre Heinecke <andre.heinecke@intevation.de>
parents:
8202
diff
changeset
|
352 } |
073ea4bcea58
(issue1755) Interpolate BedQuality Results
Andre Heinecke <andre.heinecke@intevation.de>
parents:
8202
diff
changeset
|
353 return null; |
073ea4bcea58
(issue1755) Interpolate BedQuality Results
Andre Heinecke <andre.heinecke@intevation.de>
parents:
8202
diff
changeset
|
354 } |
8587
07c9ac22f611
(issue1755) Generalise BedQuality result handling
Andre Heinecke <andre.heinecke@intevation.de>
parents:
8581
diff
changeset
|
355 |
8856 | 356 public static PolynomialSplineFunction getLinearInterpolator( |
357 TDoubleArrayList x, | |
358 TDoubleArrayList y | |
359 ) { | |
8587
07c9ac22f611
(issue1755) Generalise BedQuality result handling
Andre Heinecke <andre.heinecke@intevation.de>
parents:
8581
diff
changeset
|
360 return getLinearInterpolator(x.toNativeArray(), y.toNativeArray()); |
07c9ac22f611
(issue1755) Generalise BedQuality result handling
Andre Heinecke <andre.heinecke@intevation.de>
parents:
8581
diff
changeset
|
361 } |
655
913b52064449
Refactored version of "Berechnung 4"
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
362 } |
913b52064449
Refactored version of "Berechnung 4"
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
363 // vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 : |