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);
}