Mercurial > dive4elements > river
view flys-artifacts/src/main/java/de/intevation/flys/artifacts/model/WQ.java @ 2089:0da8874bd378
Added initial state to map artifact to be able to advance and step back.
The map artifact overrides describe() to have the complete UI information in the
describe response document.
flys-artifacts/trunk@3613 c6561f87-3c4e-4783-a992-168aeb5c3f6f
author | Raimund Renkert <raimund.renkert@intevation.de> |
---|---|
date | Fri, 06 Jan 2012 12:02:10 +0000 |
parents | bda04ae1154f |
children | 5ff481ab24a1 |
line wrap: on
line source
package de.intevation.flys.artifacts.model; import java.util.regex.Matcher; import java.util.regex.Pattern; import de.intevation.flys.utils.DataUtil; import gnu.trove.TDoubleArrayList; import org.apache.log4j.Logger; public class WQ extends NamedObjectImpl { public static final Pattern NUMBERS_PATTERN = Pattern.compile("\\D*(\\d++.\\d*)\\D*"); private static Logger logger = Logger.getLogger(WQ.class); // TODO: s/w/ws/g protected TDoubleArrayList w; // TODO: s/q/qs/g protected TDoubleArrayList q; public WQ() { this(""); } public WQ(String name) { w = new TDoubleArrayList(); q = new TDoubleArrayList(); } public WQ(int capacity) { this(capacity, ""); } public WQ(int capacity, String name) { super(name); w = new TDoubleArrayList(capacity); q = new TDoubleArrayList(capacity); } public WQ(double [] qs, double [] ws) { this(qs, ws, ""); } public WQ(double [] qs, double [] ws, String name) { super(name); w = new TDoubleArrayList(ws); q = new TDoubleArrayList(qs); } public Double getRawValue() { if (name == null || name.length() == 0) { // this should never happen return null; } Matcher m = NUMBERS_PATTERN.matcher(name); if (m.matches()) { String raw = m.group(1); try { return Double.valueOf(raw); } catch (NumberFormatException nfe) { // do nothing } } return null; } public void add(double w, double q) { this.w.add(w); this.q.add(q); } public int size() { return w.size(); } public double getW(int idx) { return w.getQuick(idx); } public double getQ(int idx) { return q.getQuick(idx); } public double [] get(int idx) { return get(idx, new double [2]); } public double [] get(int idx, double [] dst) { dst[0] = w.getQuick(idx); dst[1] = q.getQuick(idx); return dst; } public double [] getWs() { return w.toNativeArray(); } public double [] getQs() { return q.toNativeArray(); } public static void removeNaNs(TDoubleArrayList [] arrays) { int dest = 0; int A = arrays.length; int N = arrays[0].size(); OUTER: for (int i = 0; i < N; ++i) { for (int j = 0; j < A; ++j) { TDoubleArrayList a = arrays[j]; double v = a.getQuick(i); if (Double.isNaN(v)) { continue OUTER; } a.setQuick(dest, v); } ++dest; } if (dest < N) { for (int i = 0; i < A; ++i) { arrays[i].remove(dest, N-dest); } } } public void removeNaNs() { removeNaNs(new TDoubleArrayList [] { w, q }); } public boolean guessWaterIncreasing() { return guessWaterIncreasing(0.05f); } public boolean guessWaterIncreasing(float factor) { return DataUtil.guessWaterIncreasing(w, factor); } public int [] longestIncreasingWRangeIndices() { return longestIncreasingWRangeIndices(new int[2]); } public int [] longestIncreasingWRangeIndices(int [] bounds) { int N = size(); int start = 0; int stop = 0; double lastW = Double.MAX_VALUE; for (int i = 0; i < N; ++i) { double v = w.getQuick(i); if (v <= lastW) { if (stop-start > bounds[1]-bounds[0]) { bounds[0] = start; bounds[1] = stop; if (logger.isDebugEnabled()) { logger.debug("new range: " + bounds[0] + " - " + bounds[1] + " (" + w.getQuick(bounds[0]) + ", " + w.getQuick(bounds[1]) + ")"); } } start = stop = i; } else { stop = i; } lastW = v; } if (stop-start > bounds[1]-bounds[0]) { bounds[0] = start; bounds[1] = stop; if (logger.isDebugEnabled()) { logger.debug("new range @end: " + bounds[0] + " - " + bounds[1] + " (" + w.getQuick(bounds[0]) + ", " + w.getQuick(bounds[1]) + ")"); } } return bounds; } } // vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 :