From ca60f356c14134a1718c95283d843b4983700027 Mon Sep 17 00:00:00 2001 From: ywcb00 Date: Tue, 6 Oct 2026 14:52:13 +0200 Subject: [PATCH 1/5] refactor(main/hops/rewrite/RewriteSplitDagUnknownNnz.java): rename java class to not being exclusive for read instructions --- .../java/org/apache/sysds/hops/rewrite/ProgramRewriter.java | 2 +- ...litDagUnknownNnzRead.java => RewriteSplitDagUnknownNnz.java} | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) rename src/main/java/org/apache/sysds/hops/rewrite/{RewriteSplitDagUnknownNnzRead.java => RewriteSplitDagUnknownNnz.java} (98%) diff --git a/src/main/java/org/apache/sysds/hops/rewrite/ProgramRewriter.java b/src/main/java/org/apache/sysds/hops/rewrite/ProgramRewriter.java index ac3698bdcac..c1751845544 100644 --- a/src/main/java/org/apache/sysds/hops/rewrite/ProgramRewriter.java +++ b/src/main/java/org/apache/sysds/hops/rewrite/ProgramRewriter.java @@ -107,7 +107,7 @@ public ProgramRewriter(boolean staticRewrites, boolean dynamicRewrites) if( OptimizerUtils.ALLOW_SPLIT_HOP_DAGS ) _sbRuleSet.add( new RewriteSplitDagUnknownCSVRead() ); //dependency: reblock, merge blocks if(ConfigurationManager.getDMLConfig().getBooleanValue(DMLConfig.SPARSITY_RECOMPILE)) - _sbRuleSet.add(new RewriteSplitDagUnknownNnzRead()); + _sbRuleSet.add(new RewriteSplitDagUnknownNnz()); if( OptimizerUtils.ALLOW_SPLIT_HOP_DAGS && ConfigurationManager.getCompilerConfigFlag(ConfigType.ALLOW_INDIVIDUAL_SB_SPECIFIC_OPS) ) _sbRuleSet.add( new RewriteSplitDagDataDependentOperators() ); //dependency: merge blocks diff --git a/src/main/java/org/apache/sysds/hops/rewrite/RewriteSplitDagUnknownNnzRead.java b/src/main/java/org/apache/sysds/hops/rewrite/RewriteSplitDagUnknownNnz.java similarity index 98% rename from src/main/java/org/apache/sysds/hops/rewrite/RewriteSplitDagUnknownNnzRead.java rename to src/main/java/org/apache/sysds/hops/rewrite/RewriteSplitDagUnknownNnz.java index fd39115a982..7c188ca23c8 100644 --- a/src/main/java/org/apache/sysds/hops/rewrite/RewriteSplitDagUnknownNnzRead.java +++ b/src/main/java/org/apache/sysds/hops/rewrite/RewriteSplitDagUnknownNnz.java @@ -36,7 +36,7 @@ * Rule: Split Hop DAG after reads with unknown nnz. This is important to create recompile * hooks if mtd has unspecified nnz. */ -public class RewriteSplitDagUnknownNnzRead extends StatementBlockRewriteRule { +public class RewriteSplitDagUnknownNnz extends StatementBlockRewriteRule { @Override public boolean createsSplitDag() { return true; From 436ab6b9418a55ef003c7bb01a9644478cb8957e Mon Sep 17 00:00:00 2001 From: ywcb00 Date: Mon, 12 Oct 2026 17:00:39 +0200 Subject: [PATCH 2/5] feat(main/hops/rewrite/RewriteSplitDagUnknownNnz.java): split matrix multiplication chain into their own statement block --- .../rewrite/RewriteSplitDagUnknownNnz.java | 163 +++++++++++------- 1 file changed, 102 insertions(+), 61 deletions(-) diff --git a/src/main/java/org/apache/sysds/hops/rewrite/RewriteSplitDagUnknownNnz.java b/src/main/java/org/apache/sysds/hops/rewrite/RewriteSplitDagUnknownNnz.java index 7c188ca23c8..2bd27b1cd0b 100644 --- a/src/main/java/org/apache/sysds/hops/rewrite/RewriteSplitDagUnknownNnz.java +++ b/src/main/java/org/apache/sysds/hops/rewrite/RewriteSplitDagUnknownNnz.java @@ -20,17 +20,20 @@ package org.apache.sysds.hops.rewrite; import java.util.ArrayList; +import java.util.Collections; +import java.util.ListIterator; import java.util.List; import org.apache.sysds.common.Types.OpOpData; import org.apache.sysds.conf.ConfigurationManager; import org.apache.sysds.conf.DMLConfig; +import org.apache.sysds.hops.AggBinaryOp; import org.apache.sysds.hops.DataOp; import org.apache.sysds.hops.Hop; -import org.apache.sysds.hops.LiteralOp; import org.apache.sysds.parser.DataIdentifier; import org.apache.sysds.parser.StatementBlock; import org.apache.sysds.parser.VariableSet; +import org.apache.sysds.runtime.DMLRuntimeException; /** * Rule: Split Hop DAG after reads with unknown nnz. This is important to create recompile @@ -46,67 +49,59 @@ public boolean createsSplitDag() { public List rewriteStatementBlock(StatementBlock sb, ProgramRewriteStatus state) { ArrayList ret = new ArrayList<>(); - // collect all read hops w/ unknown nnz - ArrayList cand = new ArrayList<>(); - collectReadHopsUnknownNnz(sb.getHops(), cand); + // collect all candidate hops in levels based on their data dependencies + ArrayList> candidateLists = new ArrayList>(); + collectNnzComputationCandidates(sb.getHops(), candidateLists); + Collections.reverse(candidateLists); // reverse order of dependency levels // split hop dag on demand and if sparsity rewrites are enabled (splitting is pointless w/o rewrite) - if(!cand.isEmpty() && ConfigurationManager.getDMLConfig().getBooleanValue(DMLConfig.SPARSITY_REWRITES)) { - // duplicate sb incl live variable sets - StatementBlock sb1 = new StatementBlock(); - sb1.setDMLProg(sb.getDMLProg()); - sb1.setParseInfo(sb); - sb1.setLiveIn(new VariableSet()); - sb1.setLiveOut(new VariableSet()); - - // move reads incl reblock to new statement block - // (and replace original persistent read with transient read) - ArrayList sb1hops = new ArrayList<>(); - for(Hop reblock : cand) { - // replace reblock inputs to avoid dangling references across dags - // (otherwise, for instance, literal ops are shared across dags) - for(int i = 0; i < reblock.getInput().size(); i++) { - if(reblock.getInput().get(i) instanceof LiteralOp) { - HopRewriteUtils.replaceChildReference(reblock, reblock.getInput().get(i), - new LiteralOp((LiteralOp) reblock.getInput().get(i))); + if(!candidateLists.isEmpty() && ConfigurationManager.getDMLConfig().getBooleanValue(DMLConfig.SPARSITY_REWRITES)) { + for(ArrayList cand : candidateLists) { + // duplicate sb incl live variable sets + StatementBlock sbSplit = new StatementBlock(); + sbSplit.setDMLProg(sb.getDMLProg()); + sbSplit.setParseInfo(sb); + sbSplit.setLiveIn(new VariableSet()); + sbSplit.setLiveOut(new VariableSet()); + + // move candidate hops to new statement block + // (and replace original persistent read with transient read) + ArrayList sbSplitHops = new ArrayList<>(); + for(Hop cHop : cand) { + // create new transient read + DataOp tRead = HopRewriteUtils.createTransientRead(cHop.getName(), cHop); + tRead.setRequiresRecompile(); + + // replace persistent read with transient read + ArrayList parents = new ArrayList<>(cHop.getParent()); + for(int i = 0; i < parents.size(); i++) { + Hop parent = parents.get(i); + HopRewriteUtils.replaceChildReference(parent, cHop, tRead); } - } - // create new transient read - DataOp tRead = HopRewriteUtils.createTransientRead(reblock.getName(), reblock); - tRead.setRequiresRecompile(); + // add reblock sub dag to first statement block + DataOp tWrite = HopRewriteUtils.createTransientWrite(cHop.getName(), cHop); + sbSplitHops.add(tWrite); - // replace reblock with transient read - ArrayList parents = new ArrayList<>(reblock.getParent()); - for(int i = 0; i < parents.size(); i++) { - Hop parent = parents.get(i); - HopRewriteUtils.replaceChildReference(parent, reblock, tRead); + // update live in and out of new statement block (for piggybacking) + DataIdentifier diVar = sb.variablesRead().getVariable(cHop.getName()); + if(diVar != null) { // var read should always exist because persistent read + sbSplit.liveOut().addVariable(cHop.getName(), new DataIdentifier(diVar)); + sb.liveIn().addVariable(cHop.getName(), new DataIdentifier(diVar)); + } } - // add reblock sub dag to first statement block - DataOp tWrite = HopRewriteUtils.createTransientWrite(reblock.getName(), reblock); - sb1hops.add(tWrite); - - // update live in and out of new statement block (for piggybacking) - DataIdentifier diVar = sb.variablesRead().getVariable(reblock.getName()); - if(diVar != null) { // var read should always exist because persistent read - sb1.liveOut().addVariable(reblock.getName(), new DataIdentifier(diVar)); - sb.liveIn().addVariable(reblock.getName(), new DataIdentifier(diVar)); - } + sbSplit.setHops(sbSplitHops); + sbSplit.updateRecompilationFlag(); + ret.add(sbSplit); // statement block with permanent read and transient write + sbSplit.setSplitDag(true); // avoid later merge by other rewrites } - - sb1.setHops(sb1hops); - sb1.updateRecompilationFlag(); - ret.add(sb1); // statement block with permanent read and transient write - ret.add(sb); // statement block with transient read sb.setSplitDag(true); // avoid later merge by other rewrites LOG.debug("Applied splitDagUnknownNnzRead."); } - // keep original hop dag - else { - ret.add(sb); - } + + ret.add(sb); return ret; } @@ -115,15 +110,48 @@ public List rewriteStatementBlocks(List sbs, Pro return sbs; } - private void collectReadHopsUnknownNnz(ArrayList roots, ArrayList cand) { + private void rSplitMMChain(Hop parentHop, ListIterator> candListIter) { + if(parentHop.getInput() == null) + throw new DMLRuntimeException("rSplitMMChain should be called for MM chain hops only. " + + "An MM hop must have inputs."); + // split children again when operation is different from matrix multiply + for(Hop childHop : parentHop.getInput()) { + if(childHop.isVisited()) + continue; + if(HopRewriteUtils.isMatrixMultiply(childHop)) { + rSplitMMChain(childHop, candListIter); + } + else { + getNextLevel(candListIter).add(childHop); + rCollectNnzComputationCandidatesChildren(childHop, candListIter); + candListIter.previous(); + } + childHop.setVisited(); + } + } + + private void collectNnzComputationCandidates(ArrayList roots, ArrayList> candidateLists) { if(roots == null) return; Hop.resetVisitStatus(roots); - for(Hop root : roots) - collectReadHopsUnknownNnz(root, cand); + for(Hop root : roots) { + ListIterator> candListIter = candidateLists.listIterator(); + rCollectNnzComputationCandidates(root, candListIter); + } + } + + private ArrayList getNextLevel(ListIterator> liter) { + if(liter.hasNext()) { + return liter.next(); + } + else { + ArrayList newLevel = new ArrayList(); + liter.add(newLevel); + return newLevel; + } } - private void collectReadHopsUnknownNnz(Hop hop, ArrayList cand) { + private void rCollectNnzComputationCandidates(Hop hop, ListIterator> candListIter) { if(hop.isVisited()) return; @@ -131,17 +159,30 @@ private void collectReadHopsUnknownNnz(Hop hop, ArrayList cand) { if(hop instanceof DataOp) { DataOp dop = (DataOp) hop; if(dop.getOp() == OpOpData.PERSISTENTREAD && !dop.nnzKnown()) { - cand.add(dop); + getNextLevel(candListIter).add(dop); + candListIter.previous(); // reset level increment (no children to process) } - } - - // process children - if(hop.getInput() != null) { - for(Hop c : hop.getInput()) { - collectReadHopsUnknownNnz(c, cand); + else { + rCollectNnzComputationCandidatesChildren(hop, candListIter); } } + else if(HopRewriteUtils.isMatrixMultiply(hop) && !((AggBinaryOp) hop).hasLeftPMInput()) { + getNextLevel(candListIter).add(hop); + rSplitMMChain(hop, candListIter); + candListIter.previous(); // reset level increment after processing children + } + else{ + rCollectNnzComputationCandidatesChildren(hop, candListIter); + } hop.setVisited(); } + + private void rCollectNnzComputationCandidatesChildren(Hop parentHop, ListIterator> candListIter) { + // process children + if(parentHop.getInput() != null) { + for(Hop c : parentHop.getInput()) + rCollectNnzComputationCandidates(c, candListIter); + } + } } From 7d29c3b2b5eb164c14d8c5740cea6cefbddc5468 Mon Sep 17 00:00:00 2001 From: ywcb00 Date: Mon, 12 Oct 2026 17:23:44 +0200 Subject: [PATCH 3/5] refactor(main/hops/rewrite/RewriteSplitDagUnknownNnz.java): create separate method for processing the children of matrix multiplication hops chore(test/functions/rewrite/RewriteSplitDagUnkownNnzReadTest.java): update assert string check to the new version of the log output --- .../rewrite/RewriteSplitDagUnknownNnz.java | 48 +++++++++---------- .../RewriteSplitDagUnknownNnzReadTest.java | 4 +- 2 files changed, 25 insertions(+), 27 deletions(-) diff --git a/src/main/java/org/apache/sysds/hops/rewrite/RewriteSplitDagUnknownNnz.java b/src/main/java/org/apache/sysds/hops/rewrite/RewriteSplitDagUnknownNnz.java index 2bd27b1cd0b..a4f9e41a9e3 100644 --- a/src/main/java/org/apache/sysds/hops/rewrite/RewriteSplitDagUnknownNnz.java +++ b/src/main/java/org/apache/sysds/hops/rewrite/RewriteSplitDagUnknownNnz.java @@ -97,9 +97,8 @@ public List rewriteStatementBlock(StatementBlock sb, ProgramRewr sbSplit.setSplitDag(true); // avoid later merge by other rewrites } sb.setSplitDag(true); // avoid later merge by other rewrites - LOG.debug("Applied splitDagUnknownNnzRead."); + LOG.debug("RewriteSplitDagUnknownNnz: Split DAG into " + (ret.size() + 1) + " statement blocks."); } - ret.add(sb); return ret; @@ -110,23 +109,28 @@ public List rewriteStatementBlocks(List sbs, Pro return sbs; } - private void rSplitMMChain(Hop parentHop, ListIterator> candListIter) { + private void rSplitMMChain(Hop hop, ListIterator> candListIter) { + if(hop.isVisited()) + return; + if(HopRewriteUtils.isMatrixMultiply(hop)) { + rSplitMMChainChildren(hop, candListIter); + } + else { + // split again when operation is different from matrix multiply (i.e., before mm chain) + getNextLevel(candListIter).add(hop); + rCollectNnzComputationCandidatesChildren(hop, candListIter); + candListIter.previous(); + } + hop.setVisited(); + } + + private void rSplitMMChainChildren(Hop parentHop, ListIterator> candListIter) { if(parentHop.getInput() == null) throw new DMLRuntimeException("rSplitMMChain should be called for MM chain hops only. " + "An MM hop must have inputs."); - // split children again when operation is different from matrix multiply + // process children for(Hop childHop : parentHop.getInput()) { - if(childHop.isVisited()) - continue; - if(HopRewriteUtils.isMatrixMultiply(childHop)) { - rSplitMMChain(childHop, candListIter); - } - else { - getNextLevel(candListIter).add(childHop); - rCollectNnzComputationCandidatesChildren(childHop, candListIter); - candListIter.previous(); - } - childHop.setVisited(); + rSplitMMChain(childHop, candListIter); } } @@ -134,8 +138,8 @@ private void collectNnzComputationCandidates(ArrayList roots, ArrayList> candListIter = candidateLists.listIterator(); for(Hop root : roots) { - ListIterator> candListIter = candidateLists.listIterator(); rCollectNnzComputationCandidates(root, candListIter); } } @@ -156,19 +160,13 @@ private void rCollectNnzComputationCandidates(Hop hop, ListIterator l.getMessage().toString()).toArray(String[]::new)); - Assert.assertTrue(log_original_string.contains("Applied splitDagUnknownNnzRead.")); + Assert.assertTrue(log_original_string.contains("RewriteSplitDagUnknownNnz: Split DAG into 4 statement blocks.")); Assert.assertTrue(log_original_string.contains("mmchainoptsparse")); Assert.assertTrue(log_original_string.contains("Optimal Sparse MM Chain:")); // check reference log output String log_reference_string = String.join(DELIMITER, log_reference.stream().map(l -> l.getMessage().toString()).toArray(String[]::new)); - Assert.assertFalse(log_reference_string.contains("splitDagUnknownNnzRead")); + Assert.assertFalse(log_reference_string.contains("RewriteSplitDagUnknownNnz")); Assert.assertFalse(log_reference_string.contains("mmchainoptsparse")); } finally { From 2fee3bf5435835260684dcc4238342821499e0e8 Mon Sep 17 00:00:00 2001 From: ywcb00 Date: Mon, 12 Oct 2026 17:29:37 +0200 Subject: [PATCH 4/5] refactor(test/rewrite/RewriteSplitDagUnknownNnzTest.java): rename test --- ...nNnzReadTest.java => RewriteSplitDagUnknownNnzTest.java} | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) rename src/test/java/org/apache/sysds/test/functions/rewrite/{RewriteSplitDagUnknownNnzReadTest.java => RewriteSplitDagUnknownNnzTest.java} (97%) diff --git a/src/test/java/org/apache/sysds/test/functions/rewrite/RewriteSplitDagUnknownNnzReadTest.java b/src/test/java/org/apache/sysds/test/functions/rewrite/RewriteSplitDagUnknownNnzTest.java similarity index 97% rename from src/test/java/org/apache/sysds/test/functions/rewrite/RewriteSplitDagUnknownNnzReadTest.java rename to src/test/java/org/apache/sysds/test/functions/rewrite/RewriteSplitDagUnknownNnzTest.java index d33809fe60f..7676fd53323 100644 --- a/src/test/java/org/apache/sysds/test/functions/rewrite/RewriteSplitDagUnknownNnzReadTest.java +++ b/src/test/java/org/apache/sysds/test/functions/rewrite/RewriteSplitDagUnknownNnzTest.java @@ -51,12 +51,12 @@ @RunWith(value = Parameterized.class) @net.jcip.annotations.NotThreadSafe -public class RewriteSplitDagUnknownNnzReadTest extends AutomatedTestBase { +public class RewriteSplitDagUnknownNnzTest extends AutomatedTestBase { private static final String TEST_NAME = "RewriteSplitDagUnknownNnz"; private static final String TEST_DIR = "functions/rewrite/"; private static final String TEST_CLASS_DIR = - TEST_DIR + RewriteSplitDagUnknownNnzReadTest.class.getSimpleName() + "/"; + TEST_DIR + RewriteSplitDagUnknownNnzTest.class.getSimpleName() + "/"; private static final String PACKAGE_REWRITE = "org.apache.sysds.hops.rewrite.HopRewriteRule"; private static final String PACKAGE_RECOMPILE = "org.apache.sysds.hops.rewrite.StatementBlockRewriteRule"; private static Level _oldLevelRewrite; @@ -103,7 +103,7 @@ public void tearDown() { } @Test - public void testSplitDagUnknownNnzRead() { + public void testSplitDagUnknownNnzReadAndMMChain() { boolean oldFlag1 = OptimizerUtils.ALLOW_TRANSPOSE_MMCHAIN_REWRITES; boolean oldFlag2 = OptimizerUtils.ALLOW_SUM_PRODUCT_REWRITES; DMLConfig oldDMLConfig = ConfigurationManager.getDMLConfig(); From 4e2b6ae0449103d7a94a67e9b7a8dcdea855e483 Mon Sep 17 00:00:00 2001 From: ywcb00 Date: Tue, 13 Oct 2026 15:19:31 +0200 Subject: [PATCH 5/5] fix(main/hops/rewrite/RewriteSplitDagUnknownNnz.java): split mm chain into separate statement block only before the chain instead of before and after the chain --- .../rewrite/RewriteSplitDagUnknownNnz.java | 67 +++++++------------ .../RewriteSplitDagUnknownNnzTest.java | 2 +- 2 files changed, 27 insertions(+), 42 deletions(-) diff --git a/src/main/java/org/apache/sysds/hops/rewrite/RewriteSplitDagUnknownNnz.java b/src/main/java/org/apache/sysds/hops/rewrite/RewriteSplitDagUnknownNnz.java index a4f9e41a9e3..2b63b99a6fe 100644 --- a/src/main/java/org/apache/sysds/hops/rewrite/RewriteSplitDagUnknownNnz.java +++ b/src/main/java/org/apache/sysds/hops/rewrite/RewriteSplitDagUnknownNnz.java @@ -33,7 +33,6 @@ import org.apache.sysds.parser.DataIdentifier; import org.apache.sysds.parser.StatementBlock; import org.apache.sysds.parser.VariableSet; -import org.apache.sysds.runtime.DMLRuntimeException; /** * Rule: Split Hop DAG after reads with unknown nnz. This is important to create recompile @@ -109,38 +108,13 @@ public List rewriteStatementBlocks(List sbs, Pro return sbs; } - private void rSplitMMChain(Hop hop, ListIterator> candListIter) { - if(hop.isVisited()) - return; - if(HopRewriteUtils.isMatrixMultiply(hop)) { - rSplitMMChainChildren(hop, candListIter); - } - else { - // split again when operation is different from matrix multiply (i.e., before mm chain) - getNextLevel(candListIter).add(hop); - rCollectNnzComputationCandidatesChildren(hop, candListIter); - candListIter.previous(); - } - hop.setVisited(); - } - - private void rSplitMMChainChildren(Hop parentHop, ListIterator> candListIter) { - if(parentHop.getInput() == null) - throw new DMLRuntimeException("rSplitMMChain should be called for MM chain hops only. " + - "An MM hop must have inputs."); - // process children - for(Hop childHop : parentHop.getInput()) { - rSplitMMChain(childHop, candListIter); - } - } - private void collectNnzComputationCandidates(ArrayList roots, ArrayList> candidateLists) { if(roots == null) return; Hop.resetVisitStatus(roots); ListIterator> candListIter = candidateLists.listIterator(); for(Hop root : roots) { - rCollectNnzComputationCandidates(root, candListIter); + rCollectNnzComputationCandidates(root, candListIter, null); } } @@ -155,32 +129,43 @@ private ArrayList getNextLevel(ListIterator> liter) { } } - private void rCollectNnzComputationCandidates(Hop hop, ListIterator> candListIter) { + private void rCollectNnzComputationCandidates(Hop hop, ListIterator> candListIter, Hop parentHop) { if(hop.isVisited()) return; - // collect persistent reads with unknown nnz - if(hop instanceof DataOp && ((DataOp) hop).getOp() == OpOpData.PERSISTENTREAD && !((DataOp) hop).nnzKnown()) { - getNextLevel(candListIter).add(hop); - candListIter.previous(); // reset level increment (no children to process) - } - else if(HopRewriteUtils.isMatrixMultiply(hop) && !((AggBinaryOp) hop).hasLeftPMInput()) { - getNextLevel(candListIter).add(hop); - rSplitMMChainChildren(hop, candListIter); - candListIter.previous(); // reset level increment after processing children + if(!hop.nnzKnown()) { + if(hop instanceof DataOp && ((DataOp) hop).getOp() == OpOpData.PERSISTENTREAD) { + // collect persistent reads with unknown nnz + splitAndProcessChildren(hop, candListIter); + } + else if(parentHop != null && HopRewriteUtils.isMatrixMultiply(parentHop) && + !((AggBinaryOp) parentHop).hasLeftPMInput() && !HopRewriteUtils.isMatrixMultiply(hop)) { + // split before mm chain to ensure correct sparsity information for mm chain sparsity estimation + splitAndProcessChildren(hop, candListIter); + } + else{ + rCollectCandidatesChildren(hop, candListIter); + } } - else{ - rCollectNnzComputationCandidatesChildren(hop, candListIter); + else { + rCollectCandidatesChildren(hop, candListIter); } hop.setVisited(); } - private void rCollectNnzComputationCandidatesChildren(Hop parentHop, ListIterator> candListIter) { + private void rCollectCandidatesChildren(Hop parentHop, ListIterator> candListIter) { // process children if(parentHop.getInput() != null) { for(Hop c : parentHop.getInput()) - rCollectNnzComputationCandidates(c, candListIter); + rCollectNnzComputationCandidates(c, candListIter, parentHop); } } + + // add the hop to the candidates and proceed with its inputs + private void splitAndProcessChildren(Hop hop, ListIterator> candListIter) { + getNextLevel(candListIter).add(hop); + rCollectCandidatesChildren(hop, candListIter); + candListIter.previous(); // reset level increment after processing children + } } diff --git a/src/test/java/org/apache/sysds/test/functions/rewrite/RewriteSplitDagUnknownNnzTest.java b/src/test/java/org/apache/sysds/test/functions/rewrite/RewriteSplitDagUnknownNnzTest.java index 7676fd53323..72eaef552ea 100644 --- a/src/test/java/org/apache/sysds/test/functions/rewrite/RewriteSplitDagUnknownNnzTest.java +++ b/src/test/java/org/apache/sysds/test/functions/rewrite/RewriteSplitDagUnknownNnzTest.java @@ -163,7 +163,7 @@ public void testSplitDagUnknownNnzReadAndMMChain() { // check original log output String log_original_string = String.join(DELIMITER, log_original.stream().map(l -> l.getMessage().toString()).toArray(String[]::new)); - Assert.assertTrue(log_original_string.contains("RewriteSplitDagUnknownNnz: Split DAG into 4 statement blocks.")); + Assert.assertTrue(log_original_string.contains("RewriteSplitDagUnknownNnz: Split DAG into 3 statement blocks.")); Assert.assertTrue(log_original_string.contains("mmchainoptsparse")); Assert.assertTrue(log_original_string.contains("Optimal Sparse MM Chain:")); // check reference log output