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/09/15 07:43:02 UTC

[2/3] incubator-systemml git commit: [SYSTEMML-921] Fix function call error handling with missing inputs

[SYSTEMML-921] Fix function call error handling with missing inputs

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

Branch: refs/heads/master
Commit: 00b06d4723c037a9effdecec526d9b039db40c2d
Parents: b304e60
Author: Matthias Boehm <mb...@us.ibm.com>
Authored: Thu Sep 15 01:34:21 2016 +0200
Committer: Matthias Boehm <mb...@us.ibm.com>
Committed: Thu Sep 15 09:41:29 2016 +0200

----------------------------------------------------------------------
 .../context/ExecutionContext.java               | 14 ++++----
 .../cp/FunctionCallCPInstruction.java           | 37 ++++++++++----------
 2 files changed, 26 insertions(+), 25 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-systemml/blob/00b06d47/src/main/java/org/apache/sysml/runtime/controlprogram/context/ExecutionContext.java
----------------------------------------------------------------------
diff --git a/src/main/java/org/apache/sysml/runtime/controlprogram/context/ExecutionContext.java b/src/main/java/org/apache/sysml/runtime/controlprogram/context/ExecutionContext.java
index dd20fd0..14b9c44 100644
--- a/src/main/java/org/apache/sysml/runtime/controlprogram/context/ExecutionContext.java
+++ b/src/main/java/org/apache/sysml/runtime/controlprogram/context/ExecutionContext.java
@@ -126,19 +126,19 @@ public class ExecutionContext
 	 * -------------------------------------------------------
 	 */
 	
