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

[11/50] [abbrv] incubator-systemml git commit: [SYSML-221] New simplification rewrite 'simplify transposed append'

[SYSML-221] New simplification rewrite 'simplify transposed append'

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

Branch: refs/heads/master
Commit: 655e7060580d3118d3fc8b0a0ca7b85eca7174db
Parents: 1043f43
Author: Matthias Boehm <mb...@us.ibm.com>
Authored: Thu Oct 29 01:52:14 2015 -0700
Committer: Matthias Boehm <mb...@us.ibm.com>
Committed: Thu Oct 29 12:28:24 2015 -0700

----------------------------------------------------------------------
 .../RewriteAlgebraicSimplificationStatic.java   | 54 +++++++++++++++++++-
 1 file changed, 53 insertions(+), 1 deletion(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-systemml/blob/655e7060/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 9e09da8..25f4f4e 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
@@ -140,7 +140,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 = fuseBinarySubDAGToUnaryOperation(hop, hi, i);   //e.g., X*(1-X)-> sprop(X) || 1/(1+exp(-X)) -> sigmoid(X) || X*(X>0) -> selp(X)
+			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];
 			hi = simplifyConstantSort(hop, hi, i);               //e.g., order(matrix())->matrix/seq; 
@@ -742,6 +743,57 @@ public class RewriteAlgebraicSimplificationStatic extends HopRewriteRule
 	}
 	
 	/**
+	 * 
+	 * @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)		
+		if(   hi instanceof ReorgOp && ((ReorgOp)hi).getOp()==ReOrgOp.TRANSPOSE  //t() rooted
+		   && hi.getInput().get(0) instanceof BinaryOp
+		   && (((BinaryOp)hi.getInput().get(0)).getOp()==OpOp2.CBIND    //append (cbind/rbind)
+		    || ((BinaryOp)hi.getInput().get(0)).getOp()==OpOp2.RBIND) 
+		   && hi.getInput().get(0).getParent().size() == 1 ) //single consumers of append
+		{
+			BinaryOp bop = (BinaryOp)hi.getInput().get(0);
+			if( bop.getInput().get(0) instanceof ReorgOp  //both inputs transpose ops
+				&& ((ReorgOp)bop.getInput().get(0)).getOp()==ReOrgOp.TRANSPOSE
+				&& bop.getInput().get(1) instanceof ReorgOp 
+				&& ((ReorgOp)bop.getInput().get(1)).getOp()==ReOrgOp.TRANSPOSE )
+			{
+				Hop left = bop.getInput().get(0).getInput().get(0);
+				Hop right = bop.getInput().get(1).getInput().get(0);
+				
+				//rewire links from parent, transpose, and binary
+				HopRewriteUtils.removeChildReferenceByPos(parent, hi, pos);
+				HopRewriteUtils.addChildReference(parent, bop, pos);
+				HopRewriteUtils.removeAllChildReferences(hi);
+				HopRewriteUtils.removeAllChildReferences(bop);
+				
+				//change append type (safe due to single parent check)
+				if( bop.getOp()==OpOp2.CBIND )
+					bop.setOp(OpOp2.RBIND);
+				else 
+					bop.setOp(OpOp2.CBIND);
+				
+				//relink new childs to binary op
+				HopRewriteUtils.addChildReference(bop, left, 0);
+				HopRewriteUtils.addChildReference(bop, right, 1);
+				bop.refreshSizeInformation();
+				
+				hi = bop;
+			
+				LOG.debug("Applied simplifyTransposedAppend (line "+hi.getBeginLine()+").");				
+			}
+		}
+		
+		return hi;
+	}
+	
+	/**
 	 * handle simplification of more complex sub DAG to unary operation.
 	 * 
 	 * X*(1-X) -> sprop(X)