You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@systemml.apache.org by mb...@apache.org on 2016/01/04 01:01:04 UTC

[2/4] incubator-systemml git commit: New static simplification rewrite 'simplify unary-over-ppred operations'

New static simplification rewrite 'simplify unary-over-ppred operations'

Examples are abs(ppred()) -> ppred() and similarly ceil, floor, and
round over ppred because ppred guarantees 0/1 indicator outputs.

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

Branch: refs/heads/master
Commit: ba08b4c1b25f0a66e24cc8bf5ebf0c5f7f71581a
Parents: f514f82
Author: Matthias Boehm <mb...@us.ibm.com>
Authored: Sat Jan 2 16:52:59 2016 -0800
Committer: Matthias Boehm <mb...@us.ibm.com>
Committed: Sat Jan 2 16:52:59 2016 -0800

----------------------------------------------------------------------
 .../RewriteAlgebraicSimplificationStatic.java   | 35 +++++++++++++++++++-
 1 file changed, 34 insertions(+), 1 deletion(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-systemml/blob/ba08b4c1/src/main/java/org/apache/sysml/hops/rewrite/RewriteAlgebraicSimplificationStatic.java
----------------------------------------------------------------------
diff --git a/src/main/java/org/apache/sysml/hops/rewrite/RewriteAlgebraicSimplificationStatic.java b/src/main/java/org/apache/sysml/hops/rewrite/RewriteAlgebraicSimplificationStatic.java
index adda6a2..5483bed 100644
--- a/src/main/java/org/apache/sysml/hops/rewrite/RewriteAlgebraicSimplificationStatic.java
+++ b/src/main/java/org/apache/sysml/hops/rewrite/RewriteAlgebraicSimplificationStatic.java
@@ -138,7 +138,8 @@ public class RewriteAlgebraicSimplificationStatic extends HopRewriteRule
  			hi = simplifyDistributiveBinaryOperation(hop, hi, i);//e.g., (X-Y*X) -> (1-Y)*X
  			hi = simplifyBushyBinaryOperation(hop, hi, i);       //e.g., (X*(Y*(Z%*%v))) -> (X*Y)*(Z%*%v)
  			hi = simplifyUnaryAggReorgOperation(hop, hi, i);     //e.g., sum(t(X)) -> sum(X)
-			hi = simplifyTransposedAppend(hop, hi, i);           //e.g., t(cbind(t(A),t(B))) -> rbind(A,B);
+			hi = simplifyUnaryPPredOperation(hop, hi, i);        //e.g., abs(ppred()) -> ppred(), others: round, ceil, floor
+ 			hi = simplifyTransposedAppend(hop, hi, i);           //e.g., t(cbind(t(A),t(B))) -> rbind(A,B);
  			hi = fuseBinarySubDAGToUnaryOperation(hop, hi, i);   //e.g., X*(1-X)-> sprop(X) || 1/(1+exp(-X)) -> sigmoid(X) || X*(X>0) -> selp(X)
 			hi = simplifyTraceMatrixMult(hop, hi, i);            //e.g., trace(X%*%Y)->sum(X*t(Y));  
 			hi = simplifySlicedMatrixMult(hop, hi, i);           //e.g., (X%*%Y)[1,1] -> X[1,] %*% Y[,1];
@@ -744,6 +745,38 @@ public class RewriteAlgebraicSimplificationStatic extends HopRewriteRule
 	 * @param pos
 	 * @return
 	 */
+	private Hop simplifyUnaryPPredOperation( Hop parent, Hop hi, int pos )
+	{
+		if( hi instanceof UnaryOp && hi.getDataType()==DataType.MATRIX  //unaryop
+			&& hi.getInput().get(0) instanceof BinaryOp                 //binaryop - ppred
+			&& ((BinaryOp)hi.getInput().get(0)).isPPredOperation() )
+		{
+			UnaryOp uop = (UnaryOp) hi; //valid unary op
+			if( uop.getOp()==OpOp1.ABS || uop.getOp()==OpOp1.CEIL
+				|| uop.getOp()==OpOp1.FLOOR || uop.getOp()==OpOp1.ROUND )
+			{
+				//clear link unary-binary
+				Hop input = uop.getInput().get(0);
+				HopRewriteUtils.removeAllChildReferences(hi);
+				
+				HopRewriteUtils.removeChildReferenceByPos(parent, hi, pos);
+				HopRewriteUtils.addChildReference(parent, input, pos);
+				hi = input;
+				
+				LOG.debug("Applied simplifyUnaryPPredOperation.");	
+			}
+		}
+		
+		return hi;
+	}
+	
+	/**
+	 * 
+	 * @param parent
+	 * @param hi
+	 * @param pos
+	 * @return
+	 */
 	private Hop simplifyTransposedAppend( Hop parent, Hop hi, int pos )
 	{
 		//e.g., t(cbind(t(A),t(B))) --> rbind(A,B), t(rbind(t(A),t(B))) --> cbind(A,B)