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);