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/05/10 19:30:30 UTC
[3/4] systemml git commit: [SYSTEMML-2308,
2310] New dynamic structs via named lists, incl rix
[SYSTEMML-2308,2310] New dynamic structs via named lists, incl rix
Following the introduction of list data types as a handle for arbitrary
data objects, this patch now introduced dynamic structs implemented via
named lists. Specifically, this allows the named compositions such as X
= list(a=M1, b=M2, c=7, d=M4) and indexing operations such as X[2] or
X['d'], i.e., with associative indexing by name. We also support range
based indexing such as X[1:4] or X['a':'d'] where the order and thus
value range is defined by the specification order on construction.
Project: http://git-wip-us.apache.org/repos/asf/systemml/repo
Commit: http://git-wip-us.apache.org/repos/asf/systemml/commit/f9020a16
Tree: http://git-wip-us.apache.org/repos/asf/systemml/tree/f9020a16
Diff: http://git-wip-us.apache.org/repos/asf/systemml/diff/f9020a16
Branch: refs/heads/master
Commit: f9020a169b6291d18b3baa29eab7f5051bd2edf5
Parents: fa6394c
Author: Matthias Boehm <mb...@gmail.com>
Authored: Wed May 9 23:07:47 2018 -0700
Committer: Matthias Boehm <mb...@gmail.com>
Committed: Thu May 10 12:28:48 2018 -0700
----------------------------------------------------------------------
src/main/java/org/apache/sysml/hops/Hop.java | 28 +++++++------
.../sysml/hops/ParameterizedBuiltinOp.java | 21 ++++++----
.../apache/sysml/hops/recompile/Recompiler.java | 2 +-
.../sysml/hops/rewrite/HopRewriteUtils.java | 3 +-
.../RewriteAlgebraicSimplificationDynamic.java | 7 ++--
.../RewriteAlgebraicSimplificationStatic.java | 7 ++--
.../apache/sysml/lops/ParameterizedBuiltin.java | 18 ++++++---
.../sysml/parser/BuiltinFunctionExpression.java | 5 ++-
.../org/apache/sysml/parser/DMLTranslator.java | 10 ++++-
.../org/apache/sysml/parser/Expression.java | 3 +-
.../org/apache/sysml/parser/Identifier.java | 34 +++++++---------
.../ParameterizedBuiltinFunctionExpression.java | 35 +++++++++++-----
.../instructions/CPInstructionParser.java | 1 +
.../cp/ListIndexingCPInstruction.java | 15 +++++--
.../runtime/instructions/cp/ListObject.java | 23 ++++++++++-
.../cp/ParameterizedBuiltinCPInstruction.java | 36 ++++++++++++-----
.../cp/ScalarBuiltinNaryCPInstruction.java | 2 +-
.../functions/misc/ListAndStructTest.java | 18 ++++-----
src/test/scripts/functions/misc/ListNamed.R | 42 ++++++++++++++++++++
src/test/scripts/functions/misc/ListNamed.dml | 38 ++++++++++++++++++
20 files changed, 254 insertions(+), 94 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/systemml/blob/f9020a16/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 bd906b5..a42b7ab 100644
--- a/src/main/java/org/apache/sysml/hops/Hop.java
+++ b/src/main/java/org/apache/sysml/hops/Hop.java
@@ -44,6 +44,7 @@ import org.apache.sysml.lops.ReBlock;
import org.apache.sysml.lops.Ternary;
import org.apache.sysml.lops.Unary;
import org.apache.sysml.lops.UnaryCP;
+import org.apache.sysml.lops.ParameterizedBuiltin;
import org.apache.sysml.parser.Expression.DataType;
import org.apache.sysml.parser.Expression.ValueType;
import org.apache.sysml.parser.ParseInfo;
@@ -1116,7 +1117,7 @@ public abstract class Hop implements ParseInfo
INVALID, CDF, INVCDF, GROUPEDAGG, RMEMPTY, REPLACE, REXPAND,
LOWER_TRI, UPPER_TRI,
TRANSFORMAPPLY, TRANSFORMDECODE, TRANSFORMCOLMAP, TRANSFORMMETA,
- TOSTRING
+ TOSTRING, LIST,
}
public enum FileFormatTypes {
@@ -1414,18 +1415,19 @@ public abstract class Hop implements ParseInfo
protected static final HashMap<Hop.ParamBuiltinOp, org.apache.sysml.lops.ParameterizedBuiltin.OperationTypes> HopsParameterizedBuiltinLops;
static {
HopsParameterizedBuiltinLops = new HashMap<>();
- HopsParameterizedBuiltinLops.put(ParamBuiltinOp.CDF, org.apache.sysml.lops.ParameterizedBuiltin.OperationTypes.CDF);
- HopsParameterizedBuiltinLops.put(ParamBuiltinOp.INVCDF, org.apache.sysml.lops.ParameterizedBuiltin.OperationTypes.INVCDF);
- HopsParameterizedBuiltinLops.put(ParamBuiltinOp.RMEMPTY, org.apache.sysml.lops.ParameterizedBuiltin.OperationTypes.RMEMPTY);
- HopsParameterizedBuiltinLops.put(ParamBuiltinOp.REPLACE, org.apache.sysml.lops.ParameterizedBuiltin.OperationTypes.REPLACE);
- HopsParameterizedBuiltinLops.put(ParamBuiltinOp.REXPAND, org.apache.sysml.lops.ParameterizedBuiltin.OperationTypes.REXPAND);
- HopsParameterizedBuiltinLops.put(ParamBuiltinOp.LOWER_TRI, org.apache.sysml.lops.ParameterizedBuiltin.OperationTypes.LOWER_TRI);
- HopsParameterizedBuiltinLops.put(ParamBuiltinOp.UPPER_TRI, org.apache.sysml.lops.ParameterizedBuiltin.OperationTypes.UPPER_TRI);
- HopsParameterizedBuiltinLops.put(ParamBuiltinOp.TRANSFORMAPPLY, org.apache.sysml.lops.ParameterizedBuiltin.OperationTypes.TRANSFORMAPPLY);
- HopsParameterizedBuiltinLops.put(ParamBuiltinOp.TRANSFORMDECODE, org.apache.sysml.lops.ParameterizedBuiltin.OperationTypes.TRANSFORMDECODE);
- HopsParameterizedBuiltinLops.put(ParamBuiltinOp.TRANSFORMCOLMAP, org.apache.sysml.lops.ParameterizedBuiltin.OperationTypes.TRANSFORMCOLMAP);
- HopsParameterizedBuiltinLops.put(ParamBuiltinOp.TRANSFORMMETA, org.apache.sysml.lops.ParameterizedBuiltin.OperationTypes.TRANSFORMMETA);
- HopsParameterizedBuiltinLops.put(ParamBuiltinOp.TOSTRING, org.apache.sysml.lops.ParameterizedBuiltin.OperationTypes.TOSTRING);
+ HopsParameterizedBuiltinLops.put(ParamBuiltinOp.CDF, ParameterizedBuiltin.OperationTypes.CDF);
+ HopsParameterizedBuiltinLops.put(ParamBuiltinOp.INVCDF, ParameterizedBuiltin.OperationTypes.INVCDF);
+ HopsParameterizedBuiltinLops.put(ParamBuiltinOp.RMEMPTY, ParameterizedBuiltin.OperationTypes.RMEMPTY);
+ HopsParameterizedBuiltinLops.put(ParamBuiltinOp.REPLACE, ParameterizedBuiltin.OperationTypes.REPLACE);
+ HopsParameterizedBuiltinLops.put(ParamBuiltinOp.REXPAND, ParameterizedBuiltin.OperationTypes.REXPAND);
+ HopsParameterizedBuiltinLops.put(ParamBuiltinOp.LOWER_TRI, ParameterizedBuiltin.OperationTypes.LOWER_TRI);
+ HopsParameterizedBuiltinLops.put(ParamBuiltinOp.UPPER_TRI, ParameterizedBuiltin.OperationTypes.UPPER_TRI);
+ HopsParameterizedBuiltinLops.put(ParamBuiltinOp.TRANSFORMAPPLY, ParameterizedBuiltin.OperationTypes.TRANSFORMAPPLY);
+ HopsParameterizedBuiltinLops.put(ParamBuiltinOp.TRANSFORMDECODE, ParameterizedBuiltin.OperationTypes.TRANSFORMDECODE);
+ HopsParameterizedBuiltinLops.put(ParamBuiltinOp.TRANSFORMCOLMAP, ParameterizedBuiltin.OperationTypes.TRANSFORMCOLMAP);
+ HopsParameterizedBuiltinLops.put(ParamBuiltinOp.TRANSFORMMETA, ParameterizedBuiltin.OperationTypes.TRANSFORMMETA);
+ HopsParameterizedBuiltinLops.put(ParamBuiltinOp.TOSTRING, ParameterizedBuiltin.OperationTypes.TOSTRING);
+ HopsParameterizedBuiltinLops.put(ParamBuiltinOp.LIST, ParameterizedBuiltin.OperationTypes.LIST);
}
protected static final HashMap<Hop.OpOp2, String> HopsOpOp2String;
http://git-wip-us.apache.org/repos/asf/systemml/blob/f9020a16/src/main/java/org/apache/sysml/hops/ParameterizedBuiltinOp.java
----------------------------------------------------------------------
diff --git a/src/main/java/org/apache/sysml/hops/ParameterizedBuiltinOp.java b/src/main/java/org/apache/sysml/hops/ParameterizedBuiltinOp.java
index b94ff5c..e287b20 100644
--- a/src/main/java/org/apache/sysml/hops/ParameterizedBuiltinOp.java
+++ b/src/main/java/org/apache/sysml/hops/ParameterizedBuiltinOp.java
@@ -20,6 +20,7 @@
package org.apache.sysml.hops;
import java.util.HashMap;
+import java.util.LinkedHashMap;
import java.util.Map.Entry;
import org.apache.sysml.hops.Hop.MultiThreadedHop;
@@ -87,7 +88,7 @@ public class ParameterizedBuiltinOp extends Hop implements MultiThreadedHop
* @param inputParameters map of input parameters
*/
public ParameterizedBuiltinOp(String l, DataType dt, ValueType vt,
- ParamBuiltinOp op, HashMap<String, Hop> inputParameters) {
+ ParamBuiltinOp op, LinkedHashMap<String, Hop> inputParameters) {
super(l, dt, vt);
_op = op;
@@ -191,10 +192,11 @@ public class ParameterizedBuiltinOp extends Hop implements MultiThreadedHop
case TRANSFORMDECODE:
case TRANSFORMCOLMAP:
case TRANSFORMMETA:
- case TOSTRING: {
+ case TOSTRING:
+ case LIST: {
ExecType et = optFindExecType();
ParameterizedBuiltin pbilop = new ParameterizedBuiltin(inputlops,
- HopsParameterizedBuiltinLops.get(_op), getDataType(), getValueType(), et);
+ HopsParameterizedBuiltinLops.get(_op), getDataType(), getValueType(), et);
setOutputDimensions(pbilop);
setLineNumbers(pbilop);
setLops(pbilop);
@@ -1064,11 +1066,9 @@ public class ParameterizedBuiltinOp extends Hop implements MultiThreadedHop
//force CP for in-memory only transform builtins
if( (_op == ParamBuiltinOp.TRANSFORMAPPLY && REMOTE==ExecType.MR)
|| _op == ParamBuiltinOp.TRANSFORMDECODE && REMOTE==ExecType.MR
- || _op == ParamBuiltinOp.TRANSFORMCOLMAP
- || _op == ParamBuiltinOp.TRANSFORMMETA
- || _op == ParamBuiltinOp.TOSTRING
- || _op == ParamBuiltinOp.CDF
- || _op == ParamBuiltinOp.INVCDF) {
+ || _op == ParamBuiltinOp.TRANSFORMCOLMAP || _op == ParamBuiltinOp.TRANSFORMMETA
+ || _op == ParamBuiltinOp.TOSTRING || _op == ParamBuiltinOp.LIST
+ || _op == ParamBuiltinOp.CDF || _op == ParamBuiltinOp.INVCDF) {
_etype = ExecType.CP;
}
@@ -1176,6 +1176,11 @@ public class ParameterizedBuiltinOp extends Hop implements MultiThreadedHop
setDim2( 3 ); //fixed schema
break;
}
+ case LIST: {
+ setDim1( getInput().size() );
+ setDim2(1);
+ break;
+ }
default:
//do nothing
break;
http://git-wip-us.apache.org/repos/asf/systemml/blob/f9020a16/src/main/java/org/apache/sysml/hops/recompile/Recompiler.java
----------------------------------------------------------------------
diff --git a/src/main/java/org/apache/sysml/hops/recompile/Recompiler.java b/src/main/java/org/apache/sysml/hops/recompile/Recompiler.java
index 2cfeada..fe69b49 100644
--- a/src/main/java/org/apache/sysml/hops/recompile/Recompiler.java
+++ b/src/main/java/org/apache/sysml/hops/recompile/Recompiler.java
@@ -1373,7 +1373,7 @@ public class Recompiler
updatedSizeExpr = initUnknown & d.dimsKnown();
}
//update size expression for indexing according to symbol table entries
- else if( hop instanceof IndexingOp )
+ else if( hop instanceof IndexingOp && hop.getDataType()!=DataType.LIST )
{
IndexingOp iop = (IndexingOp)hop;
Hop input2 = iop.getInput().get(1); //inpRowL
http://git-wip-us.apache.org/repos/asf/systemml/blob/f9020a16/src/main/java/org/apache/sysml/hops/rewrite/HopRewriteUtils.java
----------------------------------------------------------------------
diff --git a/src/main/java/org/apache/sysml/hops/rewrite/HopRewriteUtils.java b/src/main/java/org/apache/sysml/hops/rewrite/HopRewriteUtils.java
index 3a0c3f2..6da1b7a 100644
--- a/src/main/java/org/apache/sysml/hops/rewrite/HopRewriteUtils.java
+++ b/src/main/java/org/apache/sysml/hops/rewrite/HopRewriteUtils.java
@@ -23,6 +23,7 @@ import java.util.ArrayList;
import java.util.Comparator;
import java.util.HashMap;
import java.util.HashSet;
+import java.util.LinkedHashMap;
import org.apache.commons.lang.ArrayUtils;
import org.apache.sysml.api.DMLScript;
@@ -618,7 +619,7 @@ public class HopRewriteUtils
return mmult;
}
- public static ParameterizedBuiltinOp createParameterizedBuiltinOp(Hop input, HashMap<String,Hop> args, ParamBuiltinOp op) {
+ public static ParameterizedBuiltinOp createParameterizedBuiltinOp(Hop input, LinkedHashMap<String,Hop> args, ParamBuiltinOp op) {
ParameterizedBuiltinOp pbop = new ParameterizedBuiltinOp("tmp", DataType.MATRIX, ValueType.DOUBLE, op, args);
pbop.setOutputBlocksizes(input.getRowsInBlock(), input.getColsInBlock());
copyLineNumbers(input, pbop);
http://git-wip-us.apache.org/repos/asf/systemml/blob/f9020a16/src/main/java/org/apache/sysml/hops/rewrite/RewriteAlgebraicSimplificationDynamic.java
----------------------------------------------------------------------
diff --git a/src/main/java/org/apache/sysml/hops/rewrite/RewriteAlgebraicSimplificationDynamic.java b/src/main/java/org/apache/sysml/hops/rewrite/RewriteAlgebraicSimplificationDynamic.java
index 545ffd8..81c20e0 100644
--- a/src/main/java/org/apache/sysml/hops/rewrite/RewriteAlgebraicSimplificationDynamic.java
+++ b/src/main/java/org/apache/sysml/hops/rewrite/RewriteAlgebraicSimplificationDynamic.java
@@ -21,6 +21,7 @@ package org.apache.sysml.hops.rewrite;
import java.util.ArrayList;
import java.util.HashMap;
+import java.util.LinkedHashMap;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
@@ -2542,7 +2543,7 @@ public class RewriteAlgebraicSimplificationDynamic extends HopRewriteRule
&& HopRewriteUtils.isSizeExpressionOf(hi.getInput().get(3), second, true) )
{
//setup input parameter hops
- HashMap<String,Hop> args = new HashMap<>();
+ LinkedHashMap<String,Hop> args = new LinkedHashMap<>();
args.put("target", second);
args.put("max", hi.getInput().get(4));
args.put("dir", new LiteralOp("cols"));
@@ -2563,7 +2564,7 @@ public class RewriteAlgebraicSimplificationDynamic extends HopRewriteRule
&& HopRewriteUtils.isSizeExpressionOf(hi.getInput().get(4), first, true) )
{
//setup input parameter hops
- HashMap<String,Hop> args = new HashMap<>();
+ LinkedHashMap<String,Hop> args = new LinkedHashMap<>();
args.put("target", first);
args.put("max", hi.getInput().get(3));
args.put("dir", new LiteralOp("rows"));
@@ -2572,7 +2573,7 @@ public class RewriteAlgebraicSimplificationDynamic extends HopRewriteRule
//create new hop
ParameterizedBuiltinOp pbop = HopRewriteUtils
- .createParameterizedBuiltinOp(first, args, ParamBuiltinOp.REXPAND);
+ .createParameterizedBuiltinOp(first, args, ParamBuiltinOp.REXPAND);
HopRewriteUtils.replaceChildReference(parent, hi, pbop, pos);
HopRewriteUtils.cleanupUnreferenced(hi);
hi = pbop;
http://git-wip-us.apache.org/repos/asf/systemml/blob/f9020a16/src/main/java/org/apache/sysml/hops/rewrite/RewriteAlgebraicSimplificationStatic.java
----------------------------------------------------------------------
diff --git a/src/main/java/org/apache/sysml/hops/rewrite/RewriteAlgebraicSimplificationStatic.java b/src/main/java/org/apache/sysml/hops/rewrite/RewriteAlgebraicSimplificationStatic.java
index 4eb223d..db28a18 100644
--- a/src/main/java/org/apache/sysml/hops/rewrite/RewriteAlgebraicSimplificationStatic.java
+++ b/src/main/java/org/apache/sysml/hops/rewrite/RewriteAlgebraicSimplificationStatic.java
@@ -21,6 +21,7 @@ package org.apache.sysml.hops.rewrite;
import java.util.ArrayList;
import java.util.HashMap;
+import java.util.LinkedHashMap;
import java.util.List;
import org.apache.commons.logging.Log;
@@ -1568,7 +1569,7 @@ public class RewriteAlgebraicSimplificationStatic extends HopRewriteRule
&& HopRewriteUtils.isBinaryMatrixScalar(hi.getInput().get(1).getInput().get(0), OpOp2.EQUAL, 0)
&& hi.getInput().get(1).getInput().get(0).getInput().contains(hi.getInput().get(0)) )
{
- HashMap<String, Hop> args = new HashMap<>();
+ LinkedHashMap<String, Hop> args = new LinkedHashMap<>();
args.put("target", hi.getInput().get(0));
args.put("pattern", new LiteralOp(0));
args.put("replacement", hi.getInput().get(1).getInput().get(1));
@@ -1785,7 +1786,7 @@ public class RewriteAlgebraicSimplificationStatic extends HopRewriteRule
String direction = HopRewriteUtils.isBasic1NSequence(hi.getInput().get(0)) ? "rows" : "cols";
//setup input parameter hops
- HashMap<String,Hop> inputargs = new HashMap<>();
+ LinkedHashMap<String,Hop> inputargs = new LinkedHashMap<>();
inputargs.put("target", trgt);
inputargs.put("max", HopRewriteUtils.getBasic1NSequenceMax(seq));
inputargs.put("dir", new LiteralOp(direction));
@@ -1800,7 +1801,7 @@ public class RewriteAlgebraicSimplificationStatic extends HopRewriteRule
HopRewriteUtils.replaceChildReference(parent, hi, pbop, pos);
hi = pbop;
- LOG.debug("Applied simplifyOuterSeqExpand (line "+hi.getBeginLine()+")");
+ LOG.debug("Applied simplifyOuterSeqExpand (line "+hi.getBeginLine()+")");
}
}
http://git-wip-us.apache.org/repos/asf/systemml/blob/f9020a16/src/main/java/org/apache/sysml/lops/ParameterizedBuiltin.java
----------------------------------------------------------------------
diff --git a/src/main/java/org/apache/sysml/lops/ParameterizedBuiltin.java b/src/main/java/org/apache/sysml/lops/ParameterizedBuiltin.java
index f011ba4..898d875 100644
--- a/src/main/java/org/apache/sysml/lops/ParameterizedBuiltin.java
+++ b/src/main/java/org/apache/sysml/lops/ParameterizedBuiltin.java
@@ -38,7 +38,7 @@ public class ParameterizedBuiltin extends Lop
public enum OperationTypes {
CDF, INVCDF, RMEMPTY, REPLACE, REXPAND, LOWER_TRI, UPPER_TRI,
TRANSFORMAPPLY, TRANSFORMDECODE, TRANSFORMCOLMAP, TRANSFORMMETA,
- TOSTRING
+ TOSTRING, LIST
}
private OperationTypes _operation;
@@ -215,13 +215,19 @@ public class ParameterizedBuiltin extends Lop
case TRANSFORMAPPLY:
case TRANSFORMDECODE:
case TRANSFORMCOLMAP:
- case TRANSFORMMETA: {
- sb.append(_operation.toString().toLowerCase()); //opcode
+ case TRANSFORMMETA:{
+ sb.append(_operation.name().toLowerCase()); //opcode
sb.append(OPERAND_DELIMITOR);
sb.append(compileGenericParamMap(_inputParams));
break;
- }
- case TOSTRING:{
+ }
+ case LIST: {
+ sb.append("nvlist"); //opcode
+ sb.append(OPERAND_DELIMITOR);
+ sb.append(compileGenericParamMap(_inputParams));
+ break;
+ }
+ case TOSTRING: {
sb.append("toString"); //opcode
sb.append(OPERAND_DELIMITOR);
sb.append(compileGenericParamMap(_inputParams));
@@ -232,7 +238,7 @@ public class ParameterizedBuiltin extends Lop
throw new LopsException(this.printErrorLocation() + "In ParameterizedBuiltin Lop, Unknown operation: " + _operation);
}
- if (_operation == OperationTypes.RMEMPTY) {
+ if (_operation == OperationTypes.RMEMPTY) {
sb.append("bRmEmptyBC");
sb.append(NAME_VALUE_SEPARATOR);
sb.append( _bRmEmptyBC );
http://git-wip-us.apache.org/repos/asf/systemml/blob/f9020a16/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 6e48839..0e949d0 100644
--- a/src/main/java/org/apache/sysml/parser/BuiltinFunctionExpression.java
+++ b/src/main/java/org/apache/sysml/parser/BuiltinFunctionExpression.java
@@ -1655,7 +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"))
+ else if(functionName.equals("list") //unnamed list
+ && paramExprsPassed.stream().allMatch(p -> p.getName()==null))
bifop = Expression.BuiltinFunctionOp.LIST;
else if (functionName.equals("log"))
bifop = Expression.BuiltinFunctionOp.LOG;
@@ -1682,7 +1683,7 @@ public class BuiltinFunctionExpression extends DataIdentifier
else if (functionName.equals("t"))
bifop = Expression.BuiltinFunctionOp.TRANS;
else if (functionName.equals("rev"))
- bifop = Expression.BuiltinFunctionOp.REV;
+ bifop = Expression.BuiltinFunctionOp.REV;
else if (functionName.equals("cbind") || functionName.equals("append"))
bifop = Expression.BuiltinFunctionOp.CBIND;
else if (functionName.equals("rbind"))
http://git-wip-us.apache.org/repos/asf/systemml/blob/f9020a16/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 9d83dde..73a3a34 100644
--- a/src/main/java/org/apache/sysml/parser/DMLTranslator.java
+++ b/src/main/java/org/apache/sysml/parser/DMLTranslator.java
@@ -23,6 +23,7 @@ import java.io.IOException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
+import java.util.LinkedHashMap;
import java.util.List;
import org.apache.commons.logging.Log;
@@ -1962,7 +1963,7 @@ public class DMLTranslator
}
}
- private static Hop constructDfHop(String name, DataType dt, ValueType vt, ParameterizedBuiltinFunctionOp op, HashMap<String,Hop> paramHops) {
+ private static Hop constructDfHop(String name, DataType dt, ValueType vt, ParameterizedBuiltinFunctionOp op, LinkedHashMap<String,Hop> paramHops) {
// Add a hop to paramHops to store distribution information.
// Distribution parameter hops would have been already present in paramHops.
@@ -2055,7 +2056,7 @@ public class DMLTranslator
HashMap<String, Hop> hops) {
// this expression has multiple "named" parameters
- HashMap<String, Hop> paramHops = new HashMap<>();
+ LinkedHashMap<String, Hop> paramHops = new LinkedHashMap<>();
// -- construct hops for all input parameters
// -- store them in hashmap so that their "name"s are maintained
@@ -2120,6 +2121,11 @@ public class DMLTranslator
HopRewriteUtils.createBinary(paramHops.get("target"), new LiteralOp(""), OpOp2.PLUS);
break;
+ case LIST:
+ currBuiltinOp = new ParameterizedBuiltinOp(target.getName(), target.getDataType(),
+ target.getValueType(), ParamBuiltinOp.LIST, paramHops);
+ break;
+
default:
throw new ParseException(source.printErrorLocation() +
"processParameterizedBuiltinFunctionExpression() -- Unknown operation: " + source.getOpCode());
http://git-wip-us.apache.org/repos/asf/systemml/blob/f9020a16/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 f369e19..66f08c5 100644
--- a/src/main/java/org/apache/sysml/parser/Expression.java
+++ b/src/main/java/org/apache/sysml/parser/Expression.java
@@ -159,7 +159,8 @@ public abstract class Expression implements ParseInfo
// Distribution Functions
CDF, INVCDF, PNORM, QNORM, PT, QT, PF, QF, PCHISQ, QCHISQ, PEXP, QEXP,
TRANSFORMAPPLY, TRANSFORMDECODE, TRANSFORMENCODE, TRANSFORMCOLMAP, TRANSFORMMETA,
- TOSTRING, // The "toString" method for DML; named arguments accepted to format output
+ TOSTRING, // The "toString" method for DML; named arguments accepted to format output
+ LIST, // named argument lists; unnamed lists become builtin function
INVALID
}
http://git-wip-us.apache.org/repos/asf/systemml/blob/f9020a16/src/main/java/org/apache/sysml/parser/Identifier.java
----------------------------------------------------------------------
diff --git a/src/main/java/org/apache/sysml/parser/Identifier.java b/src/main/java/org/apache/sysml/parser/Identifier.java
index ffb455b..bf36a2f 100644
--- a/src/main/java/org/apache/sysml/parser/Identifier.java
+++ b/src/main/java/org/apache/sysml/parser/Identifier.java
@@ -161,47 +161,43 @@ public abstract class Identifier extends Expression
if (indexedIdentiferOut.getRowLowerBound() != null) {
indexedIdentiferOut.getRowLowerBound().validateExpression(ids, constVars, conditional);
-
Expression tempExpr = indexedIdentiferOut.getRowLowerBound();
- if (tempExpr.getOutput().getDataType() == Expression.DataType.MATRIX){
+ if (tempExpr.getOutput().getDataType() == Expression.DataType.MATRIX){
raiseValidateError("Matrix values for row lower index bound are not supported, which includes indexed identifiers.", conditional);
}
-
}
+
if (indexedIdentiferOut.getRowUpperBound() != null) {
indexedIdentiferOut.getRowUpperBound().validateExpression(ids, constVars, conditional);
-
Expression tempExpr = indexedIdentiferOut.getRowUpperBound();
- if (tempExpr.getOutput().getDataType() == Expression.DataType.MATRIX){
+ if (tempExpr.getOutput().getDataType() == Expression.DataType.MATRIX){
raiseValidateError("Matrix values for row upper index bound are not supported, which includes indexed identifiers.", conditional);
}
-
}
- if (indexedIdentiferOut.getColLowerBound() != null) {
- indexedIdentiferOut.getColLowerBound().validateExpression(ids,constVars, conditional);
+ if (indexedIdentiferOut.getColLowerBound() != null) {
+ indexedIdentiferOut.getColLowerBound().validateExpression(ids,constVars, conditional);
Expression tempExpr = indexedIdentiferOut.getColLowerBound();
- if (tempExpr.getOutput().getDataType() == Expression.DataType.MATRIX){
+ if (tempExpr.getOutput().getDataType() == Expression.DataType.MATRIX){
raiseValidateError("Matrix values for column lower index bound are not supported, which includes indexed identifiers.", conditional);
}
-
}
+
if (indexedIdentiferOut.getColUpperBound() != null) {
indexedIdentiferOut.getColUpperBound().validateExpression(ids, constVars, conditional);
-
- Expression tempExpr = indexedIdentiferOut.getColUpperBound();
- if (tempExpr.getOutput().getDataType() == Expression.DataType.MATRIX){
+ Expression tempExpr = indexedIdentiferOut.getColUpperBound();
+ if (tempExpr.getOutput().getDataType() == Expression.DataType.MATRIX){
raiseValidateError("Matrix values for column upper index bound are not supported, which includes indexed identifiers.", conditional);
}
-
}
- IndexPair updatedIndices = ((IndexedIdentifier)this.getOutput()).calculateIndexedDimensions(ids, constVars, conditional);
- ((IndexedIdentifier)this.getOutput()).setDimensions(updatedIndices._row, updatedIndices._col);
-
+ if( this.getOutput().getDataType() != DataType.LIST ) {
+ IndexPair updatedIndices = ((IndexedIdentifier)this.getOutput()).calculateIndexedDimensions(ids, constVars, conditional);
+ ((IndexedIdentifier)this.getOutput()).setDimensions(updatedIndices._row, updatedIndices._col);
+ }
}
-
- } else {
+ }
+ else {
this.getOutput().setProperties(this.getOutput());
}
}
http://git-wip-us.apache.org/repos/asf/systemml/blob/f9020a16/src/main/java/org/apache/sysml/parser/ParameterizedBuiltinFunctionExpression.java
----------------------------------------------------------------------
diff --git a/src/main/java/org/apache/sysml/parser/ParameterizedBuiltinFunctionExpression.java b/src/main/java/org/apache/sysml/parser/ParameterizedBuiltinFunctionExpression.java
index 6f9d6f7..ffc8bc6 100644
--- a/src/main/java/org/apache/sysml/parser/ParameterizedBuiltinFunctionExpression.java
+++ b/src/main/java/org/apache/sysml/parser/ParameterizedBuiltinFunctionExpression.java
@@ -23,6 +23,7 @@ import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashMap;
import java.util.HashSet;
+import java.util.LinkedHashMap;
import java.util.Set;
import java.util.stream.Collectors;
@@ -35,9 +36,10 @@ import org.apache.wink.json4j.JSONObject;
public class ParameterizedBuiltinFunctionExpression extends DataIdentifier
{
-
+ //note: we use a linked hashmap to preserve the order of
+ //parameters if needed, such as for named lists
private ParameterizedBuiltinFunctionOp _opcode;
- private HashMap<String,Expression> _varParams;
+ private LinkedHashMap<String,Expression> _varParams;
public static final String TF_FN_PARAM_DATA = "target";
public static final String TF_FN_PARAM_MTD2 = "meta";
@@ -79,6 +81,7 @@ public class ParameterizedBuiltinFunctionExpression extends DataIdentifier
// toString
opcodeMap.put("toString", Expression.ParameterizedBuiltinFunctionOp.TOSTRING);
+ opcodeMap.put("list", Expression.ParameterizedBuiltinFunctionOp.LIST);
}
public static HashMap<Expression.ParameterizedBuiltinFunctionOp, ParamBuiltinOp> pbHopMap;
@@ -123,17 +126,17 @@ public class ParameterizedBuiltinFunctionExpression extends DataIdentifier
if ( pbifop == null )
return null;
- HashMap<String,Expression> varParams = new HashMap<>();
+ LinkedHashMap<String,Expression> varParams = new LinkedHashMap<>();
for (ParameterExpression pexpr : paramExprsPassed)
varParams.put(pexpr.getName(), pexpr.getExpr());
- ParameterizedBuiltinFunctionExpression retVal = new ParameterizedBuiltinFunctionExpression(ctx, pbifop,
- varParams, fileName);
+ ParameterizedBuiltinFunctionExpression retVal =
+ new ParameterizedBuiltinFunctionExpression(ctx, pbifop,varParams, fileName);
return retVal;
}
- public ParameterizedBuiltinFunctionExpression(ParserRuleContext ctx, ParameterizedBuiltinFunctionOp op, HashMap<String,Expression> varParams,
+ public ParameterizedBuiltinFunctionExpression(ParserRuleContext ctx, ParameterizedBuiltinFunctionOp op, LinkedHashMap<String,Expression> varParams,
String filename) {
_opcode = op;
_varParams = varParams;
@@ -141,7 +144,7 @@ public class ParameterizedBuiltinFunctionExpression extends DataIdentifier
}
public ParameterizedBuiltinFunctionExpression(ParameterizedBuiltinFunctionOp op,
- HashMap<String, Expression> varParams, ParseInfo parseInfo) {
+ LinkedHashMap<String, Expression> varParams, ParseInfo parseInfo) {
_opcode = op;
_varParams = varParams;
setParseInfo(parseInfo);
@@ -149,7 +152,7 @@ public class ParameterizedBuiltinFunctionExpression extends DataIdentifier
@Override
public Expression rewriteExpression(String prefix) {
- HashMap<String,Expression> newVarParams = new HashMap<>();
+ LinkedHashMap<String,Expression> newVarParams = new LinkedHashMap<>();
for (String key : _varParams.keySet()){
Expression newExpr = _varParams.get(key).rewriteExpression(prefix);
newVarParams.put(key, newExpr);
@@ -258,7 +261,11 @@ public class ParameterizedBuiltinFunctionExpression extends DataIdentifier
case TOSTRING:
validateCastAsString(output, conditional);
break;
-
+
+ case LIST:
+ validateNamedList(output, conditional);
+ break;
+
default: //always unconditional (because unsupported operation)
//handle common issue of transformencode
if( getOpCode()==ParameterizedBuiltinFunctionOp.TRANSFORMENCODE )
@@ -761,6 +768,16 @@ public class ParameterizedBuiltinFunctionExpression extends DataIdentifier
output.setValueType(ValueType.STRING);
output.setDimensions(0, 0);
}
+
+ private void validateNamedList(DataIdentifier output, boolean conditional) {
+ HashMap<String, Expression> varParams = getVarParams();
+
+ // set output characteristics
+ output.setDataType(DataType.LIST);
+ output.setValueType(ValueType.UNKNOWN);
+ output.setDimensions(varParams.size(), 1);
+ output.setBlockDimensions(-1, -1);
+ }
private void checkDataType( String fname, String pname, DataType dt, boolean conditional ) {
Expression data = getVarParam(pname);
http://git-wip-us.apache.org/repos/asf/systemml/blob/f9020a16/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 9e81f08..16db227 100644
--- a/src/main/java/org/apache/sysml/runtime/instructions/CPInstructionParser.java
+++ b/src/main/java/org/apache/sysml/runtime/instructions/CPInstructionParser.java
@@ -186,6 +186,7 @@ public class CPInstructionParser extends InstructionParser
String2CPInstructionType.put( "list", CPType.BuiltinNary);
// Parameterized Builtin Functions
+ String2CPInstructionType.put( "nvlist", CPType.ParameterizedBuiltin);
String2CPInstructionType.put( "cdf", CPType.ParameterizedBuiltin);
String2CPInstructionType.put( "invcdf", CPType.ParameterizedBuiltin);
String2CPInstructionType.put( "groupedagg", CPType.ParameterizedBuiltin);
http://git-wip-us.apache.org/repos/asf/systemml/blob/f9020a16/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
index 59b2d48..4890439 100644
--- a/src/main/java/org/apache/sysml/runtime/instructions/cp/ListIndexingCPInstruction.java
+++ b/src/main/java/org/apache/sysml/runtime/instructions/cp/ListIndexingCPInstruction.java
@@ -21,9 +21,9 @@ package org.apache.sysml.runtime.instructions.cp;
import org.apache.sysml.lops.LeftIndex;
import org.apache.sysml.lops.RightIndex;
+import org.apache.sysml.parser.Expression.ValueType;
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 {
@@ -40,15 +40,22 @@ public final class ListIndexingCPInstruction extends IndexingCPInstruction {
@Override
public void processInstruction(ExecutionContext ec) {
String opcode = getOpcode();
- IndexRange ixrange = getIndexRange(ec);
+ ScalarObject rl = ec.getScalarInput(rowLower.getName(), rowLower.getValueType(), rowLower.isLiteral());
+ ScalarObject ru = ec.getScalarInput(rowUpper.getName(), rowUpper.getValueType(), rowUpper.isLiteral());
//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));
+ if( rl.getValueType()==ValueType.STRING || ru.getValueType()==ValueType.STRING ) {
+ ec.setVariable(output.getName(),
+ list.slice(rl.getStringValue(), ru.getStringValue()));
+ }
+ else {
+ ec.setVariable(output.getName(),
+ list.slice((int)rl.getLongValue()-1, (int)ru.getLongValue()-1));
+ }
}
//left indexing
else if ( opcode.equalsIgnoreCase(LeftIndex.OPCODE)) {
http://git-wip-us.apache.org/repos/asf/systemml/blob/f9020a16/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
index f773847..0fdb1e8 100644
--- a/src/main/java/org/apache/sysml/runtime/instructions/cp/ListObject.java
+++ b/src/main/java/org/apache/sysml/runtime/instructions/cp/ListObject.java
@@ -72,17 +72,36 @@ public class ListObject extends Data
public Data slice(String name) {
//check for existing named list
if( _names == null )
- throw new DMLRuntimeException("Invalid lookup by name in unnamed list.");
+ throw new DMLRuntimeException("Invalid lookup by name"
+ + " in unnamed list: "+name+".");
//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+"'");
+ throw new DMLRuntimeException("List lookup returned no entry for name='"+name+"'");
//return existing entry
return slice(pos);
}
+ public ListObject slice(String name1, String name2) {
+ //check for existing named list
+ if( _names == null )
+ throw new DMLRuntimeException("Invalid lookup by name"
+ + " in unnamed list: "+name1+", "+name2+".");
+
+ //find position and check for existing entry
+ int pos1 = _names.indexOf(name1);
+ int pos2 = _names.indexOf(name2);
+ if( pos1 <= 0 || pos1 >= _data.size() )
+ throw new DMLRuntimeException("List lookup returned no entry for name='"+name1+"'");
+ if( pos2 <= 0 || pos2 >= _data.size() )
+ throw new DMLRuntimeException("List lookup returned no entry for name='"+name2+"'");
+
+ //return list object
+ return slice(pos1, pos2);
+ }
+
@Override
public String getDebugName() {
return toString();
http://git-wip-us.apache.org/repos/asf/systemml/blob/f9020a16/src/main/java/org/apache/sysml/runtime/instructions/cp/ParameterizedBuiltinCPInstruction.java
----------------------------------------------------------------------
diff --git a/src/main/java/org/apache/sysml/runtime/instructions/cp/ParameterizedBuiltinCPInstruction.java b/src/main/java/org/apache/sysml/runtime/instructions/cp/ParameterizedBuiltinCPInstruction.java
index 06aeef3..8fac54c 100644
--- a/src/main/java/org/apache/sysml/runtime/instructions/cp/ParameterizedBuiltinCPInstruction.java
+++ b/src/main/java/org/apache/sysml/runtime/instructions/cp/ParameterizedBuiltinCPInstruction.java
@@ -19,8 +19,12 @@
package org.apache.sysml.runtime.instructions.cp;
+import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashMap;
+import java.util.LinkedHashMap;
+import java.util.List;
+import java.util.stream.Collectors;
import org.apache.sysml.lops.Lop;
import org.apache.sysml.parser.ParameterizedBuiltinFunctionExpression;
@@ -55,9 +59,9 @@ public class ParameterizedBuiltinCPInstruction extends ComputationCPInstruction
private static final String TOSTRING_SEPARATOR = " ";
private static final String TOSTRING_LINESEPARATOR = "\n";
- protected final HashMap<String, String> params;
+ protected final LinkedHashMap<String, String> params;
- protected ParameterizedBuiltinCPInstruction(Operator op, HashMap<String, String> paramsMap, CPOperand out,
+ protected ParameterizedBuiltinCPInstruction(Operator op, LinkedHashMap<String, String> paramsMap, CPOperand out,
String opcode, String istr) {
super(CPType.ParameterizedBuiltin, op, null, null, out, opcode, istr);
params = paramsMap;
@@ -71,9 +75,9 @@ public class ParameterizedBuiltinCPInstruction extends ComputationCPInstruction
return getParameterMap().get(key);
}
- public static HashMap<String, String> constructParameterMap(String[] params) {
+ public static LinkedHashMap<String, String> constructParameterMap(String[] params) {
// process all elements in "params" except first(opcode) and last(output)
- HashMap<String,String> paramMap = new HashMap<>();
+ LinkedHashMap<String,String> paramMap = new LinkedHashMap<>();
// all parameters are of form <name=value>
String[] parts;
@@ -93,7 +97,7 @@ public class ParameterizedBuiltinCPInstruction extends ComputationCPInstruction
CPOperand out = new CPOperand( parts[parts.length-1] );
// process remaining parts and build a hash map
- HashMap<String,String> paramsMap = constructParameterMap(parts);
+ LinkedHashMap<String,String> paramsMap = constructParameterMap(parts);
// determine the appropriate value function
ValueFunction func = null;
@@ -136,11 +140,9 @@ public class ParameterizedBuiltinCPInstruction extends ComputationCPInstruction
else if ( opcode.equals("transformapply")
|| opcode.equals("transformdecode")
|| opcode.equals("transformcolmap")
- || opcode.equals("transformmeta"))
- {
- return new ParameterizedBuiltinCPInstruction(null, paramsMap, out, opcode, str);
- }
- else if ( opcode.equals("toString"))
+ || opcode.equals("transformmeta")
+ || opcode.equals("toString")
+ || opcode.equals("nvlist") )
{
return new ParameterizedBuiltinCPInstruction(null, paramsMap, out, opcode, str);
}
@@ -337,6 +339,20 @@ public class ParameterizedBuiltinCPInstruction extends ComputationCPInstruction
ec.releaseCacheableData(getParam("target"));
ec.setScalarOutput(output.getName(), new StringObject(out));
}
+ else if( opcode.equals("nvlist") ) {
+ //obtain all input data objects and names in insertion order
+ List<Data> data = params.values().stream().map(d -> ec.containsVariable(d) ?
+ ec.getVariable(d) : new StringObject(d)).collect(Collectors.toList());
+ List<String> names = new ArrayList<>(params.keySet());
+
+ //create list object over all inputs
+ ListObject list = new ListObject(data, names);
+
+ //disable cleanup of individual objects and store cleanup state
+ list.setStatus(ec.pinVariables(new ArrayList<>(params.values())));
+
+ ec.setVariable(output.getName(), list);
+ }
else {
throw new DMLRuntimeException("Unknown opcode : " + opcode);
}
http://git-wip-us.apache.org/repos/asf/systemml/blob/f9020a16/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 d2ca6f5..6acef43 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
@@ -94,7 +94,7 @@ public class ScalarBuiltinNaryCPInstruction extends BuiltinNaryCPInstruction {
//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);
http://git-wip-us.apache.org/repos/asf/systemml/blob/f9020a16/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
index b831032..a282b09 100644
--- 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
@@ -55,15 +55,15 @@ public class ListAndStructTest extends AutomatedTestBase
runListStructTest(TEST_NAME1, true);
}
-// @Test
-// public void testListNamed() {
-// runListStructTest(TEST_NAME2, false);
-// }
-//
-// @Test
-// public void testListNamedRewrites() {
-// runListStructTest(TEST_NAME2, true);
-// }
+ @Test
+ public void testListNamed() {
+ runListStructTest(TEST_NAME2, false);
+ }
+
+ @Test
+ public void testListNamedRewrites() {
+ runListStructTest(TEST_NAME2, true);
+ }
private void runListStructTest(String testname, boolean rewrites)
{
http://git-wip-us.apache.org/repos/asf/systemml/blob/f9020a16/src/test/scripts/functions/misc/ListNamed.R
----------------------------------------------------------------------
diff --git a/src/test/scripts/functions/misc/ListNamed.R b/src/test/scripts/functions/misc/ListNamed.R
new file mode 100644
index 0000000..abf01be
--- /dev/null
+++ b/src/test/scripts/functions/misc/ListNamed.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=A, b=B, c=c, d=D, e=matrix(5, 3, 3), f=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[['e']])));
+
+writeMM(as(R, "CsparseMatrix"), paste(args[1], "R", sep=""));
http://git-wip-us.apache.org/repos/asf/systemml/blob/f9020a16/src/test/scripts/functions/misc/ListNamed.dml
----------------------------------------------------------------------
diff --git a/src/test/scripts/functions/misc/ListNamed.dml b/src/test/scripts/functions/misc/ListNamed.dml
new file mode 100644
index 0000000..5b9b4e8
--- /dev/null
+++ b/src/test/scripts/functions/misc/ListNamed.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=A, b=B, c=c, d=D, e=matrix(5, 3, 3), f=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['e'])));
+
+write(R, $1);