view flys-artifacts/src/main/java/de/intevation/flys/artifacts/model/WQ.java @ 2092:0ccabd82ec76

Added missing service to invalidate the caches via the REST interface. flys-artifacts/trunk@3620 c6561f87-3c4e-4783-a992-168aeb5c3f6f
author Sascha L. Teichmann <sascha.teichmann@intevation.de>
date Sat, 07 Jan 2012 08:02:56 +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 :

http://dive4elements.wald.intevation.org