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 <mboe...@gmail.com>
Authored: Sat Apr 14 22:47:44 2018 -0700
Committer: Matthias Boehm <mboe...@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.
         * 

Reply via email to