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 2018/04/15 05:46:04 UTC

systemml git commit: [SYSTEMML-2245] Support for external UDFs with variable num outputs

Repository: systemml
Updated Branches:
  refs/heads/master 2e6e02f0b -> a044ab21d


[SYSTEMML-2245] Support for external UDFs with variable num outputs

This patch adds support for external (i.e., java-based) UDFs with
variable numbers of outputs which is unknown until the UDF has been
executed. In detail, we now allow external UDFs to override the default
assumption of a fixed number of outputs and only verify bound outputs
for UDFs where this is possible.


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

Branch: refs/heads/master
Commit: a044ab21db1400dc18c85519f25fae4cec38e7b5
Parents: 2e6e02f
Author: Matthias Boehm <mb...@gmail.com>
Authored: Sat Apr 14 22:47:44 2018 -0700
Committer: Matthias Boehm <mb...@gmail.com>
Committed: Sat Apr 14 22:47:44 2018 -0700

----------------------------------------------------------------------
 .../controlprogram/ExternalFunctionProgramBlock.java      |  5 +++--
 src/main/java/org/apache/sysml/udf/PackageFunction.java   | 10 ++++++++++
 2 files changed, 13 insertions(+), 2 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/systemml/blob/a044ab21/src/main/java/org/apache/sysml/runtime/controlprogram/ExternalFunctionProgramBlock.java
----------------------------------------------------------------------
diff --git a/src/main/java/org/apache/sysml/runtime/controlprogram/ExternalFunctionProgramBlock.java b/src/main/java/org/apache/sysml/runtime/controlprogram/ExternalFunctionProgramBlock.java
index 72a7b2b..ae50592 100644
--- a/src/main/java/org/apache/sysml/runtime/controlprogram/ExternalFunctionProgramBlock.java
+++ b/src/main/java/org/apache/sysml/runtime/controlprogram/ExternalFunctionProgramBlock.java
@@ -285,8 +285,9 @@ public class ExternalFunctionProgramBlock extends FunctionProgramBlock
 	}
 	
 	protected void verifyFunctionInputsOutputs(PackageFunction fun, CPOperand[] inputs, CPOperand[] outputs) {
-		// verify number of outputs
-		if( outputs.length != fun.getNumFunctionOutputs() ) {
+		// verify number of outputs if fixed, otherwise best effort handle of outputs
+		if( !fun.hasVarNumFunctionOutputs()
+			&& outputs.length != fun.getNumFunctionOutputs() ) {
 			throw new DMLRuntimeException(
 					"Number of function outputs ("+fun.getNumFunctionOutputs()+") " +
 					"does not match with declaration ("+outputs.length+").");

http://git-wip-us.apache.org/repos/asf/systemml/blob/a044ab21/src/main/java/org/apache/sysml/udf/PackageFunction.java
----------------------------------------------------------------------
diff --git a/src/main/java/org/apache/sysml/udf/PackageFunction.java b/src/main/java/org/apache/sysml/udf/PackageFunction.java
index 408900c..016f58b 100644
--- a/src/main/java/org/apache/sysml/udf/PackageFunction.java
+++ b/src/main/java/org/apache/sysml/udf/PackageFunction.java
@@ -79,6 +79,16 @@ public abstract class PackageFunction implements Serializable
 	public abstract int getNumFunctionOutputs();
 
 	/**
+	 * Indicates if the function has a variable number of outputs, that
+	 * is unknown until the function has been executed.
+	 * 
+	 * @return true if the number of outputs is unknown; otherwise false.
+	 */
+	public boolean hasVarNumFunctionOutputs() {
+		return false;
+	}
+	
+	/**
 	 * Method to get a specific output of this package function. This method
 	 * should be implemented in the user's function.
 	 *