Repository: systemml Updated Branches: refs/heads/master 42359f11c -> 6f2c885e8
[SYSTEMML-2308,2309] New list data type, incl length, rix, cast ops This patch introduces a new list data type to group arbitrary data elements (matrices, frames, scalars, and lists) into a single handle. Since it's just a meta data handle, we only support the operations length (number of entries), right indexing (point and range lookups), casts to matrices, frames, and scalars, and rmvar instructions. Note, that this also includes a grammar change and thus regeneration of the antlr parser. Furthermore, this includes a minor fix for exist operations to correctly handle lists and frames. Project: http://git-wip-us.apache.org/repos/asf/systemml/repo Commit: http://git-wip-us.apache.org/repos/asf/systemml/commit/d6e2ae66 Tree: http://git-wip-us.apache.org/repos/asf/systemml/tree/d6e2ae66 Diff: http://git-wip-us.apache.org/repos/asf/systemml/diff/d6e2ae66 Branch: refs/heads/master Commit: d6e2ae66260fdab53f34c9c38f09d37d179d6e6a Parents: 42359f1 Author: Matthias Boehm <[email protected]> Authored: Wed May 9 20:40:14 2018 -0700 Committer: Matthias Boehm <[email protected]> Committed: Thu May 10 12:28:30 2018 -0700 ---------------------------------------------------------------------- src/main/java/org/apache/sysml/hops/Hop.java | 10 +- .../java/org/apache/sysml/hops/IndexingOp.java | 3 + src/main/java/org/apache/sysml/hops/NaryOp.java | 5 +- .../java/org/apache/sysml/hops/UnaryOp.java | 13 ++- ...RewriteElementwiseMultChainOptimization.java | 11 +- src/main/java/org/apache/sysml/lops/Nary.java | 3 +- .../java/org/apache/sysml/lops/compile/Dag.java | 2 +- .../sysml/parser/BuiltinFunctionExpression.java | 26 ++++- .../org/apache/sysml/parser/DMLTranslator.java | 5 + .../org/apache/sysml/parser/Expression.java | 8 +- .../java/org/apache/sysml/parser/dml/Dml.g4 | 2 +- .../context/ExecutionContext.java | 4 +- .../sysml/runtime/functionobjects/Builtin.java | 4 +- .../instructions/CPInstructionParser.java | 11 +- .../cp/AggregateUnaryCPInstruction.java | 2 +- .../cp/BuiltinNaryCPInstruction.java | 2 +- .../instructions/cp/IndexingCPInstruction.java | 4 +- .../cp/ListIndexingCPInstruction.java | 80 ++++++++++++++ .../runtime/instructions/cp/ListObject.java | 106 +++++++++++++++++++ .../cp/ScalarBuiltinNaryCPInstruction.java | 30 ++++-- .../instructions/cp/VariableCPInstruction.java | 26 +++-- .../functions/misc/ListAndStructTest.java | 97 +++++++++++++++++ src/test/scripts/functions/misc/ListUnnamed.R | 42 ++++++++ src/test/scripts/functions/misc/ListUnnamed.dml | 38 +++++++ .../functions/misc/ZPackageSuite.java | 1 + 25 files changed, 483 insertions(+), 52 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/systemml/blob/d6e2ae66/src/main/java/org/apache/sysml/hops/Hop.java ---------------------------------------------------------------------- diff --git a/src/main/java/org/apache/sysml/hops/Hop.java b/src/main/java/org/apache/sysml/hops/Hop.java index 059132d..bd906b5 100644 --- a/src/main/java/org/apache/sysml/hops/Hop.java +++ b/src/main/java/org/apache/sysml/hops/Hop.java @@ -610,8 +610,7 @@ public abstract class Hop implements ParseInfo switch( getDataType() ) { - case SCALAR: - { + case SCALAR: { //memory estimate always known if( getValueType()== ValueType.DOUBLE) //default case _outputMemEstimate = OptimizerUtils.DOUBLE_SIZE; @@ -666,8 +665,8 @@ public abstract class Hop implements ParseInfo break; } case OBJECT: - case UNKNOWN: - { + case UNKNOWN: + case LIST: { //memory estimate always unknown _outputMemEstimate = OptimizerUtils.DEFAULT_SIZE; break; @@ -1088,7 +1087,7 @@ public abstract class Hop implements ParseInfo // Operations that require a variable number of operands public enum OpOpN { - PRINTF, CBIND, RBIND, EVAL + PRINTF, CBIND, RBIND, EVAL, LIST, } public enum AggOp { @@ -1375,6 +1374,7 @@ public abstract class Hop implements ParseInfo HopsOpOpNLops.put(OpOpN.CBIND, Nary.OperationType.CBIND); HopsOpOpNLops.put(OpOpN.RBIND, Nary.OperationType.RBIND); HopsOpOpNLops.put(OpOpN.EVAL, Nary.OperationType.EVAL); + HopsOpOpNLops.put(OpOpN.LIST, Nary.OperationType.LIST); } protected static final HashMap<Hop.OpOp1, String> HopsOpOp12String; http://git-wip-us.apache.org/repos/asf/systemml/blob/d6e2ae66/src/main/java/org/apache/sysml/hops/IndexingOp.java ---------------------------------------------------------------------- diff --git a/src/main/java/org/apache/sysml/hops/IndexingOp.java b/src/main/java/org/apache/sysml/hops/IndexingOp.java index c265d59..2f52f29 100644 --- a/src/main/java/org/apache/sysml/hops/IndexingOp.java +++ b/src/main/java/org/apache/sysml/hops/IndexingOp.java @@ -388,6 +388,9 @@ public class IndexingOp extends Hop checkAndSetInvalidCPDimsAndSize(); } + if( getInput().get(0).getDataType()==DataType.LIST ) + _etype = ExecType.CP; + //mark for recompile (forever) setRequiresRecompileIfNecessary(); http://git-wip-us.apache.org/repos/asf/systemml/blob/d6e2ae66/src/main/java/org/apache/sysml/hops/NaryOp.java ---------------------------------------------------------------------- diff --git a/src/main/java/org/apache/sysml/hops/NaryOp.java b/src/main/java/org/apache/sysml/hops/NaryOp.java index 4b950de..a08f86c 100644 --- a/src/main/java/org/apache/sysml/hops/NaryOp.java +++ b/src/main/java/org/apache/sysml/hops/NaryOp.java @@ -155,7 +155,7 @@ public class NaryOp extends Hop { setRequiresRecompileIfNecessary(); //ensure cp exec type for single-node operations - if ( _op == OpOpN.PRINTF || _op == OpOpN.EVAL) + if ( _op == OpOpN.PRINTF || _op == OpOpN.EVAL || _op == OpOpN.LIST) _etype = ExecType.CP; return _etype; @@ -182,6 +182,9 @@ public class NaryOp extends Hop { setDim1(HopRewriteUtils.getSumValidInputDims(this, true)); setDim2(HopRewriteUtils.getMaxInputDim(this, false)); break; + case LIST: + setDim1(getInput().size()); + setDim2(1); case PRINTF: case EVAL: //do nothing: http://git-wip-us.apache.org/repos/asf/systemml/blob/d6e2ae66/src/main/java/org/apache/sysml/hops/UnaryOp.java ---------------------------------------------------------------------- diff --git a/src/main/java/org/apache/sysml/hops/UnaryOp.java b/src/main/java/org/apache/sysml/hops/UnaryOp.java index 7b7c685..46a5f8e 100644 --- a/src/main/java/org/apache/sysml/hops/UnaryOp.java +++ b/src/main/java/org/apache/sysml/hops/UnaryOp.java @@ -685,8 +685,9 @@ public class UnaryOp extends Hop implements MultiThreadedHop setRequiresRecompileIfNecessary(); //ensure cp exec type for single-node operations - if( _op == OpOp1.PRINT || _op == OpOp1.ASSERT || _op == OpOp1.STOP - || _op == OpOp1.INVERSE || _op == OpOp1.EIGEN || _op == OpOp1.CHOLESKY || _op == OpOp1.SVD) + if( _op == OpOp1.PRINT || _op == OpOp1.ASSERT || _op == OpOp1.STOP + || _op == OpOp1.INVERSE || _op == OpOp1.EIGEN || _op == OpOp1.CHOLESKY || _op == OpOp1.SVD + || getInput().get(0).getDataType() == DataType.LIST ) { _etype = ExecType.CP; } @@ -697,10 +698,14 @@ public class UnaryOp extends Hop implements MultiThreadedHop @Override public void refreshSizeInformation() { - if ( getDataType() == DataType.SCALAR ) - { + if ( getDataType() == DataType.SCALAR ) { //do nothing always known } + else if( (_op == OpOp1.CAST_AS_MATRIX || _op == OpOp1.CAST_AS_FRAME + || _op == OpOp1.CAST_AS_SCALAR) && getInput().get(0).getDataType()==DataType.LIST ){ + setDim1( -1 ); + setDim2( -1 ); + } else if( (_op == OpOp1.CAST_AS_MATRIX || _op == OpOp1.CAST_AS_FRAME) && getInput().get(0).getDataType()==DataType.SCALAR ) { http://git-wip-us.apache.org/repos/asf/systemml/blob/d6e2ae66/src/main/java/org/apache/sysml/hops/rewrite/RewriteElementwiseMultChainOptimization.java ---------------------------------------------------------------------- diff --git a/src/main/java/org/apache/sysml/hops/rewrite/RewriteElementwiseMultChainOptimization.java b/src/main/java/org/apache/sysml/hops/rewrite/RewriteElementwiseMultChainOptimization.java index a5d8b06..59092d5 100644 --- a/src/main/java/org/apache/sysml/hops/rewrite/RewriteElementwiseMultChainOptimization.java +++ b/src/main/java/org/apache/sysml/hops/rewrite/RewriteElementwiseMultChainOptimization.java @@ -257,11 +257,12 @@ public class RewriteElementwiseMultChainOptimization extends HopRewriteRule { { for (int i = 0, valuesLength = Expression.DataType.values().length; i < valuesLength; i++) switch(Expression.DataType.values()[i]) { - case SCALAR: orderDataType[i] = 0; break; - case MATRIX: orderDataType[i] = 1; break; - case FRAME: orderDataType[i] = 2; break; - case OBJECT: orderDataType[i] = 3; break; - case UNKNOWN:orderDataType[i] = 4; break; + case SCALAR: orderDataType[i] = 0; break; + case MATRIX: orderDataType[i] = 1; break; + case FRAME: orderDataType[i] = 2; break; + case OBJECT: orderDataType[i] = 3; break; + case UNKNOWN:orderDataType[i] = 4; break; + case LIST: orderDataType[i] = 5; break; } } http://git-wip-us.apache.org/repos/asf/systemml/blob/d6e2ae66/src/main/java/org/apache/sysml/lops/Nary.java ---------------------------------------------------------------------- diff --git a/src/main/java/org/apache/sysml/lops/Nary.java b/src/main/java/org/apache/sysml/lops/Nary.java index 7541ffa..f7d5952 100644 --- a/src/main/java/org/apache/sysml/lops/Nary.java +++ b/src/main/java/org/apache/sysml/lops/Nary.java @@ -32,7 +32,7 @@ import org.apache.sysml.parser.Expression.ValueType; public class Nary extends Lop { public enum OperationType { - PRINTF, CBIND, RBIND, EVAL + PRINTF, CBIND, RBIND, EVAL, LIST } private OperationType operationType; @@ -119,6 +119,7 @@ public class Nary extends Lop { case CBIND: case RBIND: case EVAL: + case LIST: return operationType.name().toLowerCase(); default: throw new UnsupportedOperationException( http://git-wip-us.apache.org/repos/asf/systemml/blob/d6e2ae66/src/main/java/org/apache/sysml/lops/compile/Dag.java ---------------------------------------------------------------------- diff --git a/src/main/java/org/apache/sysml/lops/compile/Dag.java b/src/main/java/org/apache/sysml/lops/compile/Dag.java index f0f74cc..3244a3b 100644 --- a/src/main/java/org/apache/sysml/lops/compile/Dag.java +++ b/src/main/java/org/apache/sysml/lops/compile/Dag.java @@ -2276,7 +2276,7 @@ public class Dag<N extends Lop> // since outputs are explicitly specified if (node.getExecLocation() != ExecLocation.Data ) { - if (node.getDataType() == DataType.SCALAR) { + if (node.getDataType() == DataType.SCALAR || node.getDataType() == DataType.LIST) { oparams.setLabel(Lop.SCALAR_VAR_NAME_PREFIX + var_index.getNextID()); out.setVarName(oparams.getLabel()); Instruction currInstr = VariableCPInstruction.prepareRemoveInstruction(oparams.getLabel()); http://git-wip-us.apache.org/repos/asf/systemml/blob/d6e2ae66/src/main/java/org/apache/sysml/parser/BuiltinFunctionExpression.java ---------------------------------------------------------------------- diff --git a/src/main/java/org/apache/sysml/parser/BuiltinFunctionExpression.java b/src/main/java/org/apache/sysml/parser/BuiltinFunctionExpression.java index 8ce197f..6e48839 100644 --- a/src/main/java/org/apache/sysml/parser/BuiltinFunctionExpression.java +++ b/src/main/java/org/apache/sysml/parser/BuiltinFunctionExpression.java @@ -24,6 +24,7 @@ import java.util.HashMap; import java.util.HashSet; import org.antlr.v4.runtime.ParserRuleContext; +import org.apache.commons.lang.ArrayUtils; import org.apache.sysml.conf.ConfigurationManager; import org.apache.sysml.parser.LanguageException.LanguageErrorCodes; import org.apache.sysml.runtime.matrix.MatrixCharacteristics; @@ -510,7 +511,8 @@ public class BuiltinFunctionExpression extends DataIdentifier break; case CAST_AS_MATRIX: checkNumParameters(1); - checkScalarFrameParam(getFirstExpr()); + checkDataTypeParam(getFirstExpr(), + DataType.SCALAR, DataType.FRAME, DataType.LIST); output.setDataType(DataType.MATRIX); output.setDimensions(id.getDim1(), id.getDim2()); if( getFirstExpr().getOutput().getDataType()==DataType.SCALAR ) @@ -689,13 +691,21 @@ public class BuiltinFunctionExpression extends DataIdentifier case NCOL: case LENGTH: checkNumParameters(1); - checkMatrixFrameParam(getFirstExpr()); + checkDataTypeParam(getFirstExpr(), + DataType.MATRIX, DataType.FRAME, DataType.LIST); output.setDataType(DataType.SCALAR); output.setDimensions(0, 0); output.setBlockDimensions (0, 0); output.setValueType(ValueType.INT); break; - + + case LIST: + output.setDataType(DataType.LIST); + output.setValueType(ValueType.UNKNOWN); + output.setDimensions(getAllExpr().length, 1); + output.setBlockDimensions(-1, -1); + break; + case EXISTS: checkNumParameters(1); checkStringOrDataIdentifier(getFirstExpr()); @@ -704,7 +714,7 @@ public class BuiltinFunctionExpression extends DataIdentifier output.setBlockDimensions (0, 0); output.setValueType(ValueType.BOOLEAN); break; - + // Contingency tables case TABLE: @@ -1496,6 +1506,11 @@ public class BuiltinFunctionExpression extends DataIdentifier } } + protected void checkDataTypeParam(Expression e, DataType... dt) { //always unconditional + if( !ArrayUtils.contains(dt, e.getOutput().getDataType()) ) + raiseValidateError("Non-matching expected data type for function "+ getOpCode(), false, LanguageErrorCodes.UNSUPPORTED_PARAMETERS); + } + protected void checkMatrixFrameParam(Expression e) { //always unconditional if (e.getOutput().getDataType() != DataType.MATRIX && e.getOutput().getDataType() != DataType.FRAME) { raiseValidateError("Expecting matrix or frame parameter for function "+ getOpCode(), false, LanguageErrorCodes.UNSUPPORTED_PARAMETERS); @@ -1514,6 +1529,7 @@ public class BuiltinFunctionExpression extends DataIdentifier } } + @SuppressWarnings("unused") private void checkScalarFrameParam(Expression e) { //always unconditional if (e.getOutput().getDataType() != DataType.SCALAR && e.getOutput().getDataType() != DataType.FRAME) { raiseValidateError("Expecting scalar parameter for function " + this.getOpCode(), false, LanguageErrorCodes.UNSUPPORTED_PARAMETERS); @@ -1639,6 +1655,8 @@ public class BuiltinFunctionExpression extends DataIdentifier bifop = Expression.BuiltinFunctionOp.MAX; else if (functionName.equals("ppred")) bifop = Expression.BuiltinFunctionOp.PPRED; + else if(functionName.equals("list")) + bifop = Expression.BuiltinFunctionOp.LIST; else if (functionName.equals("log")) bifop = Expression.BuiltinFunctionOp.LOG; else if (functionName.equals("length")) http://git-wip-us.apache.org/repos/asf/systemml/blob/d6e2ae66/src/main/java/org/apache/sysml/parser/DMLTranslator.java ---------------------------------------------------------------------- diff --git a/src/main/java/org/apache/sysml/parser/DMLTranslator.java b/src/main/java/org/apache/sysml/parser/DMLTranslator.java index 45d8fcb..9d83dde 100644 --- a/src/main/java/org/apache/sysml/parser/DMLTranslator.java +++ b/src/main/java/org/apache/sysml/parser/DMLTranslator.java @@ -2372,6 +2372,11 @@ public class DMLTranslator target.getValueType(), Hop.OpOp1.LENGTH, expr) : new LiteralOp(expr.getDim1()*expr.getDim2()); break; + case LIST: + currBuiltinOp = new NaryOp(target.getName(), DataType.LIST, ValueType.UNKNOWN, + OpOpN.LIST, processAllExpressions(source.getAllExpr(), hops)); + break; + case EXISTS: currBuiltinOp = new UnaryOp(target.getName(), target.getDataType(), target.getValueType(), Hop.OpOp1.EXISTS, expr); http://git-wip-us.apache.org/repos/asf/systemml/blob/d6e2ae66/src/main/java/org/apache/sysml/parser/Expression.java ---------------------------------------------------------------------- diff --git a/src/main/java/org/apache/sysml/parser/Expression.java b/src/main/java/org/apache/sysml/parser/Expression.java index 0381f2d..f369e19 100644 --- a/src/main/java/org/apache/sysml/parser/Expression.java +++ b/src/main/java/org/apache/sysml/parser/Expression.java @@ -98,7 +98,8 @@ public abstract class Expression implements ParseInfo INTERQUANTILE, INVERSE, IQM, - LENGTH, + LENGTH, + LIST, LOG, LU, MAX, @@ -180,7 +181,7 @@ public abstract class Expression implements ParseInfo * Data types (matrix, scalar, frame, object, unknown). */ public enum DataType { - MATRIX, SCALAR, FRAME, OBJECT, UNKNOWN; + MATRIX, SCALAR, FRAME, LIST, OBJECT, UNKNOWN; public boolean isMatrix() { return (this == MATRIX); @@ -191,6 +192,9 @@ public abstract class Expression implements ParseInfo public boolean isScalar() { return (this == SCALAR); } + public boolean isComposite() { + return (this == LIST); + } } /** http://git-wip-us.apache.org/repos/asf/systemml/blob/d6e2ae66/src/main/java/org/apache/sysml/parser/dml/Dml.g4 ---------------------------------------------------------------------- diff --git a/src/main/java/org/apache/sysml/parser/dml/Dml.g4 b/src/main/java/org/apache/sysml/parser/dml/Dml.g4 index 8723b3f..6846f7a 100644 --- a/src/main/java/org/apache/sysml/parser/dml/Dml.g4 +++ b/src/main/java/org/apache/sysml/parser/dml/Dml.g4 @@ -114,7 +114,7 @@ dataIdentifier returns [ org.apache.sysml.parser.common.ExpressionInfo dataInfo } : // ------------------------------------------ // IndexedIdentifier - name=ID '[' (rowLower=expression (':' rowUpper=expression)?)? ',' (colLower=expression (':' colUpper=expression)?)? ']' # IndexedExpression + name=ID '[' (rowLower=expression (':' rowUpper=expression)?)? (',' (colLower=expression (':' colUpper=expression)?)?)? ']' # IndexedExpression // ------------------------------------------ | ID # SimpleDataIdentifierExpression | COMMANDLINE_NAMED_ID # CommandlineParamExpression http://git-wip-us.apache.org/repos/asf/systemml/blob/d6e2ae66/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 f339efb..67b2a83 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 @@ -497,7 +497,7 @@ public class ExecutionContext { * @param varList variable list * @return indicator vector of old cleanup state of matrix objects */ - public boolean[] pinVariables(ArrayList<String> varList) + public boolean[] pinVariables(List<String> varList) { //2-pass approach since multiple vars might refer to same matrix object boolean[] varsState = new boolean[varList.size()]; @@ -535,7 +535,7 @@ public class ExecutionContext { * @param varList variable list * @param varsState variable state */ - public void unpinVariables(ArrayList<String> varList, boolean[] varsState) { + public void unpinVariables(List<String> varList, boolean[] varsState) { for( int i=0; i<varList.size(); i++ ) { Data dat = _variables.get(varList.get(i)); if( dat instanceof MatrixObject ) http://git-wip-us.apache.org/repos/asf/systemml/blob/d6e2ae66/src/main/java/org/apache/sysml/runtime/functionobjects/Builtin.java ---------------------------------------------------------------------- diff --git a/src/main/java/org/apache/sysml/runtime/functionobjects/Builtin.java b/src/main/java/org/apache/sysml/runtime/functionobjects/Builtin.java index 6a04a87..7ad0808 100644 --- a/src/main/java/org/apache/sysml/runtime/functionobjects/Builtin.java +++ b/src/main/java/org/apache/sysml/runtime/functionobjects/Builtin.java @@ -46,12 +46,11 @@ import org.apache.sysml.runtime.DMLScriptException; */ public class Builtin extends ValueFunction { - private static final long serialVersionUID = 3836744687789840574L; public enum BuiltinCode { SIN, COS, TAN, SINH, COSH, TANH, ASIN, ACOS, ATAN, LOG, LOG_NZ, MIN, MAX, ABS, SIGN, SQRT, EXP, PLOGP, PRINT, PRINTF, NROW, NCOL, LENGTH, ROUND, MAXINDEX, MININDEX, - STOP, CEIL, FLOOR, CUMSUM, CUMPROD, CUMMIN, CUMMAX, INVERSE, SPROP, SIGMOID, EVAL } + STOP, CEIL, FLOOR, CUMSUM, CUMPROD, CUMMIN, CUMMAX, INVERSE, SPROP, SIGMOID, EVAL, LIST } public BuiltinCode bFunc; private static final boolean FASTMATH = true; @@ -82,6 +81,7 @@ public class Builtin extends ValueFunction String2BuiltinCode.put( "print" , BuiltinCode.PRINT); String2BuiltinCode.put( "printf" , BuiltinCode.PRINTF); String2BuiltinCode.put( "eval" , BuiltinCode.EVAL); + String2BuiltinCode.put( "list" , BuiltinCode.LIST); String2BuiltinCode.put( "nrow" , BuiltinCode.NROW); String2BuiltinCode.put( "ncol" , BuiltinCode.NCOL); String2BuiltinCode.put( "length" , BuiltinCode.LENGTH); http://git-wip-us.apache.org/repos/asf/systemml/blob/d6e2ae66/src/main/java/org/apache/sysml/runtime/instructions/CPInstructionParser.java ---------------------------------------------------------------------- diff --git a/src/main/java/org/apache/sysml/runtime/instructions/CPInstructionParser.java b/src/main/java/org/apache/sysml/runtime/instructions/CPInstructionParser.java index 395a4ec..9e81f08 100644 --- a/src/main/java/org/apache/sysml/runtime/instructions/CPInstructionParser.java +++ b/src/main/java/org/apache/sysml/runtime/instructions/CPInstructionParser.java @@ -179,11 +179,12 @@ public class CPInstructionParser extends InstructionParser String2CPInstructionType.put( "sprop", CPType.Unary); String2CPInstructionType.put( "sigmoid", CPType.Unary); - String2CPInstructionType.put( "printf" , CPType.BuiltinNary); - String2CPInstructionType.put( "cbind" , CPType.BuiltinNary); - String2CPInstructionType.put( "rbind" , CPType.BuiltinNary); - String2CPInstructionType.put( "eval" , CPType.BuiltinNary); - + String2CPInstructionType.put( "printf", CPType.BuiltinNary); + String2CPInstructionType.put( "cbind", CPType.BuiltinNary); + String2CPInstructionType.put( "rbind", CPType.BuiltinNary); + String2CPInstructionType.put( "eval", CPType.BuiltinNary); + String2CPInstructionType.put( "list", CPType.BuiltinNary); + // Parameterized Builtin Functions String2CPInstructionType.put( "cdf", CPType.ParameterizedBuiltin); String2CPInstructionType.put( "invcdf", CPType.ParameterizedBuiltin); http://git-wip-us.apache.org/repos/asf/systemml/blob/d6e2ae66/src/main/java/org/apache/sysml/runtime/instructions/cp/AggregateUnaryCPInstruction.java ---------------------------------------------------------------------- diff --git a/src/main/java/org/apache/sysml/runtime/instructions/cp/AggregateUnaryCPInstruction.java b/src/main/java/org/apache/sysml/runtime/instructions/cp/AggregateUnaryCPInstruction.java index 2c74a10..c9d9dc7 100644 --- a/src/main/java/org/apache/sysml/runtime/instructions/cp/AggregateUnaryCPInstruction.java +++ b/src/main/java/org/apache/sysml/runtime/instructions/cp/AggregateUnaryCPInstruction.java @@ -123,7 +123,7 @@ public class AggregateUnaryCPInstruction extends UnaryCPInstruction } else if( _type == AUType.EXISTS ) { //probe existence of variable in symbol table w/o error - String varName = input1.isMatrix() ? input1.getName() : + String varName = !input1.isScalar() ? input1.getName() : ec.getScalarInput(input1).getStringValue(); boolean rval = ec.getVariables().keySet().contains(varName); //create and set output scalar http://git-wip-us.apache.org/repos/asf/systemml/blob/d6e2ae66/src/main/java/org/apache/sysml/runtime/instructions/cp/BuiltinNaryCPInstruction.java ---------------------------------------------------------------------- diff --git a/src/main/java/org/apache/sysml/runtime/instructions/cp/BuiltinNaryCPInstruction.java b/src/main/java/org/apache/sysml/runtime/instructions/cp/BuiltinNaryCPInstruction.java index 8f5058d..eac9c32 100644 --- a/src/main/java/org/apache/sysml/runtime/instructions/cp/BuiltinNaryCPInstruction.java +++ b/src/main/java/org/apache/sysml/runtime/instructions/cp/BuiltinNaryCPInstruction.java @@ -58,7 +58,7 @@ public abstract class BuiltinNaryCPInstruction extends CPInstruction inputOperands[i-1] = new CPOperand(parts[i]); } - if( Nary.OperationType.PRINTF.name().equalsIgnoreCase(opcode) ) { + if( "printf".equals(opcode) || "list".equals(opcode)) { ValueFunction func = Builtin.getBuiltinFnObject(opcode); return new ScalarBuiltinNaryCPInstruction(new SimpleOperator(func), opcode, str, outputOperand, inputOperands); http://git-wip-us.apache.org/repos/asf/systemml/blob/d6e2ae66/src/main/java/org/apache/sysml/runtime/instructions/cp/IndexingCPInstruction.java ---------------------------------------------------------------------- diff --git a/src/main/java/org/apache/sysml/runtime/instructions/cp/IndexingCPInstruction.java b/src/main/java/org/apache/sysml/runtime/instructions/cp/IndexingCPInstruction.java index 4413139..0046713 100644 --- a/src/main/java/org/apache/sysml/runtime/instructions/cp/IndexingCPInstruction.java +++ b/src/main/java/org/apache/sysml/runtime/instructions/cp/IndexingCPInstruction.java @@ -71,8 +71,10 @@ public abstract class IndexingCPInstruction extends UnaryCPInstruction { out = new CPOperand(parts[6]); if( in.getDataType()==DataType.MATRIX ) return new MatrixIndexingCPInstruction(in, rl, ru, cl, cu, out, opcode, str); - else if (in.getDataType() == DataType.FRAME) + else if( in.getDataType() == DataType.FRAME ) return new FrameIndexingCPInstruction(in, rl, ru, cl, cu, out, opcode, str); + else if( in.getDataType() == DataType.LIST ) + return new ListIndexingCPInstruction(in, rl, ru, cl, cu, out, opcode, str); else throw new DMLRuntimeException("Can index only on Frames or Matrices"); } http://git-wip-us.apache.org/repos/asf/systemml/blob/d6e2ae66/src/main/java/org/apache/sysml/runtime/instructions/cp/ListIndexingCPInstruction.java ---------------------------------------------------------------------- diff --git a/src/main/java/org/apache/sysml/runtime/instructions/cp/ListIndexingCPInstruction.java b/src/main/java/org/apache/sysml/runtime/instructions/cp/ListIndexingCPInstruction.java new file mode 100644 index 0000000..59b2d48 --- /dev/null +++ b/src/main/java/org/apache/sysml/runtime/instructions/cp/ListIndexingCPInstruction.java @@ -0,0 +1,80 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.sysml.runtime.instructions.cp; + +import org.apache.sysml.lops.LeftIndex; +import org.apache.sysml.lops.RightIndex; +import org.apache.sysml.runtime.DMLRuntimeException; +import org.apache.sysml.runtime.controlprogram.context.ExecutionContext; +import org.apache.sysml.runtime.util.IndexRange; + +public final class ListIndexingCPInstruction extends IndexingCPInstruction { + + protected ListIndexingCPInstruction(CPOperand in, CPOperand rl, CPOperand ru, CPOperand cl, + CPOperand cu, CPOperand out, String opcode, String istr) { + super(in, rl, ru, cl, cu, out, opcode, istr); + } + + protected ListIndexingCPInstruction(CPOperand lhsInput, CPOperand rhsInput, CPOperand rl, + CPOperand ru, CPOperand cl, CPOperand cu, CPOperand out, String opcode, String istr) { + super(lhsInput, rhsInput, rl, ru, cl, cu, out, opcode, istr); + } + + @Override + public void processInstruction(ExecutionContext ec) { + String opcode = getOpcode(); + IndexRange ixrange = getIndexRange(ec); + + //right indexing + if( opcode.equalsIgnoreCase(RightIndex.OPCODE) ) { + ListObject list = (ListObject) ec.getVariable(input1.getName()); + + //execute right indexing operation and set output + ec.setVariable(output.getName(), + list.slice((int)ixrange.rowStart, (int)ixrange.rowEnd)); + } + //left indexing + else if ( opcode.equalsIgnoreCase(LeftIndex.OPCODE)) { +// FrameBlock lin = ec.getFrameInput(input1.getName()); +// FrameBlock out = null; +// +// if(input2.getDataType() == DataType.FRAME) { //FRAME<-FRAME +// FrameBlock rin = ec.getFrameInput(input2.getName()); +// out = lin.leftIndexingOperations(rin, ixrange, new FrameBlock()); +// ec.releaseFrameInput(input2.getName()); +// } +// else { //FRAME<-SCALAR +// if(!ixrange.isScalar()) +// throw new DMLRuntimeException("Invalid index range of scalar leftindexing: "+ixrange.toString()+"." ); +// ScalarObject scalar = ec.getScalarInput(input2.getName(), input2.getValueType(), input2.isLiteral()); +// out = new FrameBlock(lin); +// out.set((int)ixrange.rowStart, (int)ixrange.colStart, scalar.getStringValue()); +// } +// +// //unpin lhs input +// ec.releaseFrameInput(input1.getName()); +// +// //unpin output +// ec.setFrameOutput(output.getName(), out); + } + else + throw new DMLRuntimeException("Invalid opcode (" + opcode +") encountered in ListIndexingCPInstruction."); + } +} http://git-wip-us.apache.org/repos/asf/systemml/blob/d6e2ae66/src/main/java/org/apache/sysml/runtime/instructions/cp/ListObject.java ---------------------------------------------------------------------- diff --git a/src/main/java/org/apache/sysml/runtime/instructions/cp/ListObject.java b/src/main/java/org/apache/sysml/runtime/instructions/cp/ListObject.java new file mode 100644 index 0000000..f773847 --- /dev/null +++ b/src/main/java/org/apache/sysml/runtime/instructions/cp/ListObject.java @@ -0,0 +1,106 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.sysml.runtime.instructions.cp; + +import java.util.Arrays; +import java.util.List; + +import org.apache.sysml.parser.Expression.DataType; +import org.apache.sysml.parser.Expression.ValueType; +import org.apache.sysml.runtime.DMLRuntimeException; + +public class ListObject extends Data +{ + private static final long serialVersionUID = 3652422061598967358L; + + private final List<String> _names; + private final List<Data> _data; + private boolean[] _dataState = null; + + public ListObject(List<Data> data) { + super(DataType.LIST, ValueType.UNKNOWN); + _data = data; + _names = null; + } + + public ListObject(List<Data> data, List<String> names) { + super(DataType.LIST, ValueType.UNKNOWN); + _data = data; + _names = names; + } + + public void setStatus(boolean[] status) { + _dataState = status; + } + + public boolean[] getStatus() { + return _dataState; + } + + public int getLength() { + return _data.size(); + } + + public Data slice(int ix) { + return _data.get(ix); + } + + public ListObject slice(int ix1, int ix2) { + ListObject ret = new ListObject(_data.subList(ix1, ix2+1), + (_names!=null) ? _names.subList(ix1, ix2+1) : null); + ret.setStatus(Arrays.copyOfRange(_dataState, ix2, ix2+1)); + return ret; + } + + public Data slice(String name) { + //check for existing named list + if( _names == null ) + throw new DMLRuntimeException("Invalid lookup by name in unnamed list."); + + //find position and check for existing entry + int pos = _names.indexOf(name); + if( pos <= 0 || pos >= _data.size() ) + throw new DMLRuntimeException("List lookup return no entry for name='"+name+"'"); + + //return existing entry + return slice(pos); + } + + @Override + public String getDebugName() { + return toString(); + } + + @Override + public String toString() { + StringBuilder sb = new StringBuilder("List ("); + for( int i=0; i<_data.size(); i++ ) { + if( i > 0 ) + sb.append(", "); + if( _names != null ) { + sb.append(_names.get(i)); + sb.append("="); + } + sb.append(_data.get(i).toString()); + } + sb.append(")"); + return sb.toString(); + } +} http://git-wip-us.apache.org/repos/asf/systemml/blob/d6e2ae66/src/main/java/org/apache/sysml/runtime/instructions/cp/ScalarBuiltinNaryCPInstruction.java ---------------------------------------------------------------------- diff --git a/src/main/java/org/apache/sysml/runtime/instructions/cp/ScalarBuiltinNaryCPInstruction.java b/src/main/java/org/apache/sysml/runtime/instructions/cp/ScalarBuiltinNaryCPInstruction.java index 85eec77..d2ca6f5 100644 --- a/src/main/java/org/apache/sysml/runtime/instructions/cp/ScalarBuiltinNaryCPInstruction.java +++ b/src/main/java/org/apache/sysml/runtime/instructions/cp/ScalarBuiltinNaryCPInstruction.java @@ -20,10 +20,11 @@ package org.apache.sysml.runtime.instructions.cp; import java.util.ArrayList; +import java.util.Arrays; import java.util.List; +import java.util.stream.Collectors; import org.apache.sysml.api.DMLScript; -import org.apache.sysml.lops.Nary; import org.apache.sysml.parser.Expression; import org.apache.sysml.runtime.DMLRuntimeException; import org.apache.sysml.runtime.controlprogram.context.ExecutionContext; @@ -44,7 +45,7 @@ public class ScalarBuiltinNaryCPInstruction extends BuiltinNaryCPInstruction { @Override public void processInstruction(ExecutionContext ec) { - if (Nary.OperationType.PRINTF.toString().equalsIgnoreCase(getOpcode())) { + if( "printf".equals(getOpcode()) ) { List<ScalarObject> scalarObjects = new ArrayList<>(); for (CPOperand input : inputs) { ScalarObject so = ec.getScalarInput(input.getName(), input.getValueType(), input.isLiteral()); @@ -86,13 +87,26 @@ public class ScalarBuiltinNaryCPInstruction extends BuiltinNaryCPInstruction { if (!DMLScript.suppressPrint2Stdout()) { System.out.println(result); } - - // this is necessary so that the remove variable operation can be - // performed + ec.setScalarOutput(output.getName(), new StringObject(result)); - } else { - throw new DMLRuntimeException( - "Opcode (" + getOpcode() + ") not recognized in ScalarBuiltinMultipleCPInstruction"); + } + else if( "list".equals(getOpcode()) ) { + //obtain all input data objects, incl handling of literals + List<Data> data = Arrays.stream(inputs) + .map(in -> ec.getVariable(in)).collect(Collectors.toList()); + + //create list object over all inputs + ListObject list = new ListObject(data); + + //disable cleanup of individual objects and store cleanup state + list.setStatus(ec.pinVariables(Arrays.stream(inputs) + .map(in -> in.getName()).collect(Collectors.toList()))); + + ec.setVariable(output.getName(), list); + } + else { + throw new DMLRuntimeException("Opcode (" + getOpcode() + + ") not recognized in ScalarBuiltinMultipleCPInstruction"); } } http://git-wip-us.apache.org/repos/asf/systemml/blob/d6e2ae66/src/main/java/org/apache/sysml/runtime/instructions/cp/VariableCPInstruction.java ---------------------------------------------------------------------- diff --git a/src/main/java/org/apache/sysml/runtime/instructions/cp/VariableCPInstruction.java b/src/main/java/org/apache/sysml/runtime/instructions/cp/VariableCPInstruction.java index e9a6fd0..6d30346 100644 --- a/src/main/java/org/apache/sysml/runtime/instructions/cp/VariableCPInstruction.java +++ b/src/main/java/org/apache/sysml/runtime/instructions/cp/VariableCPInstruction.java @@ -572,18 +572,28 @@ public class VariableCPInstruction extends CPInstruction { } break; case CastAsMatrixVariable:{ - MatrixBlock out = null; if( getInput1().getDataType()==DataType.FRAME ) { FrameBlock fin = ec.getFrameInput(getInput1().getName()); - out = DataConverter.convertToMatrixBlock(fin); + MatrixBlock out = DataConverter.convertToMatrixBlock(fin); ec.releaseFrameInput(getInput1().getName()); + ec.setMatrixOutput(output.getName(), out, getExtendedOpcode()); } - else { //assume DataType.SCALAR otherwise - ScalarObject scalarInput = ec.getScalarInput(getInput1().getName(), getInput1().getValueType(), getInput1().isLiteral()); - out = new MatrixBlock(1,1,false); - out.quickSetValue(0, 0, scalarInput.getDoubleValue()); + else if( getInput1().getDataType()==DataType.SCALAR ) { + ScalarObject scalarInput = ec.getScalarInput( + getInput1().getName(), getInput1().getValueType(), getInput1().isLiteral()); + MatrixBlock out = new MatrixBlock(1,1,false); + out.quickSetValue(0, 0, scalarInput.getDoubleValue()); + ec.setMatrixOutput(output.getName(), out, getExtendedOpcode()); + } + else if( getInput1().getDataType()==DataType.LIST ) { + //TODO handling of cleanup status, potentially new object + ListObject list = (ListObject)ec.getVariable(getInput1().getName()); + ec.setVariable(output.getName(), list.slice(0)); + } + else { + throw new DMLRuntimeException("Unsupported data type " + + "in as.matrix(): "+getInput1().getDataType().name()); } - ec.setMatrixOutput(output.getName(), out, getExtendedOpcode()); break; } case CastAsFrameVariable:{ @@ -592,7 +602,7 @@ public class VariableCPInstruction extends CPInstruction { ScalarObject scalarInput = ec.getScalarInput(getInput1()); out = new FrameBlock(1, getInput1().getValueType()); out.ensureAllocatedColumns(1); - out.set(0, 0, scalarInput.getStringValue()); + out.set(0, 0, scalarInput.getStringValue()); } else { //DataType.FRAME MatrixBlock min = ec.getMatrixInput(getInput1().getName(), getExtendedOpcode()); http://git-wip-us.apache.org/repos/asf/systemml/blob/d6e2ae66/src/test/java/org/apache/sysml/test/integration/functions/misc/ListAndStructTest.java ---------------------------------------------------------------------- diff --git a/src/test/java/org/apache/sysml/test/integration/functions/misc/ListAndStructTest.java b/src/test/java/org/apache/sysml/test/integration/functions/misc/ListAndStructTest.java new file mode 100644 index 0000000..b831032 --- /dev/null +++ b/src/test/java/org/apache/sysml/test/integration/functions/misc/ListAndStructTest.java @@ -0,0 +1,97 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.sysml.test.integration.functions.misc; + +import org.junit.Assert; +import org.junit.Test; + +import java.util.HashMap; + +import org.apache.sysml.hops.OptimizerUtils; +import org.apache.sysml.runtime.matrix.data.MatrixValue.CellIndex; +import org.apache.sysml.test.integration.AutomatedTestBase; +import org.apache.sysml.test.integration.TestConfiguration; +import org.apache.sysml.test.utils.TestUtils; + +public class ListAndStructTest extends AutomatedTestBase +{ + private static final String TEST_NAME1 = "ListUnnamed"; + private static final String TEST_NAME2 = "ListNamed"; + + private static final String TEST_DIR = "functions/misc/"; + private static final String TEST_CLASS_DIR = TEST_DIR + ListAndStructTest.class.getSimpleName() + "/"; + + @Override + public void setUp() { + TestUtils.clearAssertionInformation(); + addTestConfiguration( TEST_NAME1, new TestConfiguration(TEST_CLASS_DIR, TEST_NAME1, new String[] { "R" }) ); + addTestConfiguration( TEST_NAME2, new TestConfiguration(TEST_CLASS_DIR, TEST_NAME2, new String[] { "R" }) ); + } + + @Test + public void testListUnnamed() { + runListStructTest(TEST_NAME1, false); + } + + @Test + public void testListUnnamedRewrites() { + runListStructTest(TEST_NAME1, true); + } + +// @Test +// public void testListNamed() { +// runListStructTest(TEST_NAME2, false); +// } +// +// @Test +// public void testListNamedRewrites() { +// runListStructTest(TEST_NAME2, true); +// } + + private void runListStructTest(String testname, boolean rewrites) + { + boolean oldFlag = OptimizerUtils.ALLOW_ALGEBRAIC_SIMPLIFICATION; + + try { + TestConfiguration config = getTestConfiguration(testname); + loadTestConfiguration(config); + + String HOME = SCRIPT_DIR + TEST_DIR; + fullDMLScriptName = HOME + testname + ".dml"; + programArgs = new String[]{ "-stats","-explain","-args", output("R") }; + fullRScriptName = HOME + testname + ".R"; + rCmd = getRCmd(expectedDir()); + + OptimizerUtils.ALLOW_ALGEBRAIC_SIMPLIFICATION = rewrites; + + //run test + runTest(true, false, null, -1); + runRScript(true); + + //compare matrices + HashMap<CellIndex, Double> dmlfile = readDMLMatrixFromHDFS("R"); + HashMap<CellIndex, Double> rfile = readRMatrixFromFS("R"); + Assert.assertEquals(dmlfile.get(new CellIndex(1,1)), rfile.get(new CellIndex(1,1))); + } + finally { + OptimizerUtils.ALLOW_ALGEBRAIC_SIMPLIFICATION = oldFlag; + } + } +} http://git-wip-us.apache.org/repos/asf/systemml/blob/d6e2ae66/src/test/scripts/functions/misc/ListUnnamed.R ---------------------------------------------------------------------- diff --git a/src/test/scripts/functions/misc/ListUnnamed.R b/src/test/scripts/functions/misc/ListUnnamed.R new file mode 100644 index 0000000..ede3c2b --- /dev/null +++ b/src/test/scripts/functions/misc/ListUnnamed.R @@ -0,0 +1,42 @@ +#------------------------------------------------------------- +# +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. +# +#------------------------------------------------------------- + + +args <- commandArgs(TRUE) +options(digits=22) +library("Matrix") + +A = matrix(1, 10, 10); +B = matrix(2, 10, 10); +c = 3; +D = matrix(4, 10, 10); + +X = list(A, B, c, D, matrix(5, 3, 3), 6); + +for( i in 1:length(X) ) { + tmp = X[i] + if( !exists("tmp") ) + print("ERROR: non-existing entry "+i ); +} + +R = as.matrix(sum(as.matrix(X[[5]]))); + +writeMM(as(R, "CsparseMatrix"), paste(args[1], "R", sep="")); http://git-wip-us.apache.org/repos/asf/systemml/blob/d6e2ae66/src/test/scripts/functions/misc/ListUnnamed.dml ---------------------------------------------------------------------- diff --git a/src/test/scripts/functions/misc/ListUnnamed.dml b/src/test/scripts/functions/misc/ListUnnamed.dml new file mode 100644 index 0000000..6cd4de5 --- /dev/null +++ b/src/test/scripts/functions/misc/ListUnnamed.dml @@ -0,0 +1,38 @@ +#------------------------------------------------------------- +# +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. +# +#------------------------------------------------------------- + + +A = matrix(1, 10, 10); +B = matrix(2, 10, 10); +c = 3; +D = matrix(4, 10, 10); + +X = list(A, B, c, D, matrix(5, 3, 3), 6); + +for( i in 1:length(X) ) { + tmp = X[i]; + if( !exists(tmp) ) + print("ERROR: non-existing entry "+i ); +} + +R = as.matrix(sum(as.matrix(X[5]))); + +write(R, $1); http://git-wip-us.apache.org/repos/asf/systemml/blob/d6e2ae66/src/test_suites/java/org/apache/sysml/test/integration/functions/misc/ZPackageSuite.java ---------------------------------------------------------------------- diff --git a/src/test_suites/java/org/apache/sysml/test/integration/functions/misc/ZPackageSuite.java b/src/test_suites/java/org/apache/sysml/test/integration/functions/misc/ZPackageSuite.java index 6166e3d..ab232d2 100644 --- a/src/test_suites/java/org/apache/sysml/test/integration/functions/misc/ZPackageSuite.java +++ b/src/test_suites/java/org/apache/sysml/test/integration/functions/misc/ZPackageSuite.java @@ -45,6 +45,7 @@ import org.junit.runners.Suite; IPAScalarRecursionTest.class, IPAScalarVariablePropagationTest.class, IPAUnknownRecursionTest.class, + ListAndStructTest.class, LongOverflowTest.class, NegativeLoopIncrementsTest.class, NrowNcolStringTest.class,
