in src/main/java/org/apache/sysds/runtime/controlprogram/parfor/opt/OptTreeConverter.java [109:286]
public static OptNode rCreateAbstractOptNode( StatementBlock sb, ProgramBlock pb,
LocalVariableMap vars, boolean topLevel, OptTreePlanMapping hlMap, Set<String> memo )
{
OptNode node = null;
if( pb instanceof IfProgramBlock && sb instanceof IfStatementBlock )
{
IfProgramBlock ipb = (IfProgramBlock) pb;
IfStatementBlock isb = (IfStatementBlock) sb;
IfStatement is = (IfStatement) isb.getStatement(0);
node = new OptNode( NodeType.IF );
hlMap.putProgMapping(sb, pb, node);
node.setExecType(ExecType.CP);
node.setLineNumbers(isb.getBeginLine(), isb.getEndLine());
//handle predicate
isb.getPredicateHops().resetVisitStatus();
node.addChilds( rCreateAbstractOptNodes( isb.getPredicateHops(), vars, hlMap, memo ) );
//process if branch
OptNode ifn = new OptNode(NodeType.GENERIC);
hlMap.putProgMapping(sb, pb, ifn);
ifn.setExecType(ExecType.CP);
node.addChild( ifn );
int len = is.getIfBody().size();
for( int i=0; i<ipb.getChildBlocksIfBody().size() && i<len; i++ )
{
ProgramBlock lpb = ipb.getChildBlocksIfBody().get(i);
StatementBlock lsb = is.getIfBody().get(i);
ifn.addChild( rCreateAbstractOptNode(lsb, lpb, vars, false, hlMap, memo) );
}
//process else branch
if( ipb.getChildBlocksElseBody() != null ) {
OptNode efn = new OptNode(NodeType.GENERIC);
hlMap.putProgMapping(sb, pb, efn);
efn.setExecType(ExecType.CP);
node.addChild( efn );
int len2 = is.getElseBody().size();
for( int i=0; i<ipb.getChildBlocksElseBody().size() && i<len2; i++ )
{
ProgramBlock lpb = ipb.getChildBlocksElseBody().get(i);
StatementBlock lsb = is.getElseBody().get(i);
efn.addChild( rCreateAbstractOptNode(lsb, lpb, vars, false, hlMap, memo) );
}
}
}
else if( pb instanceof WhileProgramBlock && sb instanceof WhileStatementBlock )
{
WhileProgramBlock wpb = (WhileProgramBlock) pb;
WhileStatementBlock wsb = (WhileStatementBlock)sb;
WhileStatement ws = (WhileStatement) wsb.getStatement(0);
node = new OptNode( NodeType.WHILE );
hlMap.putProgMapping(sb, pb, node);
node.setExecType(ExecType.CP);
node.setLineNumbers(wsb.getBeginLine(), wsb.getEndLine());
//handle predicate
wsb.getPredicateHops().resetVisitStatus();
node.addChilds( rCreateAbstractOptNodes( wsb.getPredicateHops(), vars, hlMap, memo ) );
//process body
int len = ws.getBody().size();
for( int i=0; i<wpb.getChildBlocks().size() && i<len; i++ ) {
ProgramBlock lpb = wpb.getChildBlocks().get(i);
StatementBlock lsb = ws.getBody().get(i);
node.addChild( rCreateAbstractOptNode(lsb, lpb, vars, false, hlMap, memo) );
}
}
else if( pb instanceof ForProgramBlock && sb instanceof ForStatementBlock && !(pb instanceof ParForProgramBlock) )
{
ForProgramBlock fpb = (ForProgramBlock) pb;
ForStatementBlock fsb = (ForStatementBlock)sb;
ForStatement fs = (ForStatement) fsb.getStatement(0);
node = new OptNode( NodeType.FOR );
hlMap.putProgMapping(sb, pb, node);
node.setExecType(ExecType.CP);
node.setLineNumbers(fsb.getBeginLine(), fsb.getEndLine());
//determine number of iterations
long N = OptimizerUtils.getNumIterations(fpb, vars, CostEstimator.FACTOR_NUM_ITERATIONS);
node.addParam(ParamType.NUM_ITERATIONS, String.valueOf(N));
//handle predicate
fsb.getFromHops().resetVisitStatus();
fsb.getToHops().resetVisitStatus();
if( fsb.getIncrementHops()!=null )
fsb.getIncrementHops().resetVisitStatus();
node.addChilds( rCreateAbstractOptNodes( fsb.getFromHops(), vars, hlMap, memo ) );
node.addChilds( rCreateAbstractOptNodes( fsb.getToHops(), vars, hlMap, memo ) );
if( fsb.getIncrementHops()!=null )
node.addChilds( rCreateAbstractOptNodes( fsb.getIncrementHops(), vars, hlMap, memo ) );
//process body
int len = fs.getBody().size();
for( int i=0; i<fpb.getChildBlocks().size() && i<len; i++ ) {
ProgramBlock lpb = fpb.getChildBlocks().get(i);
StatementBlock lsb = fs.getBody().get(i);
node.addChild( rCreateAbstractOptNode(lsb, lpb, vars, false, hlMap, memo) );
}
}
else if( pb instanceof ParForProgramBlock && sb instanceof ParForStatementBlock )
{
ParForProgramBlock fpb = (ParForProgramBlock) pb;
ParForStatementBlock fsb = (ParForStatementBlock)sb;
ParForStatement fs = (ParForStatement) fsb.getStatement(0);
node = new OptNode( NodeType.PARFOR );
node.setLineNumbers(fsb.getBeginLine(), fsb.getEndLine());
hlMap.putProgMapping(sb, pb, node);
node.setK( fpb.getDegreeOfParallelism() );
long N = fpb.getNumIterations();
node.addParam(ParamType.NUM_ITERATIONS, (N!=-1) ? String.valueOf(N) :
String.valueOf(CostEstimator.FACTOR_NUM_ITERATIONS));
switch(fpb.getExecMode()) {
case LOCAL:
node.setExecType(ExecType.CP);
break;
case REMOTE_SPARK:
case REMOTE_SPARK_DP:
node.setExecType(ExecType.SPARK);
break;
case UNSPECIFIED:
node.setExecType(null);
}
if( !topLevel ) {
fsb.getFromHops().resetVisitStatus();
fsb.getToHops().resetVisitStatus();
if( fsb.getIncrementHops()!=null )
fsb.getIncrementHops().resetVisitStatus();
node.addChilds( rCreateAbstractOptNodes( fsb.getFromHops(), vars, hlMap, memo ) );
node.addChilds( rCreateAbstractOptNodes( fsb.getToHops(), vars, hlMap, memo ) );
if( fsb.getIncrementHops()!=null )
node.addChilds( rCreateAbstractOptNodes( fsb.getIncrementHops(), vars, hlMap, memo ) );
}
//process body
int len = fs.getBody().size();
for( int i=0; i<fpb.getChildBlocks().size() && i<len; i++ ) {
ProgramBlock lpb = fpb.getChildBlocks().get(i);
StatementBlock lsb = fs.getBody().get(i);
node.addChild( rCreateAbstractOptNode(lsb, lpb, vars, false, hlMap, memo) );
}
//parameters, add required parameters
Map<String,String> lparams = fpb.getParForParams();
node.addParam(ParamType.DATA_PARTITIONER, lparams.get(ParForStatementBlock.DATA_PARTITIONER));
node.addParam(ParamType.TASK_PARTITIONER, lparams.get(ParForStatementBlock.TASK_PARTITIONER));
node.addParam(ParamType.RESULT_MERGE, lparams.get(ParForStatementBlock.RESULT_MERGE));
//TODO task size
}
else if( pb instanceof BasicProgramBlock ) {
BasicProgramBlock bpb = (BasicProgramBlock) pb;
sb = pb.getStatementBlock();
//process all hops
node = new OptNode(NodeType.GENERIC);
hlMap.putProgMapping(sb, pb, node);
node.addChilds( createAbstractOptNodes(sb.getHops(), vars, hlMap, memo) );
node.setExecType(ExecType.CP);
node.setLineNumbers(sb.getBeginLine(), sb.getEndLine());
//TODO remove this workaround once this information can be obtained from hops/lops compiler
if( node.isCPOnly() ) {
boolean isSparkExec = OptimizerUtils.isSparkExecutionMode();
if( isSparkExec && containsSparkInstruction(bpb, false))
node.setExecType(ExecType.SPARK);
}
}
//final cleanup
node.checkAndCleanupLeafNodes(); //NOTE: required because this function is also used to create subtrees
return node;
}