You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@tinkerpop.apache.org by dk...@apache.org on 2015/11/04 13:43:34 UTC

[3/9] incubator-tinkerpop git commit: Integrated NumberHelper in Min-, Max- and MeanStep

Integrated NumberHelper in Min-, Max- and MeanStep


Project: http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/commit/eba71143
Tree: http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/tree/eba71143
Diff: http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/diff/eba71143

Branch: refs/heads/master
Commit: eba7114341b1257106db2111ed8b90b2012c0860
Parents: eda16b5
Author: Daniel Kuppitz <da...@hotmail.com>
Authored: Sun Nov 1 12:55:26 2015 +0100
Committer: Daniel Kuppitz <da...@hotmail.com>
Committed: Sun Nov 1 12:55:26 2015 +0100

----------------------------------------------------------------------
 .../gremlin/process/traversal/NumberHelper.java | 12 ++++-
 .../traversal/step/map/MaxGlobalStep.java       | 14 ++---
 .../traversal/step/map/MaxLocalStep.java        |  5 +-
 .../traversal/step/map/MeanGlobalStep.java      | 57 +++++++++++---------
 .../traversal/step/map/MinGlobalStep.java       | 14 ++---
 .../traversal/step/map/MinLocalStep.java        |  5 +-
 .../structure/TinkerGraphPlayTest.java          |  9 ++--
 7 files changed, 67 insertions(+), 49 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/eba71143/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/NumberHelper.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/NumberHelper.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/NumberHelper.java
