This is an automated email from the ASF dual-hosted git repository.

mboehm7 pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/systemml.git


The following commit(s) were added to refs/heads/master by this push:
     new 498aef6  [SYSTEMDS-339] Fix robustness lineage tracing/parsing, part I
498aef6 is described below

commit 498aef6c5915c8256da44a041049cc4a59a84d41
Author: Matthias Boehm <mboe...@gmail.com>
AuthorDate: Wed May 20 23:37:12 2020 +0200

    [SYSTEMDS-339] Fix robustness lineage tracing/parsing, part I
    
    This patch adds steplm as a new parfor lineage tracing/parsing test case
    and fixes many related lineage tracing/parsing issues:
    
    1) Parfor Lineage Merge: robustness against empty first worker (no
    lineage for result variable, e.g., due to conditional control flow)
    
    2) Lineage Tracing: support for replace, rexpand
    
    3) Lineage Parsing: support for seq, ifelse, log, log_nz, groupedagg,
    rmempty, replace, rexpand
    
    4) Steplm: Improved initialization of parfor result variables to avoid
    cycles and stackoverflow errors in overwrite scenarios.
    
    5) Minor: parsing of ternary operator codes
    
    However, additional fixes are required for lineage tracing wrt default
    handling in functions, literal replacement during dynamic recompilation,
    and better overwrite support in matrix indexing (currently this creates
    lineage cycles).
---
 docs/Tasks.txt                                     |  1 +
 scripts/builtin/steplm.dml                         |  1 +
 src/main/java/org/apache/sysds/common/Types.java   |  2 +-
 .../apache/sysds/hops/rewrite/HopRewriteUtils.java |  9 ++-
 .../runtime/controlprogram/ParForProgramBlock.java |  6 +-
 .../instructions/cp/DataGenCPInstruction.java      | 12 ++++
 .../cp/ParameterizedBuiltinCPInstruction.java      | 57 +++++++++++++---
 .../sysds/runtime/lineage/LineageItemUtils.java    | 75 ++++++++++++++++++----
 .../functions/lineage/LineageTraceParforTest.java  | 19 +++++-
 .../functions/lineage/LineageTraceParfor1.dml      |  4 +-
 .../functions/lineage/LineageTraceParfor2.dml      |  4 +-
 .../functions/lineage/LineageTraceParfor3.dml      |  4 +-
 ...ageTraceParfor3.dml => LineageTraceParfor4.dml} | 13 ++--
 13 files changed, 161 insertions(+), 46 deletions(-)

diff --git a/docs/Tasks.txt b/docs/Tasks.txt
index 6d5ff80..66d0901 100644
--- a/docs/Tasks.txt
+++ b/docs/Tasks.txt
@@ -272,6 +272,7 @@ SYSTEMDS-330 Lineage Tracing, Reuse and Integration
  * 336 Better use of cache status to handle multithreading
  * 337 Adjust disk I/O speed by recording actual time taken           OK
  * 338 Extended lineage tracing (rmEmpty, lists), partial rewrites    OK
+ * 339 Lineage tracing robustness (indexed updates, algorithms)
  
 SYSTEMDS-340 Compiler Assisted Lineage Caching and Reuse
  * 341 Finalize unmarking of loop dependent operations
diff --git a/scripts/builtin/steplm.dml b/scripts/builtin/steplm.dml
index fd0018d..28208c8 100644
--- a/scripts/builtin/steplm.dml
+++ b/scripts/builtin/steplm.dml
@@ -126,6 +126,7 @@ m_steplm = function(Matrix[Double] X, Matrix[Double] y, 
Integer icpt = 0,
     while (continue) {
       # Subsequent passes over the features
       beta_out_all_2 = matrix(0, boa_ncol, m_orig * 1);
+      AICs = matrix(0, 1, m_orig); # full overwrite
       parfor (i in 1:m_orig, check = 0) {
         if (as.scalar(columns_fixed[1, i]) == 0) {
           # Construct the feature matrix
diff --git a/src/main/java/org/apache/sysds/common/Types.java 
b/src/main/java/org/apache/sysds/common/Types.java
index 11e597e..d693b7f 100644
--- a/src/main/java/org/apache/sysds/common/Types.java
+++ b/src/main/java/org/apache/sysds/common/Types.java
@@ -359,7 +359,7 @@ public class Types
                                case "cm": return OpOp3.MOMENT;
                                case "+*": return OpOp3.PLUS_MULT;
                                case "-*": return OpOp3.MINUS_MULT;
-                               default:   return OpOp3.valueOf(code);
+                               default:   return 
OpOp3.valueOf(code.toUpperCase());
                        }
                }
        }
diff --git a/src/main/java/org/apache/sysds/hops/rewrite/HopRewriteUtils.java 
b/src/main/java/org/apache/sysds/hops/rewrite/HopRewriteUtils.java
index 9d86b4d..9e73fcc 100644
--- a/src/main/java/org/apache/sysds/hops/rewrite/HopRewriteUtils.java
+++ b/src/main/java/org/apache/sysds/hops/rewrite/HopRewriteUtils.java
@@ -779,8 +779,13 @@ public class HopRewriteUtils
        }
        
        public static TernaryOp createTernaryOp(Hop mleft, Hop smid, Hop 
mright, OpOp3 op) {
-               TernaryOp ternOp = new TernaryOp("tmp", DataType.MATRIX, 
ValueType.FP64, op, mleft, smid, mright);
-               ternOp.setBlocksize(mleft.getBlocksize());
+               //NOTe: for ifelse it's sufficient to check mright as 
smid==mright
+               System.out.println(mleft.getDataType()+" "+smid.getDataType()+" 
"+mright.getDataType());
+               DataType dt = (op == OpOp3.IFELSE) ? mright.getDataType() : 
DataType.MATRIX;
+               ValueType vt = (op == OpOp3.IFELSE) ? mright.getValueType() : 
ValueType.FP64;
+               TernaryOp ternOp = new TernaryOp("tmp", dt, vt, op, mleft, 
smid, mright);
+               if( dt == DataType.MATRIX )
+                       ternOp.setBlocksize(mleft.getBlocksize());
                copyLineNumbers(mleft, ternOp);
                ternOp.refreshSizeInformation();
                return ternOp;
diff --git 
a/src/main/java/org/apache/sysds/runtime/controlprogram/ParForProgramBlock.java 
b/src/main/java/org/apache/sysds/runtime/controlprogram/ParForProgramBlock.java
index 812cf2c..2981be2 100644
--- 
a/src/main/java/org/apache/sysds/runtime/controlprogram/ParForProgramBlock.java
+++ 
b/src/main/java/org/apache/sysds/runtime/controlprogram/ParForProgramBlock.java
@@ -1351,8 +1351,10 @@ public class ParForProgramBlock extends ForProgramBlock
                        LineageItem current = lineages[0].get(var._name);
                        for( int i=1; i<lineages.length; i++ ) {
                                LineageItem next = lineages[i].get(var._name);
-                               if( next != null ) //robustness for cond. 
control flow
-                                       current = 
LineageItemUtils.replace(next, retIn, current);
+                               if( next != null ) { //robustness for cond. 
control flow
+                                       current = (current == null) ? next :
+                                               LineageItemUtils.replace(next, 
retIn, current);
+                               }
                        }
                        ec.getLineage().set(var._name, current);
                }
diff --git 
a/src/main/java/org/apache/sysds/runtime/instructions/cp/DataGenCPInstruction.java
 
b/src/main/java/org/apache/sysds/runtime/instructions/cp/DataGenCPInstruction.java
index cdea819..11f4e8e 100644
--- 
a/src/main/java/org/apache/sysds/runtime/instructions/cp/DataGenCPInstruction.java
+++ 
b/src/main/java/org/apache/sysds/runtime/instructions/cp/DataGenCPInstruction.java
@@ -170,6 +170,18 @@ public class DataGenCPInstruction extends 
UnaryCPInstruction {
        public boolean isOnesCol() {
                return minValue == maxValue && minValue == 1 && sparsity == 1 
&& getCols() == 1;
        }
+       
+       public long getFrom() {
+               return seq_from.isLiteral() ? 
Long.parseLong(seq_from.getName()) : -1;
+       }
+       
+       public long getTo() {
+               return seq_to.isLiteral() ? Long.parseLong(seq_to.getName()) : 
-1;
+       }
+       
+       public long getIncr() {
+               return seq_incr.isLiteral() ? 
Long.parseLong(seq_incr.getName()) : -1;
+       }
 
        public static DataGenCPInstruction parseInstruction(String str)
        {
diff --git 
a/src/main/java/org/apache/sysds/runtime/instructions/cp/ParameterizedBuiltinCPInstruction.java
 
b/src/main/java/org/apache/sysds/runtime/instructions/cp/ParameterizedBuiltinCPInstruction.java
index 9c92ddf..f284240 100644
--- 
a/src/main/java/org/apache/sysds/runtime/instructions/cp/ParameterizedBuiltinCPInstruction.java
+++ 
b/src/main/java/org/apache/sysds/runtime/instructions/cp/ParameterizedBuiltinCPInstruction.java
@@ -221,8 +221,8 @@ public class ParameterizedBuiltinCPInstruction extends 
ComputationCPInstruction
                }
                else if ( opcode.equalsIgnoreCase("replace") ) {
                        MatrixBlock target = 
ec.getMatrixInput(params.get("target"));
-                       double pattern = Double.parseDouble( 
params.get("pattern") );
-                       double replacement = Double.parseDouble( 
params.get("replacement") );
+                       double pattern = 
Double.parseDouble(params.get("pattern"));
+                       double replacement = 
Double.parseDouble(params.get("replacement"));
                        MatrixBlock ret = target.replaceOperations(new 
MatrixBlock(), pattern, replacement);
                        ec.setMatrixOutput(output.getName(), ret);
                        ec.releaseMatrixInput(params.get("target"));
@@ -241,7 +241,7 @@ public class ParameterizedBuiltinCPInstruction extends 
ComputationCPInstruction
                        MatrixBlock target = 
ec.getMatrixInput(params.get("target"));
                        
                        // compute the result
-                       double maxVal = Double.parseDouble( params.get("max") );
+                       double maxVal = Double.parseDouble(params.get("max"));
                        boolean dirVal = params.get("dir").equals("rows");
                        boolean cast = Boolean.parseBoolean(params.get("cast"));
                        boolean ignore = 
Boolean.parseBoolean(params.get("ignore"));
@@ -401,27 +401,64 @@ public class ParameterizedBuiltinCPInstruction extends 
ComputationCPInstruction
        public Pair<String, LineageItem> getLineageItem(ExecutionContext ec) {
                String opcode = getOpcode();
                if (opcode.equalsIgnoreCase("groupedagg")) {
-                       CPOperand target = new 
CPOperand(params.get(Statement.GAGG_TARGET), ValueType.FP64, DataType.MATRIX);
+                       CPOperand target = getTargetOperand();
                        CPOperand groups = new 
CPOperand(params.get(Statement.GAGG_GROUPS), ValueType.FP64, DataType.MATRIX);
                        String wt = params.containsKey(Statement.GAGG_WEIGHTS) 
? params.get(Statement.GAGG_WEIGHTS) : String.valueOf(-1);
                        CPOperand weights = new CPOperand(wt, ValueType.FP64, 
DataType.MATRIX);
-                       CPOperand fn = new 
CPOperand(params.get(Statement.GAGG_FN), ValueType.STRING, DataType.SCALAR, 
true);
+                       CPOperand fn = getStringLiteral(Statement.GAGG_FN);
                        String ng = 
params.containsKey(Statement.GAGG_NUM_GROUPS) ? 
params.get(Statement.GAGG_NUM_GROUPS) : String.valueOf(-1);
                        CPOperand ngroups = new CPOperand(ng , ValueType.INT64, 
DataType.SCALAR, true);
                        return Pair.of(output.getName(), new 
LineageItem(getOpcode(),
                                LineageItemUtils.getLineage(ec, target, groups, 
weights, fn, ngroups)));
                }
                else if (opcode.equalsIgnoreCase("rmempty")) {
-                       CPOperand target = new CPOperand(params.get("target"), 
ValueType.FP64, DataType.MATRIX);
-                       CPOperand margin = new CPOperand(params.get("margin"), 
ValueType.STRING, DataType.SCALAR, true);
+                       CPOperand target = getTargetOperand();
+                       CPOperand margin = getStringLiteral("margin");
                        String sl = params.containsKey("select") ? 
params.get("select") : String.valueOf(-1);
                        CPOperand select = new CPOperand(sl, ValueType.FP64, 
DataType.MATRIX); 
                        return Pair.of(output.getName(), new 
LineageItem(getOpcode(),
                                LineageItemUtils.getLineage(ec, target, margin, 
select)));
                }
-               //TODO: generic interface to support all the ops
-               else
+               else if(opcode.equalsIgnoreCase("replace")) {
+                       CPOperand target = getTargetOperand();
+                       CPOperand pattern = getFP64Literal("pattern");
+                       CPOperand replace = getFP64Literal("replacement");
                        return Pair.of(output.getName(), new 
LineageItem(getOpcode(),
-                               LineageItemUtils.getLineage(ec, 
input1,input2,input3)));
+                               LineageItemUtils.getLineage(ec, target, 
pattern, replace)));
+               }
+               else if(opcode.equalsIgnoreCase("rexpand")) {
+                       CPOperand target = getTargetOperand();
+                       CPOperand max = getFP64Literal("max");
+                       CPOperand dir = getStringLiteral("dir");
+                       CPOperand cast = getBoolLiteral("cast");
+                       CPOperand ignore = getBoolLiteral("ignore");
+                       return Pair.of(output.getName(), new 
LineageItem(getOpcode(),
+                               LineageItemUtils.getLineage(ec, target, max, 
dir, cast, ignore)));
+               }
+               else {
+                       //NOTE: for now, we cannot have a generic fall through 
path, because the 
+                       //data and value types of parmeters are not compiled 
into the instruction
+                       throw new DMLRuntimeException("Unsupported lineage 
tracing for: "+opcode);
+               }
+       }
+       
+       private CPOperand getTargetOperand() {
+               return new CPOperand(params.get("target"), ValueType.FP64, 
DataType.MATRIX);
+       }
+       
+       private CPOperand getFP64Literal(String name) {
+               return getLiteral(name, ValueType.FP64);
+       }
+       
+       private CPOperand getStringLiteral(String name) {
+               return getLiteral(name, ValueType.STRING);
+       }
+       
+       private CPOperand getBoolLiteral(String name) {
+               return getLiteral(name, ValueType.BOOLEAN);
+       }
+       
+       private CPOperand getLiteral(String name, ValueType vt) {
+               return new CPOperand(params.get(name), vt, DataType.SCALAR, 
true);
        }
 }
diff --git 
a/src/main/java/org/apache/sysds/runtime/lineage/LineageItemUtils.java 
b/src/main/java/org/apache/sysds/runtime/lineage/LineageItemUtils.java
index 1c787a2..39a8c2a 100644
--- a/src/main/java/org/apache/sysds/runtime/lineage/LineageItemUtils.java
+++ b/src/main/java/org/apache/sysds/runtime/lineage/LineageItemUtils.java
@@ -34,6 +34,7 @@ import org.apache.sysds.common.Types.Direction;
 import org.apache.sysds.common.Types.OpOpDG;
 import org.apache.sysds.common.Types.OpOpData;
 import org.apache.sysds.common.Types.OpOpN;
+import org.apache.sysds.common.Types.ParamBuiltinOp;
 import org.apache.sysds.common.Types.ReOrgOp;
 import org.apache.sysds.common.Types.ValueType;
 import org.apache.sysds.conf.ConfigurationManager;
@@ -56,6 +57,7 @@ import org.apache.sysds.lops.UnaryCP;
 import org.apache.sysds.lops.compile.Dag;
 import org.apache.sysds.parser.DataExpression;
 import org.apache.sysds.parser.DataIdentifier;
+import org.apache.sysds.parser.Statement;
 import org.apache.sysds.runtime.DMLRuntimeException;
 import org.apache.sysds.runtime.controlprogram.BasicProgramBlock;
 import org.apache.sysds.runtime.controlprogram.Program;
@@ -79,6 +81,7 @@ import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.HashMap;
 import java.util.HashSet;
+import java.util.LinkedHashMap;
 import java.util.Map;
 import java.util.stream.Collectors;
 
@@ -197,19 +200,27 @@ public class LineageItemUtils {
                                if (inst instanceof DataGenCPInstruction) {
                                        DataGenCPInstruction rand = 
(DataGenCPInstruction) inst;
                                        HashMap<String, Hop> params = new 
HashMap<>();
-                                       if( rand.output.getDataType() == 
DataType.TENSOR)
-                                               
params.put(DataExpression.RAND_DIMS, new LiteralOp(rand.getDims()));
-                                       else {
-                                               
params.put(DataExpression.RAND_ROWS, new LiteralOp(rand.getRows()));
-                                               
params.put(DataExpression.RAND_COLS, new LiteralOp(rand.getCols()));
+                                       if( rand.getOpcode().equals("rand") ) {
+                                               if( rand.output.getDataType() 
== DataType.TENSOR)
+                                                       
params.put(DataExpression.RAND_DIMS, new LiteralOp(rand.getDims()));
+                                               else {
+                                                       
params.put(DataExpression.RAND_ROWS, new LiteralOp(rand.getRows()));
+                                                       
params.put(DataExpression.RAND_COLS, new LiteralOp(rand.getCols()));
+                                               }
+                                               
params.put(DataExpression.RAND_MIN, new LiteralOp(rand.getMinValue()));
+                                               
params.put(DataExpression.RAND_MAX, new LiteralOp(rand.getMaxValue()));
+                                               
params.put(DataExpression.RAND_PDF, new LiteralOp(rand.getPdf()));
+                                               
params.put(DataExpression.RAND_LAMBDA, new LiteralOp(rand.getPdfParams()));
+                                               
params.put(DataExpression.RAND_SPARSITY, new LiteralOp(rand.getSparsity()));
+                                               
params.put(DataExpression.RAND_SEED, new LiteralOp(rand.getSeed()));
                                        }
-                                       params.put(DataExpression.RAND_MIN, new 
LiteralOp(rand.getMinValue()));
-                                       params.put(DataExpression.RAND_MAX, new 
LiteralOp(rand.getMaxValue()));
-                                       params.put(DataExpression.RAND_PDF, new 
LiteralOp(rand.getPdf()));
-                                       params.put(DataExpression.RAND_LAMBDA, 
new LiteralOp(rand.getPdfParams()));
-                                       
params.put(DataExpression.RAND_SPARSITY, new LiteralOp(rand.getSparsity()));
-                                       params.put(DataExpression.RAND_SEED, 
new LiteralOp(rand.getSeed()));
-                                       Hop datagen = new 
DataGenOp(OpOpDG.RAND, new DataIdentifier("tmp"), params);
+                                       else if( rand.getOpcode().equals("seq") 
) {
+                                               params.put(Statement.SEQ_FROM, 
new LiteralOp(rand.getFrom()));
+                                               params.put(Statement.SEQ_TO, 
new LiteralOp(rand.getTo()));
+                                               params.put(Statement.SEQ_INCR, 
new LiteralOp(rand.getIncr()));
+                                       }
+                                       Hop datagen = new 
DataGenOp(OpOpDG.valueOf(rand.getOpcode().toUpperCase()),
+                                               new DataIdentifier("tmp"), 
params);
                                        
datagen.setBlocksize(rand.getBlocksize());
                                        operands.put(item.getId(), datagen);
                                } else if (inst instanceof VariableCPInstruction
@@ -260,7 +271,8 @@ public class LineageItemUtils {
                                                        
operands.put(item.getId(), aggunary);
                                                        break;
                                                }
-                                               case Unary: {
+                                               case Unary:
+                                               case Builtin: {
                                                        Hop input = 
operands.get(item.getInputs()[0].getId());
                                                        Hop unary = 
HopRewriteUtils.createUnary(input, item.getOpcode());
                                                        
operands.put(item.getId(), unary);
@@ -303,6 +315,10 @@ public class LineageItemUtils {
                                                                
OpOpN.valueOf(opcode.toUpperCase()), createNaryInputs(item, operands)));
                                                        break;
                                                }
+                                               case ParameterizedBuiltin: {
+                                                       
operands.put(item.getId(), constructParameterizedBuiltinOp(item, operands));
+                                                       break;
+                                               }
                                                case MatrixIndexing: {
                                                        
operands.put(item.getId(), constructIndexingOp(item, operands));
                                                        break;
@@ -486,6 +502,39 @@ public class LineageItemUtils {
                throw new DMLRuntimeException("Unsupported opcode: 
"+item.getOpcode());
        }
        
+       private static Hop constructParameterizedBuiltinOp(LineageItem item, 
Map<Long, Hop> operands) {
+               String opcode = item.getOpcode();
+               Hop target = operands.get(item.getInputs()[0].getId());
+               LinkedHashMap<String,Hop> args = new LinkedHashMap<>();
+               if( opcode.equals("groupedagg") ) {
+                       args.put("target", target);
+                       args.put(Statement.GAGG_GROUPS, 
operands.get(item.getInputs()[1].getId()));
+                       args.put(Statement.GAGG_WEIGHTS, 
operands.get(item.getInputs()[2].getId()));
+                       args.put(Statement.GAGG_FN, 
operands.get(item.getInputs()[3].getId()));
+                       args.put(Statement.GAGG_NUM_GROUPS, 
operands.get(item.getInputs()[4].getId()));
+               }
+               else if (opcode.equalsIgnoreCase("rmempty")) {
+                       args.put("target", target);
+                       args.put("margin", 
operands.get(item.getInputs()[1].getId()));
+                       args.put("select", 
operands.get(item.getInputs()[2].getId()));
+               }
+               else if(opcode.equalsIgnoreCase("replace")) {
+                       args.put("target", target);
+                       args.put("pattern", 
operands.get(item.getInputs()[1].getId()));
+                       args.put("replacement", 
operands.get(item.getInputs()[2].getId()));
+               }
+               else if(opcode.equalsIgnoreCase("rexpand")) {
+                       args.put("target", target);
+                       args.put("max", 
operands.get(item.getInputs()[1].getId()));
+                       args.put("dir", 
operands.get(item.getInputs()[2].getId()));
+                       args.put("cast", 
operands.get(item.getInputs()[3].getId()));
+                       args.put("ignore", 
operands.get(item.getInputs()[4].getId()));
+               }
+               
+               return HopRewriteUtils.createParameterizedBuiltinOp(
+                       target, args, 
ParamBuiltinOp.valueOf(opcode.toUpperCase()));
+       }
+       
        public static LineageItem rDecompress(LineageItem item) {
                if (item.getType() == LineageItemType.Dedup) {
                        LineageItem dedupInput = 
rDecompress(item.getInputs()[0]);
diff --git 
a/src/test/java/org/apache/sysds/test/functions/lineage/LineageTraceParforTest.java
 
b/src/test/java/org/apache/sysds/test/functions/lineage/LineageTraceParforTest.java
index af4239f..50443c1 100644
--- 
a/src/test/java/org/apache/sysds/test/functions/lineage/LineageTraceParforTest.java
+++ 
b/src/test/java/org/apache/sysds/test/functions/lineage/LineageTraceParforTest.java
@@ -44,6 +44,7 @@ public class LineageTraceParforTest extends AutomatedTestBase 
{
        protected static final String TEST_NAME1 = "LineageTraceParfor1"; 
//rand - matrix result - local parfor
        protected static final String TEST_NAME2 = "LineageTraceParfor2"; 
//rand - matrix result - remote spark parfor
        protected static final String TEST_NAME3 = "LineageTraceParfor3"; 
//rand - matrix result - remote spark parfor
+       protected static final String TEST_NAME4 = "LineageTraceParfor4"; 
//rand - steplm (stackoverflow error)
        
        protected String TEST_CLASS_DIR = TEST_DIR + 
LineageTraceParforTest.class.getSimpleName() + "/";
        
@@ -59,6 +60,7 @@ public class LineageTraceParforTest extends AutomatedTestBase 
{
                addTestConfiguration( TEST_NAME1, new 
TestConfiguration(TEST_CLASS_DIR, TEST_NAME1, new String[] {"R"}) );
                addTestConfiguration( TEST_NAME2, new 
TestConfiguration(TEST_CLASS_DIR, TEST_NAME2, new String[] {"R"}) );
                addTestConfiguration( TEST_NAME3, new 
TestConfiguration(TEST_CLASS_DIR, TEST_NAME3, new String[] {"R"}) );
+               addTestConfiguration( TEST_NAME4, new 
TestConfiguration(TEST_CLASS_DIR, TEST_NAME4, new String[] {"R"}) );
        }
        
        @Test
@@ -98,7 +100,7 @@ public class LineageTraceParforTest extends 
AutomatedTestBase {
        
        @Test
        public void testLineageTraceParFor2_32() {
-               testLineageTraceParFor(8, TEST_NAME2);
+               testLineageTraceParFor(32, TEST_NAME2);
        }
        
        @Test
@@ -108,9 +110,20 @@ public class LineageTraceParforTest extends 
AutomatedTestBase {
        
        @Test
        public void testLineageTraceParFor3_32() {
-               testLineageTraceParFor(8, TEST_NAME3);
+               testLineageTraceParFor(32, TEST_NAME3);
        }
        
+// TODO additional fixes needed for steplm
+//     @Test
+//     public void testLineageTraceParFor4_8() {
+//             testLineageTraceParFor(8, TEST_NAME4);
+//     }
+//     
+//     @Test
+//     public void testLineageTraceParFor4_32() {
+//             testLineageTraceParFor(32, TEST_NAME4);
+//     }
+       
        private void testLineageTraceParFor(int ncol, String testname) {
                try {
                        System.out.println("------------ BEGIN " + testname + 
"------------");
@@ -121,7 +134,6 @@ public class LineageTraceParforTest extends 
AutomatedTestBase {
                        proArgs.add("-explain");
                        proArgs.add("-lineage");
                        proArgs.add("-args");
-                       proArgs.add(input("X"));
                        proArgs.add(output("R"));
                        proArgs.add(String.valueOf(numRecords));
                        proArgs.add(String.valueOf(ncol));
@@ -134,6 +146,7 @@ public class LineageTraceParforTest extends 
AutomatedTestBase {
                        
                        //get lineage and generate program
                        String Rtrace = readDMLLineageFromHDFS("R");
+                       System.out.println(Rtrace);
                        LineageItem R = LineageParser.parseLineageTrace(Rtrace);
                        Data ret = LineageItemUtils.computeByLineage(R);
 
diff --git a/src/test/scripts/functions/lineage/LineageTraceParfor1.dml 
b/src/test/scripts/functions/lineage/LineageTraceParfor1.dml
index e6f48bb..dc82d38 100644
--- a/src/test/scripts/functions/lineage/LineageTraceParfor1.dml
+++ b/src/test/scripts/functions/lineage/LineageTraceParfor1.dml
@@ -19,7 +19,7 @@
 #
 #-------------------------------------------------------------
 
-X = rand(rows=$3, cols=$4, seed=7);
+X = rand(rows=$2, cols=$3, seed=7);
 
 R = matrix(0, nrow(X), ncol(X));
 parfor(i in 1:ncol(X)) {
@@ -29,4 +29,4 @@ parfor(i in 1:ncol(X)) {
 }
 
 print(lineage(R));
-write(R, $2);
+write(R, $1);
diff --git a/src/test/scripts/functions/lineage/LineageTraceParfor2.dml 
b/src/test/scripts/functions/lineage/LineageTraceParfor2.dml
index de04f8a..a1fd11f 100644
--- a/src/test/scripts/functions/lineage/LineageTraceParfor2.dml
+++ b/src/test/scripts/functions/lineage/LineageTraceParfor2.dml
@@ -19,7 +19,7 @@
 #
 #-------------------------------------------------------------
 
-X = rand(rows=$3, cols=$4, seed=7);
+X = rand(rows=$2, cols=$3, seed=7);
 
 R = matrix(0, nrow(X), ncol(X));
 parfor(i in 1:ncol(X), check=0, opt=None, mode=REMOTE_SPARK) {
@@ -29,4 +29,4 @@ parfor(i in 1:ncol(X), check=0, opt=None, mode=REMOTE_SPARK) {
 }
 
 print(lineage(R));
-write(R, $2);
+write(R, $1);
diff --git a/src/test/scripts/functions/lineage/LineageTraceParfor3.dml 
b/src/test/scripts/functions/lineage/LineageTraceParfor3.dml
index b6e450f..7b8ad18 100644
--- a/src/test/scripts/functions/lineage/LineageTraceParfor3.dml
+++ b/src/test/scripts/functions/lineage/LineageTraceParfor3.dml
@@ -19,7 +19,7 @@
 #
 #-------------------------------------------------------------
 
-X = rand(rows=$3, cols=$4, seed=7);
+X = rand(rows=$2, cols=$3, seed=7);
 
 R = matrix(0, 1, ncol(X));
 parfor(i in 1:ncol(X), check=0, opt=None, mode=REMOTE_SPARK) {
@@ -28,4 +28,4 @@ parfor(i in 1:ncol(X), check=0, opt=None, mode=REMOTE_SPARK) {
 }
 
 print(lineage(R));
-write(R, $2);
+write(R, $1);
diff --git a/src/test/scripts/functions/lineage/LineageTraceParfor3.dml 
b/src/test/scripts/functions/lineage/LineageTraceParfor4.dml
similarity index 81%
copy from src/test/scripts/functions/lineage/LineageTraceParfor3.dml
copy to src/test/scripts/functions/lineage/LineageTraceParfor4.dml
index b6e450f..576182b 100644
--- a/src/test/scripts/functions/lineage/LineageTraceParfor3.dml
+++ b/src/test/scripts/functions/lineage/LineageTraceParfor4.dml
@@ -19,13 +19,8 @@
 #
 #-------------------------------------------------------------
 
-X = rand(rows=$3, cols=$4, seed=7);
+X = rand(rows=$2, cols=$3, seed=7);
+Y = rand(rows=nrow(X), cols=1, seed=2)
+X = steplm(X=X, y=Y)
 
-R = matrix(0, 1, ncol(X));
-parfor(i in 1:ncol(X), check=0, opt=None, mode=REMOTE_SPARK) {
-  Xi = matrix(i, rows=2, cols=4)
-  R[1, i] = sum(Xi)
-}
-
-print(lineage(R));
-write(R, $2);
+write(X, $1);

Reply via email to