diff artifacts/src/main/java/org/dive4elements/river/artifacts/sinfo/flowdepth/FlowVelocityKmModelValues.java @ 9096:9bd4505a20dc

Fixed removing duplicates
author mschaefer
date Sat, 26 May 2018 15:41:47 +0200
parents 45f1ad66560e
children
line wrap: on
line diff
--- a/artifacts/src/main/java/org/dive4elements/river/artifacts/sinfo/flowdepth/FlowVelocityKmModelValues.java	Fri May 25 16:03:15 2018 +0200
+++ b/artifacts/src/main/java/org/dive4elements/river/artifacts/sinfo/flowdepth/FlowVelocityKmModelValues.java	Sat May 26 15:41:47 2018 +0200
@@ -14,6 +14,7 @@
 import org.apache.commons.math.analysis.polynomials.PolynomialSplineFunction;
 
 import gnu.trove.TDoubleArrayList;
+import gnu.trove.TIntArrayList;
 
 /**
  * Sorted arrays of a station's q, v, and tau model values, running in parallel
@@ -36,6 +37,11 @@
     private final TDoubleArrayList qs;
 
     /**
+     * Same q values count used to calculate mean
+     */
+    private final TIntArrayList counts;
+
+    /**
      * The station's main section velocity for the q values
      */
     private final TDoubleArrayList vmains;
@@ -83,6 +89,7 @@
     public FlowVelocityKmModelValues(final double km) {
         this.km = km;
         this.qs = new TDoubleArrayList();
+        this.counts = new TIntArrayList();
         this.vmains = new TDoubleArrayList();
         this.taus = new TDoubleArrayList();
         this.vInterpolator = null;
@@ -94,7 +101,7 @@
      */
     public FlowVelocityKmModelValues(final double km, final FlowVelocityKmModelValues src) {
         this(km);
-        src.copyTo(this.qs, this.vmains, this.taus);
+        src.copyTo(this.qs, this.counts, this.vmains, this.taus);
     }
 
     /***** METHODS *****/
@@ -116,9 +123,10 @@
     /**
      * Adds all q-v-tau to another set of arrays
      */
-    void copyTo(final TDoubleArrayList dstqs, final TDoubleArrayList dstvmains, final TDoubleArrayList dsttaus) {
+    void copyTo(final TDoubleArrayList dstqs, final TIntArrayList dstcounts, final TDoubleArrayList dstvmains, final TDoubleArrayList dsttaus) {
         for (int i = 0; i <= this.qs.size(); i++) {
             dstqs.add(this.qs.getQuick(i));
+            dstcounts.add(this.counts.getQuick(i));
             dstvmains.add(this.vmains.getQuick(i));
             dsttaus.add(this.taus.getQuick(i));
         }
@@ -155,12 +163,22 @@
     }
 
     /**
-     * Adds a q-v-tau value triple.
+     * Adds a q-v-tau value triple, averaging the last values if q duplicates.
      */
     public void addValues(final double q, final double vmain, final double tau) {
-        this.qs.add(q);
-        this.vmains.add(vmain);
-        this.taus.add(tau);
+        final int j = this.qs.size() - 1;
+        if ((j >= 0) && (q < this.qs.getQuick(j) + 0.001)) {
+            this.qs.setQuick(j, (this.qs.getQuick(j) * this.counts.getQuick(j) + q) / (this.counts.getQuick(j) + 1));
+            this.vmains.setQuick(j, (this.vmains.getQuick(j) * this.counts.getQuick(j) + vmain) / (this.counts.getQuick(j) + 1));
+            this.taus.setQuick(j, (this.taus.getQuick(j) * this.counts.getQuick(j) + tau) / (this.counts.getQuick(j) + 1));
+            this.counts.setQuick(j, this.counts.getQuick(j) + 1);
+        }
+        else {
+            this.qs.add(q);
+            this.counts.add(1);
+            this.vmains.add(vmain);
+            this.taus.add(tau);
+        }
     }
 
     /**

http://dive4elements.wald.intevation.org