index 8dfd113..b094f29 100644
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/NumberHelper.java
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/NumberHelper.java
@@ -162,8 +162,12 @@ public class NumberHelper {
     }
 
     public static Class<? extends Number> getHighestCommonNumberClass(final Number... numbers) {
+        return getHighestCommonNumberClass(false, numbers);
+    }
+
+    public static Class<? extends Number> getHighestCommonNumberClass(final boolean forceFloatingPoint, final Number... numbers) {
         int bits = 8;
-        boolean fp = false;
+        boolean fp = forceFloatingPoint;
         for (final Number number : numbers) {
             if (number == null) continue;
             final Class<? extends Number> clazz = number.getClass();
@@ -207,7 +211,11 @@ public class NumberHelper {
     }
 
     public static Number div(final Number a, final Number b) {
-        final Class<? extends Number> clazz = getHighestCommonNumberClass(a, b);
+        return div(a, b, false);
+    }
+
+    public static Number div(final Number a, final Number b, final boolean forceFloatingPoint) {
+        final Class<? extends Number> clazz = getHighestCommonNumberClass(forceFloatingPoint, a, b);
         return getHelper(clazz).div.apply(a, b);
     }
 

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/eba71143/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/MaxGlobalStep.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/MaxGlobalStep.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/MaxGlobalStep.java
index d7dc34d..d876d2d 100644
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/MaxGlobalStep.java
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/MaxGlobalStep.java
@@ -37,6 +37,8 @@ import java.util.Iterator;
 import java.util.Set;
 import java.util.function.BiFunction;
 
+import static org.apache.tinkerpop.gremlin.process.traversal.NumberHelper.max;
+
 /**
  * @author Marko A. Rodriguez (http://markorodriguez.com)
  */
@@ -70,10 +72,11 @@ public final class MaxGlobalStep<S extends Number> extends ReducingBarrierStep<S
 
         @Override
         public S apply(final S mutatingSeed, final Traverser<S> traverser) {
-            return mutatingSeed != null && mutatingSeed.doubleValue() >= traverser.get().doubleValue() ? mutatingSeed : traverser.get();
+            final S value = traverser.get();
+            return mutatingSeed != null ? (S) max(mutatingSeed, traverser.get()) : value;
         }
 
-        public final static <S extends Number> MaxGlobalBiFunction<S> instance() {
+        public static <S extends Number> MaxGlobalBiFunction<S> instance() {
             return INSTANCE;
         }
     }
@@ -106,11 +109,10 @@ public final class MaxGlobalStep<S extends Number> extends ReducingBarrierStep<S
         @Override
         public void reduce(final NullObject key, final Iterator<Number> values, final ReduceEmitter<NullObject, Number> emitter) {
             if (values.hasNext()) {
-                Number max = -Double.MAX_VALUE;
+                Number max = null;
                 while (values.hasNext()) {
                     final Number value = values.next();
-                    if (value.doubleValue() > max.doubleValue())
-                        max = value;
+                    max = max != null ? max(value, max) : value;
                 }
                 emitter.emit(max);
             }
@@ -127,7 +129,7 @@ public final class MaxGlobalStep<S extends Number> extends ReducingBarrierStep<S
 
         }
 
-        public static final MaxGlobalMapReduce instance() {
+        public static MaxGlobalMapReduce instance() {
             return INSTANCE;
         }
     }

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/eba71143/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/MaxLocalStep.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/MaxLocalStep.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/MaxLocalStep.java
index 6d2a228..dc4c5ce 100644
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/MaxLocalStep.java
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/MaxLocalStep.java
@@ -26,6 +26,8 @@ import java.util.Collections;
 import java.util.Iterator;
 import java.util.Set;
 
+import static org.apache.tinkerpop.gremlin.process.traversal.NumberHelper.max;
+
 /**
  * @author Marko A. Rodriguez (http://markorodriguez.com)
  * @author Daniel Kuppitz (http://gremlin.guru)
@@ -43,8 +45,7 @@ public final class MaxLocalStep<E extends Number, S extends Iterable<E>> extends
         if (iterator.hasNext()) {
             result = iterator.next();
             while (iterator.hasNext()) {
-                final Number curr = iterator.next();
-                if (result.doubleValue() < curr.doubleValue()) result = curr;
+                result = max(iterator.next(), result);
             }
         } else {
             result = Double.NaN;

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/eba71143/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/MeanGlobalStep.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/MeanGlobalStep.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/MeanGlobalStep.java
index 66092a5..f658271 100644
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/MeanGlobalStep.java
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/MeanGlobalStep.java
@@ -18,17 +18,18 @@
  */
 package org.apache.tinkerpop.gremlin.process.traversal.step.map;
 
-import org.apache.tinkerpop.gremlin.process.traversal.Traversal;
-import org.apache.tinkerpop.gremlin.process.traversal.Traverser;
 import org.apache.tinkerpop.gremlin.process.computer.KeyValue;
 import org.apache.tinkerpop.gremlin.process.computer.MapReduce;
 import org.apache.tinkerpop.gremlin.process.computer.traversal.TraversalVertexProgram;
 import org.apache.tinkerpop.gremlin.process.computer.util.StaticMapReduce;
-import org.apache.tinkerpop.gremlin.process.traversal.step.util.ReducingBarrierStep;
+import org.apache.tinkerpop.gremlin.process.traversal.NumberHelper;
+import org.apache.tinkerpop.gremlin.process.traversal.Traversal;
+import org.apache.tinkerpop.gremlin.process.traversal.Traverser;
 import org.apache.tinkerpop.gremlin.process.traversal.step.MapReducer;
+import org.apache.tinkerpop.gremlin.process.traversal.step.util.FinalGet;
+import org.apache.tinkerpop.gremlin.process.traversal.step.util.ReducingBarrierStep;
 import org.apache.tinkerpop.gremlin.process.traversal.traverser.TraverserRequirement;
 import org.apache.tinkerpop.gremlin.process.traversal.traverser.util.TraverserSet;
-import org.apache.tinkerpop.gremlin.process.traversal.step.util.FinalGet;
 import org.apache.tinkerpop.gremlin.structure.Vertex;
 import org.apache.tinkerpop.gremlin.util.function.MeanNumberSupplier;
 
@@ -39,6 +40,10 @@ import java.util.Set;
 import java.util.function.BiFunction;
 import java.util.function.Supplier;
 
+import static org.apache.tinkerpop.gremlin.process.traversal.NumberHelper.add;
+import static org.apache.tinkerpop.gremlin.process.traversal.NumberHelper.div;
+import static org.apache.tinkerpop.gremlin.process.traversal.NumberHelper.mul;
+
 /**
  * @author Marko A. Rodriguez (http://markorodriguez.com)
  * @author Daniel Kuppitz (http://gremlin.guru)
@@ -59,7 +64,7 @@ public final class MeanGlobalStep<S extends Number, E extends Number> extends Re
     }
 
     @Override
-    public MapReduce<Number, Long, Number, Long, Double> getMapReduce() {
+    public MapReduce<Number, Long, Number, Long, Number> getMapReduce() {
         return MeanGlobalMapReduce.instance();
     }
 
@@ -78,14 +83,14 @@ public final class MeanGlobalStep<S extends Number, E extends Number> extends Re
             return (S) ((MeanNumber) mutatingSeed).add(traverser.get(), traverser.bulk());
         }
 
-        public final static <S extends Number> MeanGlobalBiFunction<S> instance() {
+        public static <S extends Number> MeanGlobalBiFunction<S> instance() {
             return INSTANCE;
         }
     }
 
     ///////////
 
-    private static final class MeanGlobalMapReduce extends StaticMapReduce<Number, Long, Number, Long, Double> {
+    private static final class MeanGlobalMapReduce extends StaticMapReduce<Number, Long, Number, Long, Number> {
 
         private static final MeanGlobalMapReduce INSTANCE = new MeanGlobalMapReduce();
 
@@ -123,81 +128,83 @@ public final class MeanGlobalStep<S extends Number, E extends Number> extends Re
         }
 
         @Override
-        public Double generateFinalResult(final Iterator<KeyValue<Number, Long>> keyValues) {
+        public Number generateFinalResult(final Iterator<KeyValue<Number, Long>> keyValues) {
             if (keyValues.hasNext()) {
                 KeyValue<Number, Long> pair = keyValues.next();
-                double result = pair.getKey().doubleValue() * pair.getValue();
                 long counter = pair.getValue();
+                Number result = mul(pair.getKey(), counter);
                 while (keyValues.hasNext()) {
+                    long incr = pair.getValue();
                     pair = keyValues.next();
-                    result += pair.getKey().doubleValue() * pair.getValue();
-                    counter += pair.getValue();
+                    result = add(result, mul(pair.getKey(), incr));
+                    counter += incr;
                 }
-                return result / counter;
+                return div(result, counter, true);
             }
             return Double.NaN;
         }
 
-        public static final MeanGlobalMapReduce instance() {
+        public static MeanGlobalMapReduce instance() {
             return INSTANCE;
         }
     }
 
     ///
 
-    public static final class MeanNumber extends Number implements Comparable<Number>, FinalGet<Double> {
+    public static final class MeanNumber extends Number implements Comparable<Number>, FinalGet<Number> {
 
         private long count;
-        private double sum;
+        private Number sum;
 
         public MeanNumber() {
-            this(0.0d, 0l);
+            this(0, 0);
         }
 
-        public MeanNumber(final double number, final long count) {
+        public MeanNumber(final Number number, final long count) {
             this.count = count;
-            this.sum = number * count;
+            this.sum = mul(number, count);
         }
 
         public MeanNumber add(final Number amount, final long count) {
             this.count += count;
-            this.sum += amount.doubleValue() * count;
+            this.sum = NumberHelper.add(sum, mul(amount, count));
             return this;
         }
 
         public MeanNumber add(final MeanNumber other) {
             this.count += other.count;
-            this.sum += other.sum;
+            this.sum = NumberHelper.add(sum, other.sum);
             return this;
         }
 
         @Override
         public int intValue() {
-            return (int) (this.sum / this.count);
+            return div(this.sum, this.count).intValue();
         }
 
         @Override
         public long longValue() {
-            return (long) (this.sum / this.count);
+            return div(this.sum, this.count).longValue();
         }
 
         @Override
         public float floatValue() {
-            return (float) (this.sum / this.count);
+            return div(this.sum, this.count, true).floatValue();
         }
 
         @Override
         public double doubleValue() {
-            return this.sum / this.count;
+            return div(this.sum, this.count, true).doubleValue();
         }
 
         @Override
         public String toString() {
-            return Double.toString(this.doubleValue());
+            return div(this.sum, this.count, true).toString();
         }
 
         @Override
         public int compareTo(final Number number) {
+            // TODO: NumberHelper should provide a compareTo() implementation
             return Double.valueOf(this.doubleValue()).compareTo(number.doubleValue());
         }
 

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/eba71143/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/MinGlobalStep.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/MinGlobalStep.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/MinGlobalStep.java
index 6a3ba10..750e36c 100644
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/MinGlobalStep.java
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/MinGlobalStep.java
@@ -37,6 +37,8 @@ import java.util.Iterator;
 import java.util.Set;
 import java.util.function.BiFunction;
 
+import static org.apache.tinkerpop.gremlin.process.traversal.NumberHelper.min;
+
 /**
  * @author Marko A. Rodriguez (http://markorodriguez.com)
  */
@@ -70,10 +72,11 @@ public final class MinGlobalStep<S extends Number> extends ReducingBarrierStep<S
 
         @Override
         public S apply(final S mutatingSeed, final Traverser<S> traverser) {
-            return mutatingSeed != null && mutatingSeed.doubleValue() <= traverser.get().doubleValue() ? mutatingSeed : traverser.get();
+            final S value = traverser.get();
+            return mutatingSeed != null ? (S) min(mutatingSeed, traverser.get()) : value;
         }
 
-        public final static <S extends Number> MinGlobalBiFunction<S> instance() {
+        public static <S extends Number> MinGlobalBiFunction<S> instance() {
             return INSTANCE;
         }
     }
@@ -106,11 +109,10 @@ public final class MinGlobalStep<S extends Number> extends ReducingBarrierStep<S
         @Override
         public void reduce(final NullObject key, final Iterator<Number> values, final ReduceEmitter<NullObject, Number> emitter) {
             if (values.hasNext()) {
-                Number min = Double.MAX_VALUE;
+                Number min = null;
                 while (values.hasNext()) {
                     final Number value = values.next();
-                    if (value.doubleValue() < min.doubleValue())
-                        min = value;
+                    min = min != null ? min(value, min) : value;
                 }
                 emitter.emit(min);
             }
@@ -126,7 +128,7 @@ public final class MinGlobalStep<S extends Number> extends ReducingBarrierStep<S
             return keyValues.hasNext() ? keyValues.next().getValue() : Double.NaN;
         }
 
-        public static final MinGlobalMapReduce instance() {
+        public static MinGlobalMapReduce instance() {
             return INSTANCE;
         }
     }

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/eba71143/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/MinLocalStep.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/MinLocalStep.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/MinLocalStep.java
index 2959285..116a5e1 100644
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/MinLocalStep.java
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/MinLocalStep.java
@@ -26,6 +26,8 @@ import java.util.Collections;
 import java.util.Iterator;
 import java.util.Set;
 
+import static org.apache.tinkerpop.gremlin.process.traversal.NumberHelper.min;
+
 /**
  * @author Marko A. Rodriguez (http://markorodriguez.com)
  * @author Daniel Kuppitz (http://gremlin.guru)
@@ -43,8 +45,7 @@ public final class MinLocalStep<E extends Number, S extends Iterable<E>> extends
         if (iterator.hasNext()) {
             result = iterator.next();
             while (iterator.hasNext()) {
-                final Number curr = iterator.next();
-                if (result.doubleValue() > curr.doubleValue()) result = curr;
+                result = min(iterator.next(), result);
             }
         } else {
             result = Double.NaN;

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/eba71143/tinkergraph-gremlin/src/test/java/org/apache/tinkerpop/gremlin/tinkergraph/structure/TinkerGraphPlayTest.java
----------------------------------------------------------------------
diff --git a/tinkergraph-gremlin/src/test/java/org/apache/tinkerpop/gremlin/tinkergraph/structure/TinkerGraphPlayTest.java b/tinkergraph-gremlin/src/test/java/org/apache/tinkerpop/gremlin/tinkergraph/structure/TinkerGraphPlayTest.java
index efb4a5b..d5a7d1d 100644
--- a/tinkergraph-gremlin/src/test/java/org/apache/tinkerpop/gremlin/tinkergraph/structure/TinkerGraphPlayTest.java
+++ b/tinkergraph-gremlin/src/test/java/org/apache/tinkerpop/gremlin/tinkergraph/structure/TinkerGraphPlayTest.java
@@ -192,12 +192,9 @@ public class TinkerGraphPlayTest {
     @Test
     @Ignore
     public void testPlayDK() throws Exception {
-        final Number n = __.inject(1, 2L, 3f).sum().next();
-        System.out.println(n.toString());
-        System.out.println(n.getClass().toString());
-        final Double d = __.inject(1, 2L, 3f).<Double>sum().next();
-        System.out.println(d.toString());
-        System.out.println(d.getClass().toString());
+        TinkerGraph graph = TinkerFactory.createModern();
+        GraphTraversalSource g = graph.traversal(GraphTraversalSource.standard());
+        final Number m = g.V().values("age").mean().next();
     }
 
     @Test