-	public Data getVariable(String name) 
-	{
+	public Data getVariable(String name) {
 		return _variables.get(name);
 	}
 	
-	public void setVariable(String name, Data val) 
-		throws DMLRuntimeException
-	{
+	public void setVariable(String name, Data val) {
 		_variables.put(name, val);
 	}
+	
+	public boolean containsVariable(String name) {
+		return _variables.keySet().contains(name);
+	}
 
-	public Data removeVariable(String name) 
-	{
+	public Data removeVariable(String name) {
 		return _variables.remove(name);
 	}
 

http://git-wip-us.apache.org/repos/asf/incubator-systemml/blob/00b06d47/src/main/java/org/apache/sysml/runtime/instructions/cp/FunctionCallCPInstruction.java
----------------------------------------------------------------------
diff --git a/src/main/java/org/apache/sysml/runtime/instructions/cp/FunctionCallCPInstruction.java b/src/main/java/org/apache/sysml/runtime/instructions/cp/FunctionCallCPInstruction.java
index 348eef2..529bd25 100644
--- a/src/main/java/org/apache/sysml/runtime/instructions/cp/FunctionCallCPInstruction.java
+++ b/src/main/java/org/apache/sysml/runtime/instructions/cp/FunctionCallCPInstruction.java
@@ -27,6 +27,7 @@ import java.util.LinkedList;
 
 import org.apache.sysml.api.DMLScript;
 import org.apache.sysml.lops.Lop;
+import org.apache.sysml.parser.DMLProgram;
 import org.apache.sysml.parser.DataIdentifier;
 import org.apache.sysml.parser.Expression.DataType;
 import org.apache.sysml.parser.Expression.ValueType;
@@ -75,14 +76,12 @@ public class FunctionCallCPInstruction extends CPInstruction
 	}
 		
 	/**
-	 * Instruction format extFunct:::[FUNCTION NAME]:::[num input params]:::[num output params]:::[list of delimited input params ]:::[list of delimited ouput params]
-	 * These are the "bound names" for the inputs / outputs.  For example, out1 = foo(in1, in2) yields
-	 * extFunct:::foo:::2:::1:::in1:::in2:::out1
 	 * 
 	 */
 	public static FunctionCallCPInstruction parseInstruction(String str) 
 		throws DMLRuntimeException 
 	{	
+		//schema: extfunct, fname, num inputs, num outputs, inputs, outputs
 		String[] parts = InstructionUtils.getInstructionPartsWithValueType ( str );
 		String namespace = parts[1];
 		String functionName = parts[2];
@@ -91,22 +90,20 @@ public class FunctionCallCPInstruction extends CPInstruction
 		ArrayList<CPOperand> boundInParamOperands = new ArrayList<CPOperand>();
 		ArrayList<String> boundInParamNames = new ArrayList<String>();
 		ArrayList<String> boundOutParamNames = new ArrayList<String>();
-		
-		int FIRST_PARAM_INDEX = 5;
 		for (int i = 0; i < numInputs; i++) {
-			CPOperand operand = new CPOperand(parts[FIRST_PARAM_INDEX + i]);
+			CPOperand operand = new CPOperand(parts[5 + i]);
 			boundInParamOperands.add(operand);
 			boundInParamNames.add(operand.getName());
 		}
 		for (int i = 0; i < numOutputs; i++) {
-			boundOutParamNames.add(parts[FIRST_PARAM_INDEX + numInputs + i]);
+			boundOutParamNames.add(parts[5 + numInputs + i]);
 		}
 		
-		return new FunctionCallCPInstruction ( namespace,functionName, boundInParamOperands, boundInParamNames, boundOutParamNames, str );
+		return new FunctionCallCPInstruction ( namespace,functionName, 
+				boundInParamOperands, boundInParamNames, boundOutParamNames, str );
 	}
 
-	
-	
+		
 	@Override
 	public Instruction preprocessInstruction(ExecutionContext ec)
 		throws DMLRuntimeException 
@@ -144,8 +141,7 @@ public class FunctionCallCPInstruction extends CPInstruction
 			ValueType valType = fpb.getInputParams().get(i).getValueType();
 				
 			// CASE (a): default values, if call w/ less params than signature (scalars only)
-			if (   i > _boundInputParamNames.size() 
-				|| (!_boundInputParamOperands.get(i).isLiteral() && ec.getVariable(_boundInputParamNames.get(i)) == null))
+			if( i > _boundInputParamNames.size() )
 			{	
 				String defaultVal = fpb.getInputParams().get(i).getDefaultValue();
 				currFormalParamValue = ec.getScalarInput(defaultVal, valType, false);
@@ -153,12 +149,17 @@ public class FunctionCallCPInstruction extends CPInstruction
 			// CASE (b) literals or symbol table entries
 			else {
 				CPOperand operand = _boundInputParamOperands.get(i);
-				if( operand.getDataType()==DataType.SCALAR )
-					currFormalParamValue = ec.getScalarInput(operand.getName(), operand.getValueType(), operand.isLiteral());
-				else
-					currFormalParamValue = ec.getVariable(operand.getName());					
+				String varname = operand.getName();
+				//error handling non-existing variables
+				if( !operand.isLiteral() && ec.containsVariable(varname) ) {
+					throw new DMLRuntimeException("Input variable '"+varname+"' not existing on call of " + 
+							DMLProgram.constructFunctionKey(_namespace, _functionName) + " (line "+getLineNum()+").");
+				}
+				//get input matrix/frame/scalar
+				currFormalParamValue = (operand.getDataType()!=DataType.SCALAR) ? ec.getVariable(varname) : 
+					ec.getScalarInput(varname, operand.getValueType(), operand.isLiteral());
 			}
-				
+			
 			functionVariables.put(currFormalParamName,currFormalParamValue);						
 		}
 		
@@ -179,7 +180,7 @@ public class FunctionCallCPInstruction extends CPInstruction
 			throw e;
 		}
 		catch (Exception e){
-			String fname = this._namespace + "::" + this._functionName;
+			String fname = DMLProgram.constructFunctionKey(_namespace, _functionName);
 			throw new DMLRuntimeException("error executing function " + fname, e);
 		}