You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@systemml.apache.org by du...@apache.org on 2015/11/21 22:29:24 UTC

incubator-systemml git commit: [SYSML-375] [Optimizer] Address Optimizer Inconsistencies Due to Casting of Doubles To Ints

Repository: incubator-systemml
Updated Branches:
  refs/heads/master b54555001 -> d3ca159c0


[SYSML-375] [Optimizer] Address Optimizer Inconsistencies Due to Casting of Doubles To Ints

This addresses a few inconsistencies with our optimizer in which accidental truncation of double values to integer values via casting could lead to rewrite rules being mistakenly applied.  As an example, a rewrite rule targeting the expression 'sum(v^2)' could be mistakenly applied to the expression 'sum(v^2.3)'.

Closes #2.


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

Branch: refs/heads/master
Commit: d3ca159c0329e7ce8502ffeeb5ed7e771510879c
Parents: b545550
Author: Mike Dusenberry <mw...@us.ibm.com>
Authored: Sat Nov 21 13:20:03 2015 -0800
Committer: Mike Dusenberry <mw...@us.ibm.com>
Committed: Sat Nov 21 13:20:03 2015 -0800

----------------------------------------------------------------------
 src/main/java/com/ibm/bi/dml/hops/TernaryOp.java            | 4 ++--
 .../com/ibm/bi/dml/hops/recompile/LiteralReplacement.java   | 2 +-
 .../java/com/ibm/bi/dml/hops/rewrite/HopRewriteUtils.java   | 9 +++++----
 .../hops/rewrite/RewriteAlgebraicSimplificationDynamic.java | 2 +-
 .../hops/rewrite/RewriteAlgebraicSimplificationStatic.java  | 6 +++---
 5 files changed, 12 insertions(+), 11 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-systemml/blob/d3ca159c/src/main/java/com/ibm/bi/dml/hops/TernaryOp.java
----------------------------------------------------------------------
diff --git a/src/main/java/com/ibm/bi/dml/hops/TernaryOp.java b/src/main/java/com/ibm/bi/dml/hops/TernaryOp.java
index c16f66c..c1cb96b 100644
--- a/src/main/java/com/ibm/bi/dml/hops/TernaryOp.java
+++ b/src/main/java/com/ibm/bi/dml/hops/TernaryOp.java
@@ -930,7 +930,7 @@ public class TernaryOp extends Hop
 						DataGenOp dgop = (DataGenOp) input1;
 						if( dgop.getOp() == DataGenMethod.SEQ ){
 							Hop incr = dgop.getInput().get(dgop.getParamIndex(Statement.SEQ_INCR));
-							ret = (incr instanceof LiteralOp && HopRewriteUtils.getIntValue((LiteralOp)incr)==1)
+							ret = (incr instanceof LiteralOp && HopRewriteUtils.getDoubleValue((LiteralOp)incr)==1)
 								  || dgop.getIncrementValue()==1.0; //set by recompiler
 						}
 					}
@@ -940,7 +940,7 @@ public class TernaryOp extends Hop
 						DataGenOp dgop = (DataGenOp) input2;
 						if( dgop.getOp() == DataGenMethod.SEQ ){
 							Hop incr = dgop.getInput().get(dgop.getParamIndex(Statement.SEQ_INCR));
-							ret |= (incr instanceof LiteralOp && HopRewriteUtils.getIntValue((LiteralOp)incr)==1)
+							ret |= (incr instanceof LiteralOp && HopRewriteUtils.getDoubleValue((LiteralOp)incr)==1)
 								   || dgop.getIncrementValue()==1.0; //set by recompiler;
 						}
 					}

http://git-wip-us.apache.org/repos/asf/incubator-systemml/blob/d3ca159c/src/main/java/com/ibm/bi/dml/hops/recompile/LiteralReplacement.java
----------------------------------------------------------------------
diff --git a/src/main/java/com/ibm/bi/dml/hops/recompile/LiteralReplacement.java b/src/main/java/com/ibm/bi/dml/hops/recompile/LiteralReplacement.java
index 4a645ff..9610be3 100644
--- a/src/main/java/com/ibm/bi/dml/hops/recompile/LiteralReplacement.java
+++ b/src/main/java/com/ibm/bi/dml/hops/recompile/LiteralReplacement.java
@@ -217,7 +217,7 @@ public class LiteralReplacement
 						ret = new LiteralOp(ival);		
 						break;
 					case CAST_AS_DOUBLE:
-						long dval = HopRewriteUtils.getIntValue(sdat);
+						double dval = HopRewriteUtils.getDoubleValue(sdat);
 						ret = new LiteralOp(dval);		
 						break;						
 					case CAST_AS_BOOLEAN:

http://git-wip-us.apache.org/repos/asf/incubator-systemml/blob/d3ca159c/src/main/java/com/ibm/bi/dml/hops/rewrite/HopRewriteUtils.java
----------------------------------------------------------------------
diff --git a/src/main/java/com/ibm/bi/dml/hops/rewrite/HopRewriteUtils.java b/src/main/java/com/ibm/bi/dml/hops/rewrite/HopRewriteUtils.java
index 3d7e830..6da131c 100644
--- a/src/main/java/com/ibm/bi/dml/hops/rewrite/HopRewriteUtils.java
+++ b/src/main/java/com/ibm/bi/dml/hops/rewrite/HopRewriteUtils.java
@@ -159,10 +159,11 @@ public class HopRewriteUtils
 	}
 	
 	/**
-	 * 
-	 * @param op
-	 * @return
-	 * @throws HopsException
+	 * Return the int value of a LiteralOp (as a long).
+	 *
+	 * Note: For comparisons, this is *only* to be used in situations
+	 * in which the value is absolutely guaranteed to be an integer.
+	 * Otherwise, a safer alternative is `getDoubleValue`.
 	 */
 	public static long getIntValue( LiteralOp op )
 		throws HopsException

http://git-wip-us.apache.org/repos/asf/incubator-systemml/blob/d3ca159c/src/main/java/com/ibm/bi/dml/hops/rewrite/RewriteAlgebraicSimplificationDynamic.java
----------------------------------------------------------------------
diff --git a/src/main/java/com/ibm/bi/dml/hops/rewrite/RewriteAlgebraicSimplificationDynamic.java b/src/main/java/com/ibm/bi/dml/hops/rewrite/RewriteAlgebraicSimplificationDynamic.java
index 3c50a3a..5c7a0fb 100644
--- a/src/main/java/com/ibm/bi/dml/hops/rewrite/RewriteAlgebraicSimplificationDynamic.java
+++ b/src/main/java/com/ibm/bi/dml/hops/rewrite/RewriteAlgebraicSimplificationDynamic.java
@@ -1363,7 +1363,7 @@ public class RewriteAlgebraicSimplificationDynamic extends HopRewriteRule
 			//check for sum(v^2), might have been rewritten from sum(v*v)
 			if( hi2 instanceof BinaryOp && ((BinaryOp)hi2).getOp()==OpOp2.POW
 				&& hi2.getInput().get(1) instanceof LiteralOp 
-				&& HopRewriteUtils.getIntValue((LiteralOp)hi2.getInput().get(1))==2
+				&& HopRewriteUtils.getDoubleValue((LiteralOp)hi2.getInput().get(1))==2
 				&& hi2.getParent().size() == 1 ) //no other consumer than sum
 			{
 				Hop input = hi2.getInput().get(0);

http://git-wip-us.apache.org/repos/asf/incubator-systemml/blob/d3ca159c/src/main/java/com/ibm/bi/dml/hops/rewrite/RewriteAlgebraicSimplificationStatic.java
----------------------------------------------------------------------
diff --git a/src/main/java/com/ibm/bi/dml/hops/rewrite/RewriteAlgebraicSimplificationStatic.java b/src/main/java/com/ibm/bi/dml/hops/rewrite/RewriteAlgebraicSimplificationStatic.java
index 6bfabd3..4fc23eb 100644
--- a/src/main/java/com/ibm/bi/dml/hops/rewrite/RewriteAlgebraicSimplificationStatic.java
+++ b/src/main/java/com/ibm/bi/dml/hops/rewrite/RewriteAlgebraicSimplificationStatic.java
@@ -1347,7 +1347,7 @@ public class RewriteAlgebraicSimplificationStatic extends HopRewriteRule
 				&& HopRewriteUtils.isEqualSize(bop.getInput().get(0), bop.getInput().get(1)) //prevent mv
 				&& ((BinaryOp)bop.getInput().get(1)).getOp()==OpOp2.POW 
 				&& bop.getInput().get(1).getInput().get(1) instanceof LiteralOp
-				&& HopRewriteUtils.getIntValue((LiteralOp)bop.getInput().get(1).getInput().get(1))==2)
+				&& HopRewriteUtils.getDoubleValue((LiteralOp)bop.getInput().get(1).getInput().get(1))==2)
 			{
 				Hop W = bop.getInput().get(0);
 				Hop tmp = bop.getInput().get(1).getInput().get(0); //(X - U %*% t(V))
@@ -1403,7 +1403,7 @@ public class RewriteAlgebraicSimplificationStatic extends HopRewriteRule
 			//alternative pattern: sum ((W * (U %*% t(V)) - X) ^ 2)
 			if( !appliedPattern
 				&& bop.getOp()==OpOp2.POW && bop.getInput().get(1) instanceof LiteralOp
-				&& HopRewriteUtils.getIntValue((LiteralOp)bop.getInput().get(1))==2
+				&& HopRewriteUtils.getDoubleValue((LiteralOp)bop.getInput().get(1))==2
 				&& bop.getInput().get(0) instanceof BinaryOp	
 				&& bop.getInput().get(0).getDataType()==DataType.MATRIX	
 				&& ((BinaryOp)bop.getInput().get(0)).getOp()==OpOp2.MINUS
@@ -1458,7 +1458,7 @@ public class RewriteAlgebraicSimplificationStatic extends HopRewriteRule
 			//alternative pattern: sum (((U %*% t(V)) - X) ^ 2)
 			if( !appliedPattern
 				&& bop.getOp()==OpOp2.POW && bop.getInput().get(1) instanceof LiteralOp
-				&& HopRewriteUtils.getIntValue((LiteralOp)bop.getInput().get(1))==2
+				&& HopRewriteUtils.getDoubleValue((LiteralOp)bop.getInput().get(1))==2
 				&& bop.getInput().get(0) instanceof BinaryOp	
 				&& bop.getInput().get(0).getDataType()==DataType.MATRIX	
 				&& ((BinaryOp)bop.getInput().get(0)).getOp()==OpOp2.MINUS