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 2017/07/15 04:15:38 UTC

[12/23] systemml git commit: Fix visit status bug

Fix visit status bug


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

Branch: refs/heads/master
Commit: 0a8936cd849d74baced732f45f1c53812abce537
Parents: d6d3795
Author: Dylan Hutchison <dh...@cs.washington.edu>
Authored: Sun Jun 11 03:55:25 2017 -0700
Committer: Dylan Hutchison <dh...@cs.washington.edu>
Committed: Sun Jun 18 17:43:48 2017 -0700

----------------------------------------------------------------------
 .../apache/sysml/hops/rewrite/HopDagValidator.java |  5 ++++-
 .../RewriteElementwiseMultChainOptimization.java   | 17 +++++++++--------
 2 files changed, 13 insertions(+), 9 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/systemml/blob/0a8936cd/src/main/java/org/apache/sysml/hops/rewrite/HopDagValidator.java
----------------------------------------------------------------------
diff --git a/src/main/java/org/apache/sysml/hops/rewrite/HopDagValidator.java b/src/main/java/org/apache/sysml/hops/rewrite/HopDagValidator.java
index 8cb5e1e..9ac21fc 100644
--- a/src/main/java/org/apache/sysml/hops/rewrite/HopDagValidator.java
+++ b/src/main/java/org/apache/sysml/hops/rewrite/HopDagValidator.java
@@ -35,6 +35,8 @@ import org.apache.sysml.parser.Expression;
 import org.apache.sysml.runtime.DMLRuntimeException;
 import org.apache.sysml.utils.Explain;
 
+import com.google.common.collect.Lists;
+
 import static org.apache.sysml.hops.HopsException.check;
 
 /**
@@ -89,7 +91,8 @@ public class HopDagValidator {
 		//check visit status
 		final boolean seen = !state.seen.add(id);
 		check(seen == hop.isVisited(), hop,
-				"seen previously is %b but does not match hop visit status", seen);
+				"(parents: %s) seen previously is %b but does not match hop visit status",
+				Lists.transform(hop.getParent(), Hop::getHopID), seen);
 		if (seen) return; // we saw the Hop previously, no need to re-validate
 		
 		//check parent linking

http://git-wip-us.apache.org/repos/asf/systemml/blob/0a8936cd/src/main/java/org/apache/sysml/hops/rewrite/RewriteElementwiseMultChainOptimization.java
----------------------------------------------------------------------
diff --git a/src/main/java/org/apache/sysml/hops/rewrite/RewriteElementwiseMultChainOptimization.java b/src/main/java/org/apache/sysml/hops/rewrite/RewriteElementwiseMultChainOptimization.java
index 91b7306..9ca0932 100644
--- a/src/main/java/org/apache/sysml/hops/rewrite/RewriteElementwiseMultChainOptimization.java
+++ b/src/main/java/org/apache/sysml/hops/rewrite/RewriteElementwiseMultChainOptimization.java
@@ -91,7 +91,7 @@ public class RewriteElementwiseMultChainOptimization extends HopRewriteRule {
 						(!isBinaryMult(right) || checkForeignParent(emults, (BinaryOp)right));
 				if (okay) {
 					// 4. Construct replacement EMults for the leaves
-					final Hop replacement = constructReplacement(leaves);
+					final Hop replacement = constructReplacement(emults, leaves);
 					if (LOG.isDebugEnabled())
 						LOG.debug(String.format(
 								"Element-wise multiply chain rewrite of %d e-mults at sub-dag %d to new sub-dag %d",
@@ -123,13 +123,14 @@ public class RewriteElementwiseMultChainOptimization extends HopRewriteRule {
 		}
 	}
 
-	private static Hop constructReplacement(final Multiset<Hop> leaves) {
+	private static Hop constructReplacement(final Set<BinaryOp> emults, final Multiset<Hop> leaves) {
 		// Sort by data type
 		final SortedMap<Hop,Integer> sorted = new TreeMap<>(compareByDataType);
 		for (final Multiset.Entry<Hop> entry : leaves.entrySet()) {
 			final Hop h = entry.getElement();
-			// unlink parents (the EMults, which we are throwing away)
-			h.getParent().clear();
+			// unlink parents that are in the emult set(we are throwing them away)
+			// keep other parents
+			h.getParent().removeIf(parent -> parent instanceof BinaryOp && emults.contains(parent));
 			sorted.put(h, entry.getCount());
 		}
 		// sorted contains all leaves, sorted by data type, stripped from their parents
@@ -146,12 +147,13 @@ public class RewriteElementwiseMultChainOptimization extends HopRewriteRule {
 		return first;
 	}
 
-	private static Hop constructPower(Map.Entry<Hop, Integer> entry) {
+	private static Hop constructPower(final Map.Entry<Hop, Integer> entry) {
 		final Hop hop = entry.getKey();
 		final int cnt = entry.getValue();
 		assert(cnt >= 1);
+		hop.setVisited(); // we will visit the leaves' children next
 		if (cnt == 1)
-			return hop; // don't set this visited... we will visit this next
+			return hop;
 		Hop pow = HopRewriteUtils.createBinary(hop, new LiteralOp(cnt), Hop.OpOp2.POW);
 		pow.setVisited();
 		return pow;
@@ -222,8 +224,7 @@ public class RewriteElementwiseMultChainOptimization extends HopRewriteRule {
 		final ArrayList<Hop> parents = child.getParent();
 		if (parents.size() > 1)
 			for (final Hop parent : parents)
-				//noinspection SuspiciousMethodCalls (for Intellij, which checks when
-				if (!emults.contains(parent))
+				if (parent instanceof BinaryOp && !emults.contains(parent))
 					return false;
 		// child does not have foreign parents