sascha@726: package de.intevation.flys.artifacts.model; sascha@726: sascha@726: import gnu.trove.TDoubleArrayList; sascha@726: sascha@744: import java.util.Random; sascha@744: sascha@726: public class WQ sascha@925: extends NamedObjectImpl sascha@726: { sascha@925: // TODO: s/w/ws/g sascha@726: protected TDoubleArrayList w; sascha@726: sascha@925: // TODO: s/q/qs/g sascha@726: protected TDoubleArrayList q; sascha@726: sascha@726: public WQ() { sascha@726: this(""); sascha@726: } sascha@726: sascha@726: public WQ(String name) { sascha@726: w = new TDoubleArrayList(); sascha@726: q = new TDoubleArrayList(); sascha@726: } sascha@726: sascha@726: public WQ(int capacity) { sascha@726: this(capacity, ""); sascha@726: } sascha@726: sascha@726: sascha@726: public WQ(int capacity, String name) { sascha@726: super(name); sascha@726: w = new TDoubleArrayList(capacity); sascha@726: q = new TDoubleArrayList(capacity); sascha@726: } sascha@726: sascha@726: public WQ(double [] qs, double [] ws) { sascha@726: this(qs, ws, ""); sascha@726: } sascha@726: sascha@726: public WQ(double [] qs, double [] ws, String name) { sascha@726: super(name); sascha@726: w = new TDoubleArrayList(ws); sascha@726: q = new TDoubleArrayList(qs); sascha@726: } sascha@726: sascha@726: public void add(double w, double q) { sascha@726: this.w.add(w); sascha@726: this.q.add(q); sascha@726: } sascha@726: sascha@726: public int size() { sascha@726: return w.size(); sascha@726: } sascha@726: sascha@726: public double getW(int idx) { sascha@726: return w.getQuick(idx); sascha@726: } sascha@726: sascha@726: public double getQ(int idx) { sascha@726: return q.getQuick(idx); sascha@726: } sascha@726: sascha@726: public double [] get(int idx) { sascha@726: return get(idx, new double [2]); sascha@726: } sascha@726: sascha@726: public double [] get(int idx, double [] dst) { sascha@726: dst[0] = w.getQuick(idx); sascha@726: dst[1] = q.getQuick(idx); sascha@726: return dst; sascha@726: } sascha@726: sascha@726: public double [] getWs() { sascha@726: return w.toNativeArray(); sascha@726: } sascha@726: sascha@726: public double [] getQs() { sascha@726: return q.toNativeArray(); sascha@726: } sascha@726: sascha@726: public static void removeNaNs(TDoubleArrayList [] arrays) { sascha@726: sascha@726: int dest = 0; sascha@726: sascha@726: int A = arrays.length; sascha@726: int N = arrays[0].size(); sascha@726: sascha@726: OUTER: for (int i = 0; i < N; ++i) { sascha@726: for (int j = 0; j < A; ++j) { sascha@726: TDoubleArrayList a = arrays[j]; sascha@726: double v = a.getQuick(i); sascha@726: if (Double.isNaN(v)) { sascha@726: continue OUTER; sascha@726: } sascha@726: a.setQuick(dest, v); sascha@726: } sascha@726: ++dest; sascha@726: } sascha@726: sascha@726: if (dest < N) { sascha@726: for (int i = 0; i < A; ++i) { sascha@726: arrays[i].remove(dest, N-dest); sascha@726: } sascha@726: } sascha@726: } sascha@726: sascha@726: public void removeNaNs() { sascha@726: removeNaNs(new TDoubleArrayList [] { w, q }); sascha@726: } sascha@744: sascha@744: public boolean guessWaterIncreasing() { sascha@744: return guessWaterIncreasing(0.05f); sascha@744: } sascha@744: sascha@744: public boolean guessWaterIncreasing(float factor) { sascha@744: sascha@744: int N = w.size(); sascha@926: if (N < 2) return false; sascha@926: sascha@744: int samples = (int)(factor*N) + 1; sascha@744: sascha@744: int up = 0; sascha@744: sascha@744: Random rand = new Random(); sascha@744: sascha@744: for (int i = 0; i < samples; ++i) { sascha@748: int pos2 = rand.nextInt(N-1) + 1; sascha@926: if (pos2 == 0) continue; sascha@748: int pos1 = rand.nextInt(pos2); sascha@748: double w1 = w.getQuick(pos1); sascha@748: double w2 = w.getQuick(pos2); sascha@744: if (w2 > w1) ++up; sascha@744: } sascha@744: sascha@744: return up > samples/2; sascha@744: } sascha@744: sascha@726: } sascha@726: // vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 :