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. *