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 2016/01/13 23:38:06 UTC

[2/2] incubator-systemml git commit: [SYSTEMML-330] Improved jmlc/mlcontext argument/meta data handling

[SYSTEMML-330] Improved jmlc/mlcontext argument/meta data handling

This change introduces two new global parser configurations, which are
exploited by the jmlc/mlcontext apis. First,
AParserWrapper.IGNORE_UNSPECIFIED_ARGS is a global switch to ignore
unspecified script arguments by turning errors into warnings and
assigning default strings to these arguments. This enables to use
existing scripts without change through these apis. Second,
DataExpression.IGNORE_READ_WRITE_METADATA allows the jmlc api to
globally disable meta data reads which resolves a couple of corner cases
with existing meta data, etc.

Furthermore, this change leaves necessary parser refactoring and
consolidation tasks untouched. These issues will be resolved in separate
patches.  


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

Branch: refs/heads/master
Commit: f8e25bb76028e3f0526290a2e402b3bd7c0fb9df
Parents: 7e0b41e
Author: Matthias Boehm <mb...@us.ibm.com>
Authored: Wed Jan 13 10:01:15 2016 -0800
Committer: Matthias Boehm <mb...@us.ibm.com>
Committed: Wed Jan 13 10:01:15 2016 -0800

----------------------------------------------------------------------
 .../java/org/apache/sysml/api/MLContext.java    | 23 +++++------
 .../org/apache/sysml/api/jmlc/Connection.java   | 15 +++++++-
 .../org/apache/sysml/parser/AParserWrapper.java |  4 ++
 .../org/apache/sysml/parser/DataExpression.java | 40 +++++++++++---------
 .../parser/antlr4/DmlSyntacticValidator.java    | 40 +++++++++++++-------
 .../antlr4/DmlSyntacticValidatorHelper.java     |  4 ++
 .../parser/python/PydmlSyntacticValidator.java  | 38 +++++++++++++------
 .../python/PydmlSyntacticValidatorHelper.java   |  5 ++-
 .../functions/jmlc/reuse-glm-predict.dml        |  8 ++--
 .../functions/jmlc/reuse-msvm-predict.dml       |  4 +-
 10 files changed, 119 insertions(+), 62 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-systemml/blob/f8e25bb7/src/main/java/org/apache/sysml/api/MLContext.java
----------------------------------------------------------------------
diff --git a/src/main/java/org/apache/sysml/api/MLContext.java b/src/main/java/org/apache/sysml/api/MLContext.java
index 6700f13..b89121e 100644
--- a/src/main/java/org/apache/sysml/api/MLContext.java
+++ b/src/main/java/org/apache/sysml/api/MLContext.java
@@ -1177,11 +1177,15 @@ public class MLContext {
 				throw new DMLRuntimeException("SystemML (and hence by definition MLContext) doesnot support parallel execute() calls from same or different MLContexts. "
 						+ "As a temporary fix, please do explicit synchronization, i.e. synchronized(MLContext.class) { ml.execute(...) } ");
 			}
-			else {
-				// Set active MLContext.
-				_activeMLContext = this;
-			}
 			
+			// Set active MLContext.
+			_activeMLContext = this;
+			
+			// Setup parser parameters
+			// TODO In the process of hardening mlcontext, we should also reinvestigate if we
+			// could be more restrictive and require known dimensions (rm REJECT_READ_WRITE_UNKNOWNS).  
+			AParserWrapper.IGNORE_UNSPECIFIED_ARGS = true;
+			DataExpression.REJECT_READ_WRITE_UNKNOWNS = false;
 			
 			if(_monitorUtils != null) {
 				_monitorUtils.resetMonitoringData();
@@ -1242,6 +1246,10 @@ public class MLContext {
 		finally {
 			// Reset active MLContext.
 			_activeMLContext = null;
+			
+			// Reset parser parameters
+			AParserWrapper.IGNORE_UNSPECIFIED_ARGS = false;
+			DataExpression.REJECT_READ_WRITE_UNKNOWNS = true;			
 		}
 	}
 	
@@ -1288,17 +1296,12 @@ public class MLContext {
 			_monitorUtils.setDMLString(dmlScriptStr);
 		}
 		
-		DataExpression.REJECT_READ_UNKNOWN_SIZE = false;
-		
 		//simplified compilation chain
 		_rtprog = null;
 		
 		//parsing
 		AParserWrapper parser = AParserWrapper.createParser(parsePyDML);
 		DMLProgram prog = parser.parse(dmlScriptFilePath, dmlScriptStr, argVals);
-		if(prog == null) {
-			throw new ParseException("Couldnot parse the file:" + dmlScriptFilePath);
-		}
 		
 		//language validate
 		DMLTranslator dmlt = new DMLTranslator(prog);
@@ -1345,8 +1348,6 @@ public class MLContext {
 			ec.setVariables(inputSymbolTable);
 		}
 		
-		// System.out.println(Explain.explain(_rtprog));
-		
 		//core execute runtime program	
 		_rtprog.execute( ec );
 		

http://git-wip-us.apache.org/repos/asf/incubator-systemml/blob/f8e25bb7/src/main/java/org/apache/sysml/api/jmlc/Connection.java
----------------------------------------------------------------------
diff --git a/src/main/java/org/apache/sysml/api/jmlc/Connection.java b/src/main/java/org/apache/sysml/api/jmlc/Connection.java
index 636a855..dd61235 100644
--- a/src/main/java/org/apache/sysml/api/jmlc/Connection.java
+++ b/src/main/java/org/apache/sysml/api/jmlc/Connection.java
@@ -70,7 +70,11 @@ public class Connection
 	public Connection()
 	{
 		//setup basic parameters for embedded execution
-		DataExpression.REJECT_READ_UNKNOWN_SIZE = false;
+		//parser parameters
+		AParserWrapper.IGNORE_UNSPECIFIED_ARGS = true;
+		DataExpression.IGNORE_READ_WRITE_METADATA = true;
+		DataExpression.REJECT_READ_WRITE_UNKNOWNS = false;
+		//runtime parameters
 		DMLScript.rtplatform = RUNTIME_PLATFORM.SINGLE_NODE;
 		OptimizerUtils.PARALLEL_CP_READ_TEXTFORMATS = false;
 		OptimizerUtils.PARALLEL_CP_WRITE_TEXTFORMATS = false;
@@ -156,7 +160,14 @@ public class Connection
 	 */
 	public void close()
 	{
-		
+		//reset parameters for embedded execution
+		AParserWrapper.IGNORE_UNSPECIFIED_ARGS = false;
+		DataExpression.IGNORE_READ_WRITE_METADATA = false;
+		DataExpression.REJECT_READ_WRITE_UNKNOWNS = true;
+		OptimizerUtils.PARALLEL_CP_READ_TEXTFORMATS = true;
+		OptimizerUtils.PARALLEL_CP_WRITE_TEXTFORMATS = true;
+		OptimizerUtils.PARALLEL_CP_READ_BINARYFORMATS = true;
+		OptimizerUtils.PARALLEL_CP_WRITE_BINARYFORMATS = true;		
 	}
 	
 	/**

http://git-wip-us.apache.org/repos/asf/incubator-systemml/blob/f8e25bb7/src/main/java/org/apache/sysml/parser/AParserWrapper.java
----------------------------------------------------------------------
diff --git a/src/main/java/org/apache/sysml/parser/AParserWrapper.java b/src/main/java/org/apache/sysml/parser/AParserWrapper.java
index d3ded1f..fd600f2 100644
--- a/src/main/java/org/apache/sysml/parser/AParserWrapper.java
+++ b/src/main/java/org/apache/sysml/parser/AParserWrapper.java
@@ -30,6 +30,10 @@ import org.apache.sysml.parser.python.PyDMLParserWrapper;
  */
 public abstract class AParserWrapper 
 {
+	//global parser configuration dml/pydml:
+	//1) skip errors on unspecified args (modified by mlcontext / jmlc)
+	public static boolean IGNORE_UNSPECIFIED_ARGS = false; 
+	
 	/**
 	 * 
 	 * @param fileName

http://git-wip-us.apache.org/repos/asf/incubator-systemml/blob/f8e25bb7/src/main/java/org/apache/sysml/parser/DataExpression.java
----------------------------------------------------------------------
diff --git a/src/main/java/org/apache/sysml/parser/DataExpression.java b/src/main/java/org/apache/sysml/parser/DataExpression.java
index 5bd92ea..04e964b 100644
--- a/src/main/java/org/apache/sysml/parser/DataExpression.java
+++ b/src/main/java/org/apache/sysml/parser/DataExpression.java
@@ -43,8 +43,10 @@ import org.apache.sysml.utils.JSONHelper;
 
 public class DataExpression extends DataIdentifier 
 {
-
-	public static boolean REJECT_READ_UNKNOWN_SIZE = true;
+	//internal configuration (modified by mlcontext, jmlc apis) 
+	//no read of meta data on mlcontext (local) /jmlc (global); ignore unknowns on jmlc
+	public static boolean IGNORE_READ_WRITE_METADATA = false; // global skip meta data reads
+	public static boolean REJECT_READ_WRITE_UNKNOWNS = true;  // ignore missing meta data
 	
 	public static final String RAND_ROWS 	=  "rows";	 
 	public static final String RAND_COLS 	=  "cols";
@@ -120,15 +122,16 @@ public class DataExpression extends DataIdentifier
 	private DataOp _opcode;
 	private HashMap<String, Expression> _varParams;
 	private boolean _strInit = false; //string initialize
-	
-	private boolean checkMetadata = true;
-	public void setCheckMetadata(boolean checkMetadata) {
-		this.checkMetadata = checkMetadata;
-	}
+	private boolean _checkMetadata = true; // local skip meta data reads
 
 	public DataExpression(){
 		//do nothing
 	}
+
+	
+	public void setCheckMetadata(boolean checkMetadata) {
+		_checkMetadata = checkMetadata;
+	}
 	
 	public static DataExpression getDataExpression(String functionName, ArrayList<ParameterExpression> passedParamExprs, 
 				String filename, int blp, int bcp, int elp, int ecp) throws DMLParseException {
@@ -469,8 +472,6 @@ public class DataExpression extends DataIdentifier
 		return _varParams.get(name);
 	}
 
-	
-	
 	public void addVarParam(String name, Expression value){
 		_varParams.put(name, value);
 		
@@ -622,10 +623,10 @@ public class DataExpression extends DataIdentifier
 			String mtdFileName = getMTDFileName(inputFileName);
 
 			// track whether should attempt to read MTD file or not
-			boolean shouldReadMTD = checkMetadata;
+			boolean shouldReadMTD = _checkMetadata && !IGNORE_READ_WRITE_METADATA;
 
 			// Check for file existence (before metadata parsing for meaningful error messages)
-			if( shouldReadMTD && REJECT_READ_UNKNOWN_SIZE //skip check for jmlc/mlcontext apis
+			if( shouldReadMTD //skip check for jmlc/mlcontext
 				&& !MapReduceTool.existsFileOnHDFS(inputFileName)) 
 			{
 				String fsext = InfrastructureAnalyzer.isLocalMode() ? "FS (local mode)" : "HDFS";
@@ -892,19 +893,22 @@ public class DataExpression extends DataIdentifier
 				// initialize size of target data identifier to UNKNOWN
 				getOutput().setDimensions(-1, -1);
 				
-				if ( !isCSV && (getVarParam(READROWPARAM) == null || getVarParam(READCOLPARAM) == null)){
-					raiseValidateError("Missing or incomplete dimension information in read statement: " + mtdFileName, conditional, LanguageErrorCodes.INVALID_PARAMETERS);				
+				if ( !isCSV && REJECT_READ_WRITE_UNKNOWNS //skip check for csv format / jmlc api
+					&& (getVarParam(READROWPARAM) == null || getVarParam(READCOLPARAM) == null) ) {
+						raiseValidateError("Missing or incomplete dimension information in read statement: " 
+								+ mtdFileName, conditional, LanguageErrorCodes.INVALID_PARAMETERS);				
 				}
-				if (getVarParam(READROWPARAM) instanceof ConstIdentifier && getVarParam(READCOLPARAM) instanceof ConstIdentifier)  {
 				
+				if (getVarParam(READROWPARAM) instanceof ConstIdentifier 
+					&& getVarParam(READCOLPARAM) instanceof ConstIdentifier)  
+				{
 					// these are strings that are long values
 					Long dim1 = (getVarParam(READROWPARAM) == null) ? null : Long.valueOf( getVarParam(READROWPARAM).toString());
-					Long dim2 = (getVarParam(READCOLPARAM) == null) ? null : Long.valueOf( getVarParam(READCOLPARAM).toString());
-					
-					if ( !isCSV && (dim1 <= 0 || dim2 <= 0) && REJECT_READ_UNKNOWN_SIZE )
-					{
+					Long dim2 = (getVarParam(READCOLPARAM) == null) ? null : Long.valueOf( getVarParam(READCOLPARAM).toString());					
+					if ( !isCSV && (dim1 <= 0 || dim2 <= 0) && REJECT_READ_WRITE_UNKNOWNS ) {
 						raiseValidateError("Invalid dimension information in read statement", conditional, LanguageErrorCodes.INVALID_PARAMETERS);
 					}
+					
 					// set dim1 and dim2 values 
 					if (dim1 != null && dim2 != null){
 						getOutput().setDimensions(dim1, dim2);

http://git-wip-us.apache.org/repos/asf/incubator-systemml/blob/f8e25bb7/src/main/java/org/apache/sysml/parser/antlr4/DmlSyntacticValidator.java
----------------------------------------------------------------------
diff --git a/src/main/java/org/apache/sysml/parser/antlr4/DmlSyntacticValidator.java b/src/main/java/org/apache/sysml/parser/antlr4/DmlSyntacticValidator.java
index 27c62c2..8af3de9 100644
--- a/src/main/java/org/apache/sysml/parser/antlr4/DmlSyntacticValidator.java
+++ b/src/main/java/org/apache/sysml/parser/antlr4/DmlSyntacticValidator.java
@@ -29,7 +29,6 @@ import org.antlr.v4.runtime.ParserRuleContext;
 import org.antlr.v4.runtime.Token;
 import org.antlr.v4.runtime.tree.ErrorNode;
 import org.antlr.v4.runtime.tree.TerminalNode;
-
 import org.apache.sysml.parser.ConditionalPredicate;
 import org.apache.sysml.parser.DMLProgram;
 import org.apache.sysml.parser.DataIdentifier;
@@ -86,6 +85,7 @@ import org.apache.sysml.parser.antlr4.DmlParser.TypedArgNoAssignContext;
 import org.apache.sysml.parser.antlr4.DmlParser.UnaryExpressionContext;
 import org.apache.sysml.parser.antlr4.DmlParser.ValueTypeContext;
 import org.apache.sysml.parser.antlr4.DmlParser.WhileStatementContext;
+import org.apache.sysml.parser.AParserWrapper;
 import org.apache.sysml.parser.AssignmentStatement;
 import org.apache.sysml.parser.BinaryExpression;
 import org.apache.sysml.parser.BooleanExpression;
@@ -117,6 +117,10 @@ import org.apache.sysml.parser.StatementBlock;
 import org.apache.sysml.parser.StringIdentifier;
 import org.apache.sysml.parser.WhileStatement;
 
+/**
+ * TODO: Refactor duplicated parser code dml/pydml (entire package).
+ *
+ */
 public class DmlSyntacticValidator implements DmlListener
 {	
 	private DmlSyntacticValidatorHelper helper = null;
@@ -654,6 +658,7 @@ public class DmlSyntacticValidator implements DmlListener
 				}
 				
 	}
+	
 	private void fillExpressionInfoCommandLineParameters(String varName, ExpressionInfo dataInfo, Token start) {
 		
 		if(!varName.startsWith("$")) {
@@ -689,29 +694,38 @@ public class DmlSyntacticValidator implements DmlListener
 	
 	@Override
 	public void exitCommandlineParamExpression(CommandlineParamExpressionContext ctx) {
-		String varName = ctx.getText().trim();
-		fillExpressionInfoCommandLineParameters(varName, ctx.dataInfo, ctx.start);
-		if(ctx.dataInfo.expr == null) {
-			// Check if the parent is ifdef
-			if(!(ctx.parent instanceof IfdefAssignmentStatementContext)) {
-				helper.notifyErrorListeners("the parameter " + varName + " either needs to be passed through commandline or initialized to default value", ctx.start);
-			}
-		}
+		handleCommandlineArgumentExpression(ctx);
 	}
 
 	@Override
 	public void exitCommandlinePositionExpression(CommandlinePositionExpressionContext ctx) {
-		String varName = ctx.getText().trim();
+		handleCommandlineArgumentExpression(ctx);
+	}
+	
+	/**
+	 * 
+	 * @param ctx
+	 */
+	private void handleCommandlineArgumentExpression(DataIdentifierContext ctx)
+	{
+		String varName = ctx.getText().trim();		
 		fillExpressionInfoCommandLineParameters(varName, ctx.dataInfo, ctx.start);
+		
 		if(ctx.dataInfo.expr == null) {
-			// Check if the parent is ifdef
 			if(!(ctx.parent instanceof IfdefAssignmentStatementContext)) {
-				helper.notifyErrorListeners("the parameter " + varName + " either needs to be passed through commandline or initialized to default value", ctx.start);
+				String msg = "The parameter " + varName + " either needs to be passed "
+						+ "through commandline or initialized to default value.";
+				if( AParserWrapper.IGNORE_UNSPECIFIED_ARGS ) {
+					ctx.dataInfo.expr = getConstIdFromString(" ", ctx.start);
+					helper.raiseWarning(msg, ctx.start);
+				}
+				else {
+					helper.notifyErrorListeners(msg, ctx.start);
+				}
 			}
 		}
 	}
 	
-	
 	// --------------------------------------------------------------------
 	
 	@Override

http://git-wip-us.apache.org/repos/asf/incubator-systemml/blob/f8e25bb7/src/main/java/org/apache/sysml/parser/antlr4/DmlSyntacticValidatorHelper.java
----------------------------------------------------------------------
diff --git a/src/main/java/org/apache/sysml/parser/antlr4/DmlSyntacticValidatorHelper.java b/src/main/java/org/apache/sysml/parser/antlr4/DmlSyntacticValidatorHelper.java
index 3c51b9e..91dbbf0 100644
--- a/src/main/java/org/apache/sysml/parser/antlr4/DmlSyntacticValidatorHelper.java
+++ b/src/main/java/org/apache/sysml/parser/antlr4/DmlSyntacticValidatorHelper.java
@@ -45,6 +45,10 @@ public class DmlSyntacticValidatorHelper {
 		this._errorListener.validationError(op.getLine(), op.getCharPositionInLine(), message);
 	}
 	
+	public void raiseWarning(String message, Token op) {
+		this._errorListener.validationWarning(op.getLine(), op.getCharPositionInLine(), message);
+	}
+	
 	public String getCurrentFileName() {
 		return _errorListener.peekFileName();
 	}

http://git-wip-us.apache.org/repos/asf/incubator-systemml/blob/f8e25bb7/src/main/java/org/apache/sysml/parser/python/PydmlSyntacticValidator.java
----------------------------------------------------------------------
diff --git a/src/main/java/org/apache/sysml/parser/python/PydmlSyntacticValidator.java b/src/main/java/org/apache/sysml/parser/python/PydmlSyntacticValidator.java
index fc56fc2..e7a2b6e 100644
--- a/src/main/java/org/apache/sysml/parser/python/PydmlSyntacticValidator.java
+++ b/src/main/java/org/apache/sysml/parser/python/PydmlSyntacticValidator.java
@@ -46,6 +46,7 @@ import org.apache.sysml.parser.Expression;
 import org.apache.sysml.parser.Expression.DataOp;
 import org.apache.sysml.parser.Expression.DataType;
 import org.apache.sysml.parser.Expression.ValueType;
+import org.apache.sysml.parser.AParserWrapper;
 import org.apache.sysml.parser.ExternalFunctionStatement;
 import org.apache.sysml.parser.ForStatement;
 import org.apache.sysml.parser.FunctionCallIdentifier;
@@ -120,6 +121,10 @@ import org.apache.sysml.parser.python.PydmlParser.UnaryExpressionContext;
 import org.apache.sysml.parser.python.PydmlParser.ValueDataTypeCheckContext;
 import org.apache.sysml.parser.python.PydmlParser.WhileStatementContext;
 
+/**
+ * TODO: Refactor duplicated parser code dml/pydml (entire package).
+ *
+ */
 public class PydmlSyntacticValidator implements PydmlListener
 {	
 	private PydmlSyntacticValidatorHelper helper = null;
@@ -664,29 +669,38 @@ public class PydmlSyntacticValidator implements PydmlListener
 	
 	@Override
 	public void exitCommandlineParamExpression(CommandlineParamExpressionContext ctx) {
-		String varName = ctx.getText().trim();
-		fillExpressionInfoCommandLineParameters(varName, ctx.dataInfo, ctx.start);
-		if(ctx.dataInfo.expr == null) {
-			// Check if the parent is ifdef
-			if(!(ctx.parent instanceof IfdefAssignmentStatementContext)) {
-				helper.notifyErrorListeners("the parameter " + varName + " either needs to be passed through commandline or initialized to default value", ctx.start);
-			}
-		}
+		handleCommandlineArgumentExpression(ctx);
 	}
 
 	@Override
 	public void exitCommandlinePositionExpression(CommandlinePositionExpressionContext ctx) {
-		String varName = ctx.getText().trim();
+		handleCommandlineArgumentExpression(ctx);
+	}
+	
+	/**
+	 * 
+	 * @param ctx
+	 */
+	private void handleCommandlineArgumentExpression(DataIdentifierContext ctx)
+	{
+		String varName = ctx.getText().trim();		
 		fillExpressionInfoCommandLineParameters(varName, ctx.dataInfo, ctx.start);
+		
 		if(ctx.dataInfo.expr == null) {
-			// Check if the parent is ifdef
 			if(!(ctx.parent instanceof IfdefAssignmentStatementContext)) {
-				helper.notifyErrorListeners("the parameter " + varName + " either needs to be passed through commandline or initialized to default value", ctx.start);
+				String msg = "The parameter " + varName + " either needs to be passed "
+						+ "through commandline or initialized to default value.";
+				if( AParserWrapper.IGNORE_UNSPECIFIED_ARGS ) {
+					ctx.dataInfo.expr = getConstIdFromString(" ", ctx.start);
+					helper.raiseWarning(msg, ctx.start);
+				}
+				else {
+					helper.notifyErrorListeners(msg, ctx.start);
+				}
 			}
 		}
 	}
 	
-	
 	// --------------------------------------------------------------------
 	
 	@Override

http://git-wip-us.apache.org/repos/asf/incubator-systemml/blob/f8e25bb7/src/main/java/org/apache/sysml/parser/python/PydmlSyntacticValidatorHelper.java
----------------------------------------------------------------------
diff --git a/src/main/java/org/apache/sysml/parser/python/PydmlSyntacticValidatorHelper.java b/src/main/java/org/apache/sysml/parser/python/PydmlSyntacticValidatorHelper.java
index 67aeb4a..f014684 100644
--- a/src/main/java/org/apache/sysml/parser/python/PydmlSyntacticValidatorHelper.java
+++ b/src/main/java/org/apache/sysml/parser/python/PydmlSyntacticValidatorHelper.java
@@ -23,7 +23,6 @@ import java.util.ArrayList;
 import java.util.List;
 
 import org.antlr.v4.runtime.Token;
-
 import org.apache.sysml.parser.DMLProgram;
 import org.apache.sysml.parser.python.PydmlParser.FunctionCallAssignmentStatementContext;
 import org.apache.sysml.parser.python.PydmlParser.ParameterizedExpressionContext;
@@ -43,6 +42,10 @@ public class PydmlSyntacticValidatorHelper
 	public void notifyErrorListeners(String message, Token op) {
 		this._errorListener.validationError(op.getLine(), op.getCharPositionInLine(), message);
 	}
+
+	public void raiseWarning(String message, Token op) {
+		this._errorListener.validationWarning(op.getLine(), op.getCharPositionInLine(), message);
+	}
 	
 	public String getCurrentFileName() {
 		return _errorListener.peekFileName();

http://git-wip-us.apache.org/repos/asf/incubator-systemml/blob/f8e25bb7/src/test/scripts/functions/jmlc/reuse-glm-predict.dml
----------------------------------------------------------------------
diff --git a/src/test/scripts/functions/jmlc/reuse-glm-predict.dml b/src/test/scripts/functions/jmlc/reuse-glm-predict.dml
index e82939d..540971a 100644
--- a/src/test/scripts/functions/jmlc/reuse-glm-predict.dml
+++ b/src/test/scripts/functions/jmlc/reuse-glm-predict.dml
@@ -20,6 +20,8 @@
 #-------------------------------------------------------------
 
 # Default values for input parameters:
+fileX = $X;
+fileB = $B;
 fileM = ifdef ($M, " ");
 fileY = ifdef ($Y, " ");
 fileO = ifdef ($O, " ");
@@ -45,13 +47,13 @@ if (dist_type == 3) {
             link_type = 2;
 }}} }
 
-X = read ("./tmp/X", rows=-1, cols=-1);
+X = read(fileX);
 #X = table(X[,1], X[,2], X[,3])
 
 num_records  = nrow (X);
 num_features = ncol (X);
 
-W = read ("./tmp/B", rows=-1, cols=-1);
+W = read (fileB);
 if (dist_type == 3) {
     beta =  W [1 : ncol (X),  ];
     intercept = W [nrow(W),  ];
@@ -77,7 +79,7 @@ if (fileM != " ") {
 }
 
 predicted_y = rowIndexMax(means)
-write(predicted_y, "./tmp/P", format=fmtM)
+write(predicted_y, $P, format=fmtM)
 
 if (fileY != " ")
 {

http://git-wip-us.apache.org/repos/asf/incubator-systemml/blob/f8e25bb7/src/test/scripts/functions/jmlc/reuse-msvm-predict.dml
----------------------------------------------------------------------
diff --git a/src/test/scripts/functions/jmlc/reuse-msvm-predict.dml b/src/test/scripts/functions/jmlc/reuse-msvm-predict.dml
index e572b11..8bd41e1 100644
--- a/src/test/scripts/functions/jmlc/reuse-msvm-predict.dml
+++ b/src/test/scripts/functions/jmlc/reuse-msvm-predict.dml
@@ -25,10 +25,10 @@ cmdLine_accuracy = ifdef($accuracy, " ")
 cmdLine_scores = ifdef($scores, " ")
 cmdLine_fmt = ifdef($fmt, "text")
 
-X = read ("./tmp/X", rows=-1, cols=-1);
+X = read ($X);
 N = max(X[,1]);
 
-W = read("./tmp/W", rows=-1, cols=-1);
+W = read($W);
 dimensions = as.scalar(W[nrow(W),1])
 intercept = as.scalar(W[nrow(W)-1,1])
 W = W[1:(nrow(W)-2),]