comparison flys-artifacts/src/main/java/de/intevation/flys/artifacts/model/Calculation4.java @ 686:3dc61e00385e facets-slt

Merged with trunk and introduced hashing of computed values. flys-artifacts/branches/facets-slt@2126 c6561f87-3c4e-4783-a992-168aeb5c3f6f
author Ingo Weinzierl <ingo.weinzierl@intevation.de>
date Wed, 15 Jun 2011 15:28:54 +0000
parents baea7981477a
children eab5e5089d77
comparison
equal deleted inserted replaced
667:434146596838 686:3dc61e00385e
18 import de.intevation.flys.artifacts.math.BackJumpCorrector; 18 import de.intevation.flys.artifacts.math.BackJumpCorrector;
19 19
20 import org.apache.log4j.Logger; 20 import org.apache.log4j.Logger;
21 21
22 public class Calculation4 22 public class Calculation4
23 extends Calculation
23 { 24 {
24 private static Logger logger = Logger.getLogger(Calculation4.class); 25 private static Logger logger = Logger.getLogger(Calculation4.class);
25 26
26 public static final double MINIMAL_STEP_WIDTH = 1e-5; 27 public static final double MINIMAL_STEP_WIDTH = 1e-5;
27 28
48 49
49 int numResults = -1; 50 int numResults = -1;
50 51
51 // assign reference points 52 // assign reference points
52 for (Segment segment: segments) { 53 for (Segment segment: segments) {
53 Gauge gauge = river.determineGauge( 54 Gauge gauge = river.determineGaugeByStation(
54 segment.getFrom(), segment.getTo()); 55 segment.getFrom(), segment.getTo());
55 56
56 segment.setReferencePoint(gauge != null 57 segment.setReferencePoint(gauge != null
57 ? gauge.getStation().doubleValue() 58 ? gauge.getStation().doubleValue()
58 : 0.5*(segment.getFrom() + segment.getTo())); 59 : 0.5*(segment.getFrom() + segment.getTo()));
91 92
92 if (debug) { 93 if (debug) {
93 logger.debug( 94 logger.debug(
94 "calculate from " + from + " to " + to + " step " + step); 95 "calculate from " + from + " to " + to + " step " + step);
95 logger.debug("# segments: " + segments.size()); 96 logger.debug("# segments: " + segments.size());
97 for (Segment segment: segments) {
98 logger.debug(" " + segment);
99 }
96 } 100 }
97 101
98 if (segments.isEmpty()) { 102 if (segments.isEmpty()) {
99 logger.debug("no segments found"); 103 logger.debug("no segments found");
104 // TODO: I18N
105 addProblem("no segments found");
100 return new WQKms[0]; 106 return new WQKms[0];
101 } 107 }
102 108
103 int numResults = segments.get(0).values.length; 109 int numResults = segments.get(0).values.length;
104 110
105 if (numResults < 1) { 111 if (numResults < 1) {
106 logger.debug("no values given"); 112 logger.debug("no values given");
113 // TODO: I18N
114 addProblem("no values given");
107 return new WQKms[0]; 115 return new WQKms[0];
108 } 116 }
109 117
110 118
111 WQKms [] results = new WQKms[numResults]; 119 WQKms [] results = new WQKms[numResults];
112 if (debug) {
113 logger.debug("after last segment -> gleichwertig");
114 }
115 for (int i = 0; i < results.length; ++i) { 120 for (int i = 0; i < results.length; ++i) {
116 results[i] = new WQKms(); 121 results[i] = new WQKms();
117 } 122 }
118 123
119 if (Math.abs(step) < MINIMAL_STEP_WIDTH) { 124 if (Math.abs(step) < MINIMAL_STEP_WIDTH) {
211 QPosition qi = table.getQPosition( 216 QPosition qi = table.getQPosition(
212 anchor.referencePoint, 217 anchor.referencePoint,
213 anchor.values[i]); 218 anchor.values[i]);
214 219
215 if ((qPositions[i] = qi) == null) { 220 if ((qPositions[i] = qi) == null) {
216 // TODO: error report 221 // TODO: I18N
222 addProblem(pos, "cannot find q = " + anchor.values[i]);
217 functions[i] = Identity.IDENTITY; 223 functions[i] = Identity.IDENTITY;
218 } 224 }
219 else { 225 else {
220 double qA = table.getQ(qi, anchor.referencePoint); 226 double qA = table.getQ(qi, anchor.referencePoint);
221 double qF = table.getQ(qi, free .referencePoint); 227 double qF = table.getQ(qi, free .referencePoint);
223 functions[i] = Double.isNaN(qA) || Double.isNaN(qF) 229 functions[i] = Double.isNaN(qA) || Double.isNaN(qF)
224 ? Identity.IDENTITY 230 ? Identity.IDENTITY
225 : new Linear( 231 : new Linear(
226 qA, qF, 232 qA, qF,
227 anchor.values[i], free.values[i]); 233 anchor.values[i], free.values[i]);
234
235 if (debug) {
236 logger.debug(
237 anchor.referencePoint + ": " +
238 qA + " -> " + functions[i].value(qA) +
239 " / " + free.referencePoint + ": " +
240 qF + " -> " + functions[i].value(qF));
241 }
228 } 242 }
229 } // build transforms 243 } // build transforms
230 } // "ungleichwertiges" interval 244 } // "ungleichwertiges" interval
231 } // find matching interval 245 } // find matching interval
232 246
239 253
240 if (table.interpolate(pos, out, qPosition, functions[i])) { 254 if (table.interpolate(pos, out, qPosition, functions[i])) {
241 results[i].add(out[0], out[1], pos); 255 results[i].add(out[0], out[1], pos);
242 } 256 }
243 else { 257 else {
244 // TODO: error report 258 // TODO: I18N
259 addProblem(pos, "cannot interpolate w/q");
245 } 260 }
246 } 261 }
247 } 262 }
248 263
249 // Backjump correction 264 // Backjump correction
251 BackJumpCorrector bjc = new BackJumpCorrector(); 266 BackJumpCorrector bjc = new BackJumpCorrector();
252 267
253 double [] ws = results[i].getWs(); 268 double [] ws = results[i].getWs();
254 double [] kms = results[i].getKms(); 269 double [] kms = results[i].getKms();
255 270
256 if (bjc.doCorrection(kms, ws)) { 271 if (bjc.doCorrection(kms, ws, this)) {
257 results[i] = new WQCKms(results[i], bjc.getCorrected()); 272 results[i] = new WQCKms(results[i], bjc.getCorrected());
258 } 273 }
259 // TODO: error report
260 } 274 }
261 275
262 // name the curves 276 // name the curves
263 for (int i = 0; i < results.length; ++i) { 277 for (int i = 0; i < results.length; ++i) {
264 results[i].setName(createName(i)); 278 results[i].setName(createName(i));
266 280
267 return results; 281 return results;
268 } 282 }
269 283
270 protected String createName(int index) { 284 protected String createName(int index) {
271 // TODO: i18n 285 // TODO: I18N
272 StringBuilder sb = new StringBuilder(isQ ? "Q" : "W"); 286 StringBuilder sb = new StringBuilder(isQ ? "Q" : "W");
273 sb.append(" benutzerdefiniert ("); 287 sb.append(" benutzerdefiniert (");
274 for (int i = 0, N = segments.size(); i < N; ++i) { 288 for (int i = 0, N = segments.size(); i < N; ++i) {
275 if (i > 0) { 289 if (i > 0) {
276 sb.append("; "); 290 sb.append("; ");

http://dive4elements.wald.intevation.org