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 <[email protected]>
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);