annotate artifacts/src/main/java/org/dive4elements/river/artifacts/model/InfoldingColumns.java @ 5863:4897a58c8746

River artifacts: Added new copyright headers.
author Sascha L. Teichmann <teichmann@intevation.de>
date Sun, 28 Apr 2013 14:40:59 +0200
parents 5aa05a7a34b7
children af13ceeba52a
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 *
4897a58c8746 River artifacts: Added new copyright headers.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 5838
diff changeset
4 * This file is Free Software under the GNU AGPL (>=v3)
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
4897a58c8746 River artifacts: Added new copyright headers.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 5838
diff changeset
6 * documentation coming with Dive4Elements River for details.
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: 4819
diff changeset
9 package org.dive4elements.river.artifacts.model;
4800
c6814695c82c Added missing InfoldingColumns.java
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff changeset
10
c6814695c82c Added missing InfoldingColumns.java
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff changeset
11 /** A pretty naive pointwise algorithm to find out the columns
c6814695c82c Added missing InfoldingColumns.java
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff changeset
12 * of a WSTValueTable which imfold ("umhuellen") a set of WQKMs
c6814695c82c Added missing InfoldingColumns.java
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff changeset
13 * in terms of Q.
c6814695c82c Added missing InfoldingColumns.java
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff changeset
14 * A better implemention would exploit the fact that the
c6814695c82c Added missing InfoldingColumns.java
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff changeset
15 * Qs normally are constant for a while along km. This would
c6814695c82c Added missing InfoldingColumns.java
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff changeset
16 * reduce the runtime complexity to only a few Q spans instead
c6814695c82c Added missing InfoldingColumns.java
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff changeset
17 * of the pointwise evaluation.
c6814695c82c Added missing InfoldingColumns.java
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff changeset
18 */
c6814695c82c Added missing InfoldingColumns.java
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff changeset
19 public class InfoldingColumns
c6814695c82c Added missing InfoldingColumns.java
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff changeset
20 {
c6814695c82c Added missing InfoldingColumns.java
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff changeset
21 private QRangeTree.QuickQFinder [] qFinders;
c6814695c82c Added missing InfoldingColumns.java
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff changeset
22
c6814695c82c Added missing InfoldingColumns.java
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff changeset
23 private boolean [] infoldingColumns;
c6814695c82c Added missing InfoldingColumns.java
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff changeset
24
c6814695c82c Added missing InfoldingColumns.java
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff changeset
25 public InfoldingColumns() {
c6814695c82c Added missing InfoldingColumns.java
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff changeset
26 }
c6814695c82c Added missing InfoldingColumns.java
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff changeset
27
c6814695c82c Added missing InfoldingColumns.java
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff changeset
28 public InfoldingColumns(WstValueTable.Column [] columns) {
c6814695c82c Added missing InfoldingColumns.java
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff changeset
29
c6814695c82c Added missing InfoldingColumns.java
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff changeset
30 qFinders = new QRangeTree.QuickQFinder[columns.length];
c6814695c82c Added missing InfoldingColumns.java
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff changeset
31 for (int i = 0; i < qFinders.length; ++i) {
c6814695c82c Added missing InfoldingColumns.java
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff changeset
32 qFinders[i] = columns[i].getQRangeTree().new QuickQFinder();
c6814695c82c Added missing InfoldingColumns.java
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff changeset
33 }
c6814695c82c Added missing InfoldingColumns.java
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff changeset
34
c6814695c82c Added missing InfoldingColumns.java
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff changeset
35 infoldingColumns = new boolean[columns.length];
c6814695c82c Added missing InfoldingColumns.java
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff changeset
36 }
c6814695c82c Added missing InfoldingColumns.java
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff changeset
37
c6814695c82c Added missing InfoldingColumns.java
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff changeset
38 public boolean [] getInfoldingColumns() {
c6814695c82c Added missing InfoldingColumns.java
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff changeset
39 return infoldingColumns;
c6814695c82c Added missing InfoldingColumns.java
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff changeset
40 }
c6814695c82c Added missing InfoldingColumns.java
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff changeset
41
4819
243f1eb02b95 Use QKMs in calculation of the 'Umhuellende'.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 4800
diff changeset
42 public void markInfoldingColumns(QKms [] qkms) {
243f1eb02b95 Use QKMs in calculation of the 'Umhuellende'.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 4800
diff changeset
43 for (QKms qk: qkms) {
243f1eb02b95 Use QKMs in calculation of the 'Umhuellende'.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 4800
diff changeset
44 markInfoldingColumns(qk);
4800
c6814695c82c Added missing InfoldingColumns.java
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff changeset
45 }
c6814695c82c Added missing InfoldingColumns.java
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff changeset
46 }
c6814695c82c Added missing InfoldingColumns.java
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff changeset
47
4819
243f1eb02b95 Use QKMs in calculation of the 'Umhuellende'.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 4800
diff changeset
48 public void markInfoldingColumns(QKms qkms) {
243f1eb02b95 Use QKMs in calculation of the 'Umhuellende'.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 4800
diff changeset
49 int N = qkms.size();
4800
c6814695c82c Added missing InfoldingColumns.java
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff changeset
50 int C = qFinders.length-1;
c6814695c82c Added missing InfoldingColumns.java
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff changeset
51 for (int i = 0; i < N; ++i) {
4819
243f1eb02b95 Use QKMs in calculation of the 'Umhuellende'.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 4800
diff changeset
52 double km = qkms.getKm(i);
243f1eb02b95 Use QKMs in calculation of the 'Umhuellende'.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 4800
diff changeset
53 double q = qkms.getQ(i);
4800
c6814695c82c Added missing InfoldingColumns.java
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff changeset
54 double above = Double.MAX_VALUE;
c6814695c82c Added missing InfoldingColumns.java
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff changeset
55 double below = -Double.MAX_VALUE;
c6814695c82c Added missing InfoldingColumns.java
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff changeset
56 int aboveIdx = -1;
c6814695c82c Added missing InfoldingColumns.java
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff changeset
57 int belowIdx = -1;
c6814695c82c Added missing InfoldingColumns.java
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff changeset
58
c6814695c82c Added missing InfoldingColumns.java
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff changeset
59 for (int j = C; j >= 0; --j) {
c6814695c82c Added missing InfoldingColumns.java
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff changeset
60 double qc = qFinders[j].findQ(km);
c6814695c82c Added missing InfoldingColumns.java
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff changeset
61 if (Double.isNaN(qc)) {
c6814695c82c Added missing InfoldingColumns.java
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff changeset
62 continue;
c6814695c82c Added missing InfoldingColumns.java
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff changeset
63 }
c6814695c82c Added missing InfoldingColumns.java
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff changeset
64 if (qc <= q) {
c6814695c82c Added missing InfoldingColumns.java
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff changeset
65 if (qc > below) {
c6814695c82c Added missing InfoldingColumns.java
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff changeset
66 below = qc;
c6814695c82c Added missing InfoldingColumns.java
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff changeset
67 belowIdx = j;
c6814695c82c Added missing InfoldingColumns.java
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff changeset
68 }
c6814695c82c Added missing InfoldingColumns.java
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff changeset
69 }
c6814695c82c Added missing InfoldingColumns.java
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff changeset
70 else if (qc < above) { // qc > q
c6814695c82c Added missing InfoldingColumns.java
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff changeset
71 above = qc;
c6814695c82c Added missing InfoldingColumns.java
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff changeset
72 aboveIdx = j;
c6814695c82c Added missing InfoldingColumns.java
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff changeset
73 }
c6814695c82c Added missing InfoldingColumns.java
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff changeset
74 }
c6814695c82c Added missing InfoldingColumns.java
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff changeset
75
c6814695c82c Added missing InfoldingColumns.java
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff changeset
76 if (aboveIdx != -1) {
c6814695c82c Added missing InfoldingColumns.java
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff changeset
77 infoldingColumns[aboveIdx] = true;
c6814695c82c Added missing InfoldingColumns.java
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff changeset
78 }
c6814695c82c Added missing InfoldingColumns.java
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff changeset
79
c6814695c82c Added missing InfoldingColumns.java
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff changeset
80 if (belowIdx != -1) {
c6814695c82c Added missing InfoldingColumns.java
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff changeset
81 infoldingColumns[belowIdx] = true;
c6814695c82c Added missing InfoldingColumns.java
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff changeset
82 }
c6814695c82c Added missing InfoldingColumns.java
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff changeset
83 }
c6814695c82c Added missing InfoldingColumns.java
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff changeset
84 }
c6814695c82c Added missing InfoldingColumns.java
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff changeset
85 }
c6814695c82c Added missing InfoldingColumns.java
Sascha L. Teichmann <teichmann@intevation.de>
parents:
diff changeset
86 // vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 :

http://dive4elements.wald.intevation.org