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 2017/11/07 20:27:20 UTC

[3/3] systemml git commit: [SYSTEMML-1988] Fix cloning of prepared scripts, rework CP runtime

[SYSTEMML-1988] Fix cloning of prepared scripts, rework CP runtime

This patch fixes the shallow cloning of prepared scripts by (1) better
handling of external functions (which require a deep copy), and (2) a
complete rework of our CP runtime instructions and operators to make
them read-only in order to avoid side effects. As a positive side effect
of this rework, the runtime is now much easier to debug as side effects
are impossible due to final members of all instructions and operators.


Project: http://git-wip-us.apache.org/repos/asf/systemml/repo
Commit: http://git-wip-us.apache.org/repos/asf/systemml/commit/75b93f26
Tree: http://git-wip-us.apache.org/repos/asf/systemml/tree/75b93f26
Diff: http://git-wip-us.apache.org/repos/asf/systemml/diff/75b93f26

Branch: refs/heads/master
Commit: 75b93f261efc7fe9ec415b5e4f6156c30fe51570
Parents: c1ed791
Author: Matthias Boehm <mb...@gmail.com>
Authored: Tue Nov 7 01:39:34 2017 -0800
Committer: Matthias Boehm <mb...@gmail.com>
Committed: Tue Nov 7 12:26:09 2017 -0800

----------------------------------------------------------------------
 .../apache/sysml/api/jmlc/PreparedScript.java   |   2 +-
 .../hops/cost/CostEstimatorStaticRuntime.java   |   4 +-
 .../java/org/apache/sysml/lops/compile/Dag.java |   8 +-
 .../runtime/controlprogram/ForProgramBlock.java |   6 +-
 .../sysml/runtime/controlprogram/Program.java   |  45 ++-
 .../instructions/CPInstructionParser.java       | 344 +++++++++----------
 .../sysml/runtime/instructions/Instruction.java |  16 +-
 .../runtime/instructions/InstructionParser.java |   4 +-
 .../runtime/instructions/InstructionUtils.java  |  62 ++--
 .../runtime/instructions/MRJobInstruction.java  |   2 +-
 .../cp/AggregateBinaryCPInstruction.java        |   6 +-
 .../cp/AggregateTernaryCPInstruction.java       |   3 +-
 .../cp/AggregateUnaryCPInstruction.java         |   9 +-
 .../instructions/cp/AppendCPInstruction.java    |   6 +-
 .../cp/ArithmeticBinaryCPInstruction.java       |   3 +-
 .../instructions/cp/BinaryCPInstruction.java    |   8 +-
 .../cp/BooleanBinaryCPInstruction.java          |   3 +-
 .../cp/BooleanUnaryCPInstruction.java           |   3 +-
 .../instructions/cp/BreakPointInstruction.java  |   4 +-
 .../cp/BuiltinBinaryCPInstruction.java          |  11 +-
 .../runtime/instructions/cp/BuiltinNary.java    |  74 ----
 .../cp/BuiltinNaryCPInstruction.java            |  73 ++++
 .../cp/BuiltinUnaryCPInstruction.java           |  12 +-
 .../runtime/instructions/cp/CPInstruction.java  |  29 +-
 .../runtime/instructions/cp/CPOperand.java      |  19 -
 .../cp/CentralMomentCPInstruction.java          |   7 +-
 .../cp/CompressionCPInstruction.java            |   4 +-
 .../cp/ComputationCPInstruction.java            |  12 +-
 .../cp/ConvolutionCPInstruction.java            |  79 ++---
 .../cp/CovarianceCPInstruction.java             |   6 +-
 .../instructions/cp/DataGenCPInstruction.java   | 104 ++----
 .../cp/DataPartitionCPInstruction.java          |   9 +-
 .../cp/FunctionCallCPInstruction.java           |  29 +-
 .../instructions/cp/IndexingCPInstruction.java  |   6 +-
 .../instructions/cp/MMChainCPInstruction.java   |   9 +-
 .../instructions/cp/MMTSJCPInstruction.java     |   7 +-
 .../cp/MatrixBuiltinCPInstruction.java          |   4 +-
 .../cp/MatrixBuiltinNaryCPInstruction.java      |   2 +-
 .../cp/MatrixMatrixBuiltinCPInstruction.java    |   2 +-
 .../cp/MatrixReshapeCPInstruction.java          |  10 +-
 .../cp/MatrixScalarBuiltinCPInstruction.java    |   4 +-
 .../cp/MultiReturnBuiltinCPInstruction.java     |  11 +-
 ...ReturnParameterizedBuiltinCPInstruction.java |   5 +-
 .../instructions/cp/PMMJCPInstruction.java      |   4 +-
 .../cp/ParameterizedBuiltinCPInstruction.java   |  10 +-
 .../instructions/cp/PlusMultCPInstruction.java  |   6 +-
 .../cp/QuantilePickCPInstruction.java           |   7 +-
 .../cp/QuantileSortCPInstruction.java           |   3 +-
 .../cp/QuaternaryCPInstruction.java             |   7 +-
 .../cp/RelationalBinaryCPInstruction.java       |   3 +-
 .../instructions/cp/ReorgCPInstruction.java     |  21 +-
 .../cp/ScalarBuiltinCPInstruction.java          |   2 +-
 .../cp/ScalarBuiltinNaryCPInstruction.java      |   2 +-
 .../cp/ScalarMatrixArithmeticCPInstruction.java |   2 +-
 .../cp/ScalarMatrixRelationalCPInstruction.java |   2 +-
 .../cp/ScalarScalarBuiltinCPInstruction.java    |   2 +-
 .../instructions/cp/SpoofCPInstruction.java     |   2 +-
 .../cp/StringInitCPInstruction.java             |   8 +-
 .../instructions/cp/TernaryCPInstruction.java   |  14 +-
 .../cp/UaggOuterChainCPInstruction.java         |  11 +-
 .../instructions/cp/UnaryCPInstruction.java     |  12 +-
 .../instructions/cp/VariableCPInstruction.java  |  79 ++---
 .../instructions/gpu/GPUInstruction.java        |   2 +-
 .../ScalarMatrixArithmeticGPUInstruction.java   |   2 +-
 ...larMatrixRelationalBinaryGPUInstruction.java |   2 +-
 .../runtime/instructions/mr/MRInstruction.java  |   2 +-
 .../instructions/mr/ScalarInstruction.java      |   3 -
 .../instructions/spark/BinarySPInstruction.java |   2 +-
 .../instructions/spark/SPInstruction.java       |   2 +-
 .../operators/AggregateBinaryOperator.java      |  21 +-
 .../matrix/operators/AggregateOperator.java     |  31 +-
 .../operators/AggregateTernaryOperator.java     |  16 +-
 .../operators/AggregateUnaryOperator.java       |  27 +-
 .../matrix/operators/BinaryOperator.java        |  14 +-
 .../runtime/matrix/operators/CMOperator.java    |   9 +-
 .../runtime/matrix/operators/COVOperator.java   |  10 +-
 .../matrix/operators/LeftScalarOperator.java    |  18 +-
 .../runtime/matrix/operators/Operator.java      |  11 +-
 .../matrix/operators/QuaternaryOperator.java    |  54 +--
 .../matrix/operators/ReIndexOperator.java       |   6 +-
 .../runtime/matrix/operators/ReorgOperator.java |  10 +-
 .../matrix/operators/RightScalarOperator.java   |  21 +-
 .../matrix/operators/ScalarOperator.java        |  29 +-
 .../matrix/operators/SimpleOperator.java        |   3 +-
 .../runtime/matrix/operators/UnaryOperator.java |  27 +-
 .../matrix/operators/ZeroOutOperator.java       |   6 +-
 .../codegen/CPlanVectorPrimitivesTest.java      |   4 +-
 .../compress/LargeParUnaryAggregateTest.java    |  26 +-
 .../compress/ParUnaryAggregateTest.java         |  26 +-
 .../jmlc/JMLCClonedPreparedScriptTest.java      |  57 ++-
 90 files changed, 775 insertions(+), 929 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/systemml/blob/75b93f26/src/main/java/org/apache/sysml/api/jmlc/PreparedScript.java
----------------------------------------------------------------------
diff --git a/src/main/java/org/apache/sysml/api/jmlc/PreparedScript.java b/src/main/java/org/apache/sysml/api/jmlc/PreparedScript.java
index c23ef92..3dc0db7 100644
--- a/src/main/java/org/apache/sysml/api/jmlc/PreparedScript.java
+++ b/src/main/java/org/apache/sysml/api/jmlc/PreparedScript.java
@@ -80,7 +80,7 @@ public class PreparedScript
 	private PreparedScript(PreparedScript that) {
 		//shallow copy, except for a separate symbol table
 		//and related meta data of reused inputs
-		_prog = that._prog;
+		_prog = that._prog.clone(false);
 		_vars = new LocalVariableMap();
 		for(Entry<String, Data> e : that._vars.entrySet())
 			_vars.put(e.getKey(), e.getValue());

http://git-wip-us.apache.org/repos/asf/systemml/blob/75b93f26/src/main/java/org/apache/sysml/hops/cost/CostEstimatorStaticRuntime.java
----------------------------------------------------------------------
diff --git a/src/main/java/org/apache/sysml/hops/cost/CostEstimatorStaticRuntime.java b/src/main/java/org/apache/sysml/hops/cost/CostEstimatorStaticRuntime.java
index f3ce99d..33df1d1 100644
--- a/src/main/java/org/apache/sysml/hops/cost/CostEstimatorStaticRuntime.java
+++ b/src/main/java/org/apache/sysml/hops/cost/CostEstimatorStaticRuntime.java
@@ -41,7 +41,7 @@ import org.apache.sysml.runtime.instructions.InstructionUtils;
 import org.apache.sysml.runtime.instructions.MRInstructionParser;
 import org.apache.sysml.runtime.instructions.MRJobInstruction;
 import org.apache.sysml.runtime.instructions.cp.CPInstruction;
-import org.apache.sysml.runtime.instructions.cp.CPInstruction.CPINSTRUCTION_TYPE;
+import org.apache.sysml.runtime.instructions.cp.CPInstruction.CPType;
 import org.apache.sysml.runtime.instructions.cp.FunctionCallCPInstruction;
 import org.apache.sysml.runtime.instructions.cp.VariableCPInstruction;
 import org.apache.sysml.runtime.instructions.mr.BinaryMRInstructionBase;
@@ -789,7 +789,7 @@ public class CostEstimatorStaticRuntime extends CostEstimator
 		
 		//NOTE: all instruction types that are equivalent in CP and MR are only
 		//included in CP to prevent redundancy
-		CPINSTRUCTION_TYPE cptype = CPInstructionParser.String2CPInstructionType.get(optype);
+		CPType cptype = CPInstructionParser.String2CPInstructionType.get(optype);
 		if( cptype != null ) //for CP Ops and equivalent MR ops 
 		{
 			//general approach: count of floating point *, /, +, -, ^, builtin ;

http://git-wip-us.apache.org/repos/asf/systemml/blob/75b93f26/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 4edf230..9306a24 100644
--- a/src/main/java/org/apache/sysml/lops/compile/Dag.java
+++ b/src/main/java/org/apache/sysml/lops/compile/Dag.java
@@ -67,12 +67,12 @@ import org.apache.sysml.runtime.controlprogram.parfor.ProgramConverter;
 import org.apache.sysml.runtime.controlprogram.parfor.util.IDSequence;
 import org.apache.sysml.runtime.instructions.CPInstructionParser;
 import org.apache.sysml.runtime.instructions.Instruction;
-import org.apache.sysml.runtime.instructions.Instruction.INSTRUCTION_TYPE;
+import org.apache.sysml.runtime.instructions.Instruction.IType;
 import org.apache.sysml.runtime.instructions.InstructionParser;
 import org.apache.sysml.runtime.instructions.MRJobInstruction;
 import org.apache.sysml.runtime.instructions.SPInstructionParser;
 import org.apache.sysml.runtime.instructions.cp.CPInstruction;
-import org.apache.sysml.runtime.instructions.cp.CPInstruction.CPINSTRUCTION_TYPE;
+import org.apache.sysml.runtime.instructions.cp.CPInstruction.CPType;
 import org.apache.sysml.runtime.instructions.cp.VariableCPInstruction;
 import org.apache.sysml.runtime.matrix.MatrixCharacteristics;
 import org.apache.sysml.runtime.matrix.data.InputInfo;
@@ -1240,8 +1240,8 @@ public class Dag<N extends Lop>
 	private static void excludeRemoveInstruction(String varName, ArrayList<Instruction> deleteInst) {
 		for(int i=0; i < deleteInst.size(); i++) {
 			Instruction inst = deleteInst.get(i);
-			if ((inst.getType() == INSTRUCTION_TYPE.CONTROL_PROGRAM  || inst.getType() == INSTRUCTION_TYPE.SPARK)
-					&& ((CPInstruction)inst).getCPInstructionType() == CPINSTRUCTION_TYPE.Variable 
+			if ((inst.getType() == IType.CONTROL_PROGRAM  || inst.getType() == IType.SPARK)
+					&& ((CPInstruction)inst).getCPInstructionType() == CPType.Variable 
 					&& ((VariableCPInstruction)inst).isRemoveVariable(varName) ) {
 				deleteInst.remove(i);
 			}

http://git-wip-us.apache.org/repos/asf/systemml/blob/75b93f26/src/main/java/org/apache/sysml/runtime/controlprogram/ForProgramBlock.java
----------------------------------------------------------------------
diff --git a/src/main/java/org/apache/sysml/runtime/controlprogram/ForProgramBlock.java b/src/main/java/org/apache/sysml/runtime/controlprogram/ForProgramBlock.java
index 29dfdfd..ec7a16f 100644
--- a/src/main/java/org/apache/sysml/runtime/controlprogram/ForProgramBlock.java
+++ b/src/main/java/org/apache/sysml/runtime/controlprogram/ForProgramBlock.java
@@ -42,7 +42,7 @@ public class ForProgramBlock extends ProgramBlock
 	protected ArrayList<Instruction> _incrementInstructions;
 	protected ArrayList <Instruction> _exitInstructions;
 	protected ArrayList<ProgramBlock> _childBlocks;
-	protected String _iterPredVar; 
+	protected final String _iterPredVar; 
 	
 	public ForProgramBlock(Program prog, String iterPredVar) {
 		super(prog);
@@ -99,10 +99,6 @@ public class ForProgramBlock extends ProgramBlock
 		return _iterPredVar;
 	}
 	
-	public void setIterVar(String iterPredVar) {
-		_iterPredVar = iterPredVar;
-	}
-	
 	@Override	
 	public void execute(ExecutionContext ec) 
 		throws DMLRuntimeException

http://git-wip-us.apache.org/repos/asf/systemml/blob/75b93f26/src/main/java/org/apache/sysml/runtime/controlprogram/Program.java
----------------------------------------------------------------------
diff --git a/src/main/java/org/apache/sysml/runtime/controlprogram/Program.java b/src/main/java/org/apache/sysml/runtime/controlprogram/Program.java
index 3867659..9dd4b9c 100644
--- a/src/main/java/org/apache/sysml/runtime/controlprogram/Program.java
+++ b/src/main/java/org/apache/sysml/runtime/controlprogram/Program.java
@@ -23,28 +23,27 @@ import java.util.ArrayList;
 import java.util.HashMap;
 import java.util.Map.Entry;
 
+import org.apache.commons.lang.NotImplementedException;
 import org.apache.sysml.parser.DMLProgram;
 import org.apache.sysml.runtime.DMLRuntimeException;
 import org.apache.sysml.runtime.DMLScriptException;
 import org.apache.sysml.runtime.controlprogram.context.ExecutionContext;
 
-
 public class Program 
 {
-	
 	public static final String KEY_DELIM = "::";
 	
 	public ArrayList<ProgramBlock> _programBlocks;
 
 	private HashMap<String, HashMap<String,FunctionProgramBlock>> _namespaceFunctions;
 	
-	public Program() throws DMLRuntimeException {
-		_namespaceFunctions = new HashMap<>(); 
+	public Program() {
+		_namespaceFunctions = new HashMap<>();
 		_programBlocks = new ArrayList<>();
 	}
 
 	public synchronized void addFunctionProgramBlock(String namespace, String fname, FunctionProgramBlock fpb)
-	{	
+	{
 		if (namespace == null) 
 			namespace = DMLProgram.DEFAULT_NAMESPACE;
 		
@@ -128,4 +127,40 @@ public class Program
 		
 		ec.clearDebugProgramCounters();
 	}
+
+	public Program clone(boolean deep) {
+		if( deep )
+			throw new NotImplementedException();
+		Program ret = new Program();
+		//shallow copy of all program blocks
+		ret._programBlocks.addAll(_programBlocks);
+		//shallow copy of all functions, except external 
+		//functions, which require a deep copy
+		for( Entry<String, HashMap<String, FunctionProgramBlock>> e1 : _namespaceFunctions.entrySet() )
+			for( Entry<String, FunctionProgramBlock> e2 : e1.getValue().entrySet() ) {
+				FunctionProgramBlock fpb = e2.getValue();
+				if( fpb instanceof ExternalFunctionProgramBlock )
+					fpb = createPartialDeepCopy(ret, (ExternalFunctionProgramBlock) fpb);
+				ret.addFunctionProgramBlock(e1.getKey(), e2.getKey(), fpb);
+			}
+		return ret;
+	}
+	
+	@Override
+	public Object clone() {
+		return clone(true);
+	}
+	
+	private static ExternalFunctionProgramBlock createPartialDeepCopy(Program prog, ExternalFunctionProgramBlock efpb) {
+		try {
+			return ( efpb instanceof ExternalFunctionProgramBlockCP ) ?
+				new ExternalFunctionProgramBlockCP(prog, efpb._inputParams, 
+					efpb._outputParams, efpb._otherParams, efpb._baseDir) :
+				new ExternalFunctionProgramBlock(prog, efpb._inputParams,
+					efpb._outputParams, efpb._otherParams, efpb._baseDir);
+		}
+		catch(DMLRuntimeException ex) {
+			throw new RuntimeException(ex);
+		}
+	}
 }

http://git-wip-us.apache.org/repos/asf/systemml/blob/75b93f26/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 97e1bcd..edd1136 100644
--- a/src/main/java/org/apache/sysml/runtime/instructions/CPInstructionParser.java
+++ b/src/main/java/org/apache/sysml/runtime/instructions/CPInstructionParser.java
@@ -37,10 +37,10 @@ import org.apache.sysml.runtime.instructions.cp.ArithmeticBinaryCPInstruction;
 import org.apache.sysml.runtime.instructions.cp.BooleanBinaryCPInstruction;
 import org.apache.sysml.runtime.instructions.cp.BooleanUnaryCPInstruction;
 import org.apache.sysml.runtime.instructions.cp.BuiltinBinaryCPInstruction;
-import org.apache.sysml.runtime.instructions.cp.BuiltinNary;
+import org.apache.sysml.runtime.instructions.cp.BuiltinNaryCPInstruction;
 import org.apache.sysml.runtime.instructions.cp.BuiltinUnaryCPInstruction;
 import org.apache.sysml.runtime.instructions.cp.CPInstruction;
-import org.apache.sysml.runtime.instructions.cp.CPInstruction.CPINSTRUCTION_TYPE;
+import org.apache.sysml.runtime.instructions.cp.CPInstruction.CPType;
 import org.apache.sysml.runtime.instructions.cp.CentralMomentCPInstruction;
 import org.apache.sysml.runtime.instructions.cp.CompressionCPInstruction;
 import org.apache.sysml.runtime.instructions.cp.ConvolutionCPInstruction;
@@ -73,218 +73,218 @@ import org.apache.sysml.runtime.instructions.cpfile.ParameterizedBuiltinCPFileIn
 public class CPInstructionParser extends InstructionParser 
 {
 	
-	public static final HashMap<String, CPINSTRUCTION_TYPE> String2CPInstructionType;
-	public static final HashMap<String, CPINSTRUCTION_TYPE> String2CPFileInstructionType;
+	public static final HashMap<String, CPType> String2CPInstructionType;
+	public static final HashMap<String, CPType> String2CPFileInstructionType;
 	
 	static {
 		String2CPInstructionType = new HashMap<>();
-		String2CPInstructionType.put( "ba+*"   	, CPINSTRUCTION_TYPE.AggregateBinary);
-		String2CPInstructionType.put( "tak+*"   , CPINSTRUCTION_TYPE.AggregateTernary);
-		String2CPInstructionType.put( "tack+*"  , CPINSTRUCTION_TYPE.AggregateTernary);
+		String2CPInstructionType.put( "ba+*"   	, CPType.AggregateBinary);
+		String2CPInstructionType.put( "tak+*"   , CPType.AggregateTernary);
+		String2CPInstructionType.put( "tack+*"  , CPType.AggregateTernary);
 		
-		String2CPInstructionType.put( "uak+"   	, CPINSTRUCTION_TYPE.AggregateUnary);
-		String2CPInstructionType.put( "uark+"   , CPINSTRUCTION_TYPE.AggregateUnary);
-		String2CPInstructionType.put( "uack+"   , CPINSTRUCTION_TYPE.AggregateUnary);
-		String2CPInstructionType.put( "uasqk+"  , CPINSTRUCTION_TYPE.AggregateUnary);
-		String2CPInstructionType.put( "uarsqk+" , CPINSTRUCTION_TYPE.AggregateUnary);
-		String2CPInstructionType.put( "uacsqk+" , CPINSTRUCTION_TYPE.AggregateUnary);
-		String2CPInstructionType.put( "uamean"  , CPINSTRUCTION_TYPE.AggregateUnary);
-		String2CPInstructionType.put( "uarmean" , CPINSTRUCTION_TYPE.AggregateUnary);
-		String2CPInstructionType.put( "uacmean" , CPINSTRUCTION_TYPE.AggregateUnary);
-		String2CPInstructionType.put( "uavar"   , CPINSTRUCTION_TYPE.AggregateUnary);
-		String2CPInstructionType.put( "uarvar"  , CPINSTRUCTION_TYPE.AggregateUnary);
-		String2CPInstructionType.put( "uacvar"  , CPINSTRUCTION_TYPE.AggregateUnary);
-		String2CPInstructionType.put( "uamax"   , CPINSTRUCTION_TYPE.AggregateUnary);
-		String2CPInstructionType.put( "uarmax"  , CPINSTRUCTION_TYPE.AggregateUnary);
-		String2CPInstructionType.put( "uarimax", CPINSTRUCTION_TYPE.AggregateUnary);
-		String2CPInstructionType.put( "uacmax"  , CPINSTRUCTION_TYPE.AggregateUnary);
-		String2CPInstructionType.put( "uamin"   , CPINSTRUCTION_TYPE.AggregateUnary);
-		String2CPInstructionType.put( "uarmin"  , CPINSTRUCTION_TYPE.AggregateUnary);
-		String2CPInstructionType.put( "uarimin" , CPINSTRUCTION_TYPE.AggregateUnary);
-		String2CPInstructionType.put( "uacmin"  , CPINSTRUCTION_TYPE.AggregateUnary);
-		String2CPInstructionType.put( "ua+"     , CPINSTRUCTION_TYPE.AggregateUnary);
-		String2CPInstructionType.put( "uar+"    , CPINSTRUCTION_TYPE.AggregateUnary);
-		String2CPInstructionType.put( "uac+"    , CPINSTRUCTION_TYPE.AggregateUnary);
-		String2CPInstructionType.put( "ua*"     , CPINSTRUCTION_TYPE.AggregateUnary);
-		String2CPInstructionType.put( "uatrace" , CPINSTRUCTION_TYPE.AggregateUnary);
-		String2CPInstructionType.put( "uaktrace", CPINSTRUCTION_TYPE.AggregateUnary);
-		String2CPInstructionType.put( "nrow"    ,CPINSTRUCTION_TYPE.AggregateUnary);
-		String2CPInstructionType.put( "ncol"    ,CPINSTRUCTION_TYPE.AggregateUnary);
-		String2CPInstructionType.put( "length"  ,CPINSTRUCTION_TYPE.AggregateUnary);
+		String2CPInstructionType.put( "uak+"   	, CPType.AggregateUnary);
+		String2CPInstructionType.put( "uark+"   , CPType.AggregateUnary);
+		String2CPInstructionType.put( "uack+"   , CPType.AggregateUnary);
+		String2CPInstructionType.put( "uasqk+"  , CPType.AggregateUnary);
+		String2CPInstructionType.put( "uarsqk+" , CPType.AggregateUnary);
+		String2CPInstructionType.put( "uacsqk+" , CPType.AggregateUnary);
+		String2CPInstructionType.put( "uamean"  , CPType.AggregateUnary);
+		String2CPInstructionType.put( "uarmean" , CPType.AggregateUnary);
+		String2CPInstructionType.put( "uacmean" , CPType.AggregateUnary);
+		String2CPInstructionType.put( "uavar"   , CPType.AggregateUnary);
+		String2CPInstructionType.put( "uarvar"  , CPType.AggregateUnary);
+		String2CPInstructionType.put( "uacvar"  , CPType.AggregateUnary);
+		String2CPInstructionType.put( "uamax"   , CPType.AggregateUnary);
+		String2CPInstructionType.put( "uarmax"  , CPType.AggregateUnary);
+		String2CPInstructionType.put( "uarimax", CPType.AggregateUnary);
+		String2CPInstructionType.put( "uacmax"  , CPType.AggregateUnary);
+		String2CPInstructionType.put( "uamin"   , CPType.AggregateUnary);
+		String2CPInstructionType.put( "uarmin"  , CPType.AggregateUnary);
+		String2CPInstructionType.put( "uarimin" , CPType.AggregateUnary);
+		String2CPInstructionType.put( "uacmin"  , CPType.AggregateUnary);
+		String2CPInstructionType.put( "ua+"     , CPType.AggregateUnary);
+		String2CPInstructionType.put( "uar+"    , CPType.AggregateUnary);
+		String2CPInstructionType.put( "uac+"    , CPType.AggregateUnary);
+		String2CPInstructionType.put( "ua*"     , CPType.AggregateUnary);
+		String2CPInstructionType.put( "uatrace" , CPType.AggregateUnary);
+		String2CPInstructionType.put( "uaktrace", CPType.AggregateUnary);
+		String2CPInstructionType.put( "nrow"    ,CPType.AggregateUnary);
+		String2CPInstructionType.put( "ncol"    ,CPType.AggregateUnary);
+		String2CPInstructionType.put( "length"  ,CPType.AggregateUnary);
 
-		String2CPInstructionType.put( "uaggouterchain", CPINSTRUCTION_TYPE.UaggOuterChain);
+		String2CPInstructionType.put( "uaggouterchain", CPType.UaggOuterChain);
 		
 		// Arithmetic Instruction Opcodes 
-		String2CPInstructionType.put( "+"    , CPINSTRUCTION_TYPE.ArithmeticBinary);
-		String2CPInstructionType.put( "-"    , CPINSTRUCTION_TYPE.ArithmeticBinary);
-		String2CPInstructionType.put( "*"    , CPINSTRUCTION_TYPE.ArithmeticBinary);
-		String2CPInstructionType.put( "/"    , CPINSTRUCTION_TYPE.ArithmeticBinary);
-		String2CPInstructionType.put( "%%"   , CPINSTRUCTION_TYPE.ArithmeticBinary);
-		String2CPInstructionType.put( "%/%"  , CPINSTRUCTION_TYPE.ArithmeticBinary);
-		String2CPInstructionType.put( "^"    , CPINSTRUCTION_TYPE.ArithmeticBinary);
-		String2CPInstructionType.put( "1-*"  , CPINSTRUCTION_TYPE.ArithmeticBinary); //special * case
-		String2CPInstructionType.put( "^2"   , CPINSTRUCTION_TYPE.ArithmeticBinary); //special ^ case
-		String2CPInstructionType.put( "*2"   , CPINSTRUCTION_TYPE.ArithmeticBinary); //special * case
-		String2CPInstructionType.put( "-nz"  , CPINSTRUCTION_TYPE.ArithmeticBinary); //special - case
-		String2CPInstructionType.put( "+*"  , CPINSTRUCTION_TYPE.ArithmeticBinary); 
-		String2CPInstructionType.put( "-*"  , CPINSTRUCTION_TYPE.ArithmeticBinary); 
+		String2CPInstructionType.put( "+"    , CPType.ArithmeticBinary);
+		String2CPInstructionType.put( "-"    , CPType.ArithmeticBinary);
+		String2CPInstructionType.put( "*"    , CPType.ArithmeticBinary);
+		String2CPInstructionType.put( "/"    , CPType.ArithmeticBinary);
+		String2CPInstructionType.put( "%%"   , CPType.ArithmeticBinary);
+		String2CPInstructionType.put( "%/%"  , CPType.ArithmeticBinary);
+		String2CPInstructionType.put( "^"    , CPType.ArithmeticBinary);
+		String2CPInstructionType.put( "1-*"  , CPType.ArithmeticBinary); //special * case
+		String2CPInstructionType.put( "^2"   , CPType.ArithmeticBinary); //special ^ case
+		String2CPInstructionType.put( "*2"   , CPType.ArithmeticBinary); //special * case
+		String2CPInstructionType.put( "-nz"  , CPType.ArithmeticBinary); //special - case
+		String2CPInstructionType.put( "+*"  , CPType.ArithmeticBinary); 
+		String2CPInstructionType.put( "-*"  , CPType.ArithmeticBinary); 
 
 		
 		// Boolean Instruction Opcodes 
-		String2CPInstructionType.put( "&&"   , CPINSTRUCTION_TYPE.BooleanBinary);
-		String2CPInstructionType.put( "||"   , CPINSTRUCTION_TYPE.BooleanBinary);
+		String2CPInstructionType.put( "&&"   , CPType.BooleanBinary);
+		String2CPInstructionType.put( "||"   , CPType.BooleanBinary);
 		
-		String2CPInstructionType.put( "!"    , CPINSTRUCTION_TYPE.BooleanUnary);
+		String2CPInstructionType.put( "!"    , CPType.BooleanUnary);
 
 		// Relational Instruction Opcodes 
-		String2CPInstructionType.put( "=="   , CPINSTRUCTION_TYPE.RelationalBinary);
-		String2CPInstructionType.put( "!="   , CPINSTRUCTION_TYPE.RelationalBinary);
-		String2CPInstructionType.put( "<"    , CPINSTRUCTION_TYPE.RelationalBinary);
-		String2CPInstructionType.put( ">"    , CPINSTRUCTION_TYPE.RelationalBinary);
-		String2CPInstructionType.put( "<="   , CPINSTRUCTION_TYPE.RelationalBinary);
-		String2CPInstructionType.put( ">="   , CPINSTRUCTION_TYPE.RelationalBinary);
+		String2CPInstructionType.put( "=="   , CPType.RelationalBinary);
+		String2CPInstructionType.put( "!="   , CPType.RelationalBinary);
+		String2CPInstructionType.put( "<"    , CPType.RelationalBinary);
+		String2CPInstructionType.put( ">"    , CPType.RelationalBinary);
+		String2CPInstructionType.put( "<="   , CPType.RelationalBinary);
+		String2CPInstructionType.put( ">="   , CPType.RelationalBinary);
 		
 		// Builtin Instruction Opcodes 
-		String2CPInstructionType.put( "log"  , CPINSTRUCTION_TYPE.Builtin);
-		String2CPInstructionType.put( "log_nz"  , CPINSTRUCTION_TYPE.Builtin);
+		String2CPInstructionType.put( "log"  , CPType.Builtin);
+		String2CPInstructionType.put( "log_nz"  , CPType.Builtin);
 
-		String2CPInstructionType.put( "max"  , CPINSTRUCTION_TYPE.BuiltinBinary);
-		String2CPInstructionType.put( "min"  , CPINSTRUCTION_TYPE.BuiltinBinary);
-		String2CPInstructionType.put( "solve"  , CPINSTRUCTION_TYPE.BuiltinBinary);
+		String2CPInstructionType.put( "max"  , CPType.BuiltinBinary);
+		String2CPInstructionType.put( "min"  , CPType.BuiltinBinary);
+		String2CPInstructionType.put( "solve"  , CPType.BuiltinBinary);
 		
-		String2CPInstructionType.put( "exp"   , CPINSTRUCTION_TYPE.BuiltinUnary);
-		String2CPInstructionType.put( "abs"   , CPINSTRUCTION_TYPE.BuiltinUnary);
-		String2CPInstructionType.put( "sin"   , CPINSTRUCTION_TYPE.BuiltinUnary);
-		String2CPInstructionType.put( "cos"   , CPINSTRUCTION_TYPE.BuiltinUnary);
-		String2CPInstructionType.put( "tan"   , CPINSTRUCTION_TYPE.BuiltinUnary);
-		String2CPInstructionType.put( "sinh"   , CPINSTRUCTION_TYPE.BuiltinUnary);
-		String2CPInstructionType.put( "cosh"   , CPINSTRUCTION_TYPE.BuiltinUnary);
-		String2CPInstructionType.put( "tanh"   , CPINSTRUCTION_TYPE.BuiltinUnary);
-		String2CPInstructionType.put( "asin"  , CPINSTRUCTION_TYPE.BuiltinUnary);
-		String2CPInstructionType.put( "acos"  , CPINSTRUCTION_TYPE.BuiltinUnary);
-		String2CPInstructionType.put( "atan"  , CPINSTRUCTION_TYPE.BuiltinUnary);
-		String2CPInstructionType.put( "sign"  , CPINSTRUCTION_TYPE.BuiltinUnary);
-		String2CPInstructionType.put( "sqrt"  , CPINSTRUCTION_TYPE.BuiltinUnary);
-		String2CPInstructionType.put( "plogp" , CPINSTRUCTION_TYPE.BuiltinUnary);
-		String2CPInstructionType.put( "print" , CPINSTRUCTION_TYPE.BuiltinUnary);
-		String2CPInstructionType.put( "round" , CPINSTRUCTION_TYPE.BuiltinUnary);
-		String2CPInstructionType.put( "ceil"  , CPINSTRUCTION_TYPE.BuiltinUnary);
-		String2CPInstructionType.put( "floor" , CPINSTRUCTION_TYPE.BuiltinUnary);
-		String2CPInstructionType.put( "ucumk+", CPINSTRUCTION_TYPE.BuiltinUnary);
-		String2CPInstructionType.put( "ucum*" , CPINSTRUCTION_TYPE.BuiltinUnary);
-		String2CPInstructionType.put( "ucummin", CPINSTRUCTION_TYPE.BuiltinUnary);
-		String2CPInstructionType.put( "ucummax", CPINSTRUCTION_TYPE.BuiltinUnary);
-		String2CPInstructionType.put( "stop"  , CPINSTRUCTION_TYPE.BuiltinUnary);
-		String2CPInstructionType.put( "inverse", CPINSTRUCTION_TYPE.BuiltinUnary);
-		String2CPInstructionType.put( "cholesky",CPINSTRUCTION_TYPE.BuiltinUnary);
-		String2CPInstructionType.put( "sprop", CPINSTRUCTION_TYPE.BuiltinUnary);
-		String2CPInstructionType.put( "sigmoid", CPINSTRUCTION_TYPE.BuiltinUnary);
-		String2CPInstructionType.put( "sel+", CPINSTRUCTION_TYPE.BuiltinUnary);
+		String2CPInstructionType.put( "exp"   , CPType.BuiltinUnary);
+		String2CPInstructionType.put( "abs"   , CPType.BuiltinUnary);
+		String2CPInstructionType.put( "sin"   , CPType.BuiltinUnary);
+		String2CPInstructionType.put( "cos"   , CPType.BuiltinUnary);
+		String2CPInstructionType.put( "tan"   , CPType.BuiltinUnary);
+		String2CPInstructionType.put( "sinh"   , CPType.BuiltinUnary);
+		String2CPInstructionType.put( "cosh"   , CPType.BuiltinUnary);
+		String2CPInstructionType.put( "tanh"   , CPType.BuiltinUnary);
+		String2CPInstructionType.put( "asin"  , CPType.BuiltinUnary);
+		String2CPInstructionType.put( "acos"  , CPType.BuiltinUnary);
+		String2CPInstructionType.put( "atan"  , CPType.BuiltinUnary);
+		String2CPInstructionType.put( "sign"  , CPType.BuiltinUnary);
+		String2CPInstructionType.put( "sqrt"  , CPType.BuiltinUnary);
+		String2CPInstructionType.put( "plogp" , CPType.BuiltinUnary);
+		String2CPInstructionType.put( "print" , CPType.BuiltinUnary);
+		String2CPInstructionType.put( "round" , CPType.BuiltinUnary);
+		String2CPInstructionType.put( "ceil"  , CPType.BuiltinUnary);
+		String2CPInstructionType.put( "floor" , CPType.BuiltinUnary);
+		String2CPInstructionType.put( "ucumk+", CPType.BuiltinUnary);
+		String2CPInstructionType.put( "ucum*" , CPType.BuiltinUnary);
+		String2CPInstructionType.put( "ucummin", CPType.BuiltinUnary);
+		String2CPInstructionType.put( "ucummax", CPType.BuiltinUnary);
+		String2CPInstructionType.put( "stop"  , CPType.BuiltinUnary);
+		String2CPInstructionType.put( "inverse", CPType.BuiltinUnary);
+		String2CPInstructionType.put( "cholesky",CPType.BuiltinUnary);
+		String2CPInstructionType.put( "sprop", CPType.BuiltinUnary);
+		String2CPInstructionType.put( "sigmoid", CPType.BuiltinUnary);
+		String2CPInstructionType.put( "sel+", CPType.BuiltinUnary);
 		
-		String2CPInstructionType.put( "printf" , CPINSTRUCTION_TYPE.BuiltinNary);
-		String2CPInstructionType.put( "cbind" , CPINSTRUCTION_TYPE.BuiltinNary);
-		String2CPInstructionType.put( "rbind" , CPINSTRUCTION_TYPE.BuiltinNary);
+		String2CPInstructionType.put( "printf" , CPType.BuiltinNary);
+		String2CPInstructionType.put( "cbind" , CPType.BuiltinNary);
+		String2CPInstructionType.put( "rbind" , CPType.BuiltinNary);
 		
 		// Parameterized Builtin Functions
-		String2CPInstructionType.put( "cdf"	 		, CPINSTRUCTION_TYPE.ParameterizedBuiltin);
-		String2CPInstructionType.put( "invcdf"	 	, CPINSTRUCTION_TYPE.ParameterizedBuiltin);
-		String2CPInstructionType.put( "groupedagg"	, CPINSTRUCTION_TYPE.ParameterizedBuiltin);
-		String2CPInstructionType.put( "rmempty"	    , CPINSTRUCTION_TYPE.ParameterizedBuiltin);
-		String2CPInstructionType.put( "replace"	    , CPINSTRUCTION_TYPE.ParameterizedBuiltin);
-		String2CPInstructionType.put( "rexpand"	    , CPINSTRUCTION_TYPE.ParameterizedBuiltin);
-		String2CPInstructionType.put( "toString"    , CPINSTRUCTION_TYPE.ParameterizedBuiltin);
-		String2CPInstructionType.put( "transformapply",CPINSTRUCTION_TYPE.ParameterizedBuiltin);
-		String2CPInstructionType.put( "transformdecode",CPINSTRUCTION_TYPE.ParameterizedBuiltin);
-		String2CPInstructionType.put( "transformcolmap",CPINSTRUCTION_TYPE.ParameterizedBuiltin);
-		String2CPInstructionType.put( "transformmeta",CPINSTRUCTION_TYPE.ParameterizedBuiltin);
-		String2CPInstructionType.put( "transformencode",CPINSTRUCTION_TYPE.MultiReturnParameterizedBuiltin);
+		String2CPInstructionType.put( "cdf"	 		, CPType.ParameterizedBuiltin);
+		String2CPInstructionType.put( "invcdf"	 	, CPType.ParameterizedBuiltin);
+		String2CPInstructionType.put( "groupedagg"	, CPType.ParameterizedBuiltin);
+		String2CPInstructionType.put( "rmempty"	    , CPType.ParameterizedBuiltin);
+		String2CPInstructionType.put( "replace"	    , CPType.ParameterizedBuiltin);
+		String2CPInstructionType.put( "rexpand"	    , CPType.ParameterizedBuiltin);
+		String2CPInstructionType.put( "toString"    , CPType.ParameterizedBuiltin);
+		String2CPInstructionType.put( "transformapply",CPType.ParameterizedBuiltin);
+		String2CPInstructionType.put( "transformdecode",CPType.ParameterizedBuiltin);
+		String2CPInstructionType.put( "transformcolmap",CPType.ParameterizedBuiltin);
+		String2CPInstructionType.put( "transformmeta",CPType.ParameterizedBuiltin);
+		String2CPInstructionType.put( "transformencode",CPType.MultiReturnParameterizedBuiltin);
 		
 		// Variable Instruction Opcodes 
-		String2CPInstructionType.put( "assignvar"   , CPINSTRUCTION_TYPE.Variable);
-		String2CPInstructionType.put( "cpvar"    	, CPINSTRUCTION_TYPE.Variable);
-		String2CPInstructionType.put( "mvvar"    	, CPINSTRUCTION_TYPE.Variable);
-		String2CPInstructionType.put( "rmvar"    	, CPINSTRUCTION_TYPE.Variable);
-		String2CPInstructionType.put( "rmfilevar"   , CPINSTRUCTION_TYPE.Variable);
-		String2CPInstructionType.put( UnaryCP.CAST_AS_SCALAR_OPCODE, CPINSTRUCTION_TYPE.Variable);
-		String2CPInstructionType.put( UnaryCP.CAST_AS_MATRIX_OPCODE, CPINSTRUCTION_TYPE.Variable);
-		String2CPInstructionType.put( UnaryCP.CAST_AS_FRAME_OPCODE,  CPINSTRUCTION_TYPE.Variable);
-		String2CPInstructionType.put( UnaryCP.CAST_AS_DOUBLE_OPCODE, CPINSTRUCTION_TYPE.Variable);
-		String2CPInstructionType.put( UnaryCP.CAST_AS_INT_OPCODE,    CPINSTRUCTION_TYPE.Variable);
-		String2CPInstructionType.put( UnaryCP.CAST_AS_BOOLEAN_OPCODE, CPINSTRUCTION_TYPE.Variable);
-		String2CPInstructionType.put( "attachfiletovar"  , CPINSTRUCTION_TYPE.Variable);
-		String2CPInstructionType.put( "read"  		, CPINSTRUCTION_TYPE.Variable);
-		String2CPInstructionType.put( "write" 		, CPINSTRUCTION_TYPE.Variable);
-		String2CPInstructionType.put( "createvar"   , CPINSTRUCTION_TYPE.Variable);
+		String2CPInstructionType.put( "assignvar"   , CPType.Variable);
+		String2CPInstructionType.put( "cpvar"    	, CPType.Variable);
+		String2CPInstructionType.put( "mvvar"    	, CPType.Variable);
+		String2CPInstructionType.put( "rmvar"    	, CPType.Variable);
+		String2CPInstructionType.put( "rmfilevar"   , CPType.Variable);
+		String2CPInstructionType.put( UnaryCP.CAST_AS_SCALAR_OPCODE, CPType.Variable);
+		String2CPInstructionType.put( UnaryCP.CAST_AS_MATRIX_OPCODE, CPType.Variable);
+		String2CPInstructionType.put( UnaryCP.CAST_AS_FRAME_OPCODE,  CPType.Variable);
+		String2CPInstructionType.put( UnaryCP.CAST_AS_DOUBLE_OPCODE, CPType.Variable);
+		String2CPInstructionType.put( UnaryCP.CAST_AS_INT_OPCODE,    CPType.Variable);
+		String2CPInstructionType.put( UnaryCP.CAST_AS_BOOLEAN_OPCODE, CPType.Variable);
+		String2CPInstructionType.put( "attachfiletovar"  , CPType.Variable);
+		String2CPInstructionType.put( "read"  		, CPType.Variable);
+		String2CPInstructionType.put( "write" 		, CPType.Variable);
+		String2CPInstructionType.put( "createvar"   , CPType.Variable);
 
 		// Reorg Instruction Opcodes (repositioning of existing values)
-		String2CPInstructionType.put( "r'"   	    , CPINSTRUCTION_TYPE.Reorg);
-		String2CPInstructionType.put( "rev"   	    , CPINSTRUCTION_TYPE.Reorg);
-		String2CPInstructionType.put( "rdiag"       , CPINSTRUCTION_TYPE.Reorg);
-		String2CPInstructionType.put( "rshape"      , CPINSTRUCTION_TYPE.MatrixReshape);
-		String2CPInstructionType.put( "rsort"      , CPINSTRUCTION_TYPE.Reorg);
+		String2CPInstructionType.put( "r'"   	    , CPType.Reorg);
+		String2CPInstructionType.put( "rev"   	    , CPType.Reorg);
+		String2CPInstructionType.put( "rdiag"       , CPType.Reorg);
+		String2CPInstructionType.put( "rshape"      , CPType.MatrixReshape);
+		String2CPInstructionType.put( "rsort"      , CPType.Reorg);
 
 		// Opcodes related to convolutions
-		String2CPInstructionType.put( "relu_backward"      , CPINSTRUCTION_TYPE.Convolution);
-		String2CPInstructionType.put( "relu_maxpooling"      , CPINSTRUCTION_TYPE.Convolution);
-		String2CPInstructionType.put( "relu_maxpooling_backward"      , CPINSTRUCTION_TYPE.Convolution);
-		String2CPInstructionType.put( "maxpooling"      , CPINSTRUCTION_TYPE.Convolution);
-		String2CPInstructionType.put( "maxpooling_backward"      , CPINSTRUCTION_TYPE.Convolution);
-		String2CPInstructionType.put( "conv2d"      , CPINSTRUCTION_TYPE.Convolution);
-		String2CPInstructionType.put( "conv2d_bias_add"      , CPINSTRUCTION_TYPE.Convolution);
-		String2CPInstructionType.put( "conv2d_backward_filter"      , CPINSTRUCTION_TYPE.Convolution);
-		String2CPInstructionType.put( "conv2d_backward_data"      , CPINSTRUCTION_TYPE.Convolution);
-		String2CPInstructionType.put( "bias_add"      , CPINSTRUCTION_TYPE.Convolution);
-		String2CPInstructionType.put( "bias_multiply"      , CPINSTRUCTION_TYPE.Convolution);
-		String2CPInstructionType.put( "channel_sums"      , CPINSTRUCTION_TYPE.Convolution);
+		String2CPInstructionType.put( "relu_backward"      , CPType.Convolution);
+		String2CPInstructionType.put( "relu_maxpooling"      , CPType.Convolution);
+		String2CPInstructionType.put( "relu_maxpooling_backward"      , CPType.Convolution);
+		String2CPInstructionType.put( "maxpooling"      , CPType.Convolution);
+		String2CPInstructionType.put( "maxpooling_backward"      , CPType.Convolution);
+		String2CPInstructionType.put( "conv2d"      , CPType.Convolution);
+		String2CPInstructionType.put( "conv2d_bias_add"      , CPType.Convolution);
+		String2CPInstructionType.put( "conv2d_backward_filter"      , CPType.Convolution);
+		String2CPInstructionType.put( "conv2d_backward_data"      , CPType.Convolution);
+		String2CPInstructionType.put( "bias_add"      , CPType.Convolution);
+		String2CPInstructionType.put( "bias_multiply"      , CPType.Convolution);
+		String2CPInstructionType.put( "channel_sums"      , CPType.Convolution);
 		
 		// Quaternary instruction opcodes
-		String2CPInstructionType.put( "wsloss"  , CPINSTRUCTION_TYPE.Quaternary);
-		String2CPInstructionType.put( "wsigmoid", CPINSTRUCTION_TYPE.Quaternary);
-		String2CPInstructionType.put( "wdivmm"  , CPINSTRUCTION_TYPE.Quaternary);
-		String2CPInstructionType.put( "wcemm"   , CPINSTRUCTION_TYPE.Quaternary);
-		String2CPInstructionType.put( "wumm"    , CPINSTRUCTION_TYPE.Quaternary);
+		String2CPInstructionType.put( "wsloss"  , CPType.Quaternary);
+		String2CPInstructionType.put( "wsigmoid", CPType.Quaternary);
+		String2CPInstructionType.put( "wdivmm"  , CPType.Quaternary);
+		String2CPInstructionType.put( "wcemm"   , CPType.Quaternary);
+		String2CPInstructionType.put( "wumm"    , CPType.Quaternary);
 		
 		// User-defined function Opcodes
-		String2CPInstructionType.put( "extfunct"   	, CPINSTRUCTION_TYPE.External);
+		String2CPInstructionType.put( "extfunct"   	, CPType.External);
 
-		String2CPInstructionType.put( Append.OPCODE, CPINSTRUCTION_TYPE.Append);
+		String2CPInstructionType.put( Append.OPCODE, CPType.Append);
 		
 		// data generation opcodes
-		String2CPInstructionType.put( DataGen.RAND_OPCODE   , CPINSTRUCTION_TYPE.Rand);
-		String2CPInstructionType.put( DataGen.SEQ_OPCODE    , CPINSTRUCTION_TYPE.Rand);
-		String2CPInstructionType.put( DataGen.SINIT_OPCODE  , CPINSTRUCTION_TYPE.StringInit);
-		String2CPInstructionType.put( DataGen.SAMPLE_OPCODE , CPINSTRUCTION_TYPE.Rand);
+		String2CPInstructionType.put( DataGen.RAND_OPCODE   , CPType.Rand);
+		String2CPInstructionType.put( DataGen.SEQ_OPCODE    , CPType.Rand);
+		String2CPInstructionType.put( DataGen.SINIT_OPCODE  , CPType.StringInit);
+		String2CPInstructionType.put( DataGen.SAMPLE_OPCODE , CPType.Rand);
 		
-		String2CPInstructionType.put( "ctable", 		CPINSTRUCTION_TYPE.Ternary);
-		String2CPInstructionType.put( "ctableexpand", 	CPINSTRUCTION_TYPE.Ternary);
+		String2CPInstructionType.put( "ctable", 		CPType.Ternary);
+		String2CPInstructionType.put( "ctableexpand", 	CPType.Ternary);
 		
 		//central moment, covariance, quantiles (sort/pick)
-		String2CPInstructionType.put( "cm"    , CPINSTRUCTION_TYPE.CentralMoment);
-		String2CPInstructionType.put( "cov"   , CPINSTRUCTION_TYPE.Covariance);
-		String2CPInstructionType.put( "qsort"  , CPINSTRUCTION_TYPE.QSort);
-		String2CPInstructionType.put( "qpick"  , CPINSTRUCTION_TYPE.QPick);
+		String2CPInstructionType.put( "cm"    , CPType.CentralMoment);
+		String2CPInstructionType.put( "cov"   , CPType.Covariance);
+		String2CPInstructionType.put( "qsort"  , CPType.QSort);
+		String2CPInstructionType.put( "qpick"  , CPType.QPick);
 		
 		
-		String2CPInstructionType.put( RightIndex.OPCODE, CPINSTRUCTION_TYPE.MatrixIndexing);
-		String2CPInstructionType.put( LeftIndex.OPCODE, CPINSTRUCTION_TYPE.MatrixIndexing);
+		String2CPInstructionType.put( RightIndex.OPCODE, CPType.MatrixIndexing);
+		String2CPInstructionType.put( LeftIndex.OPCODE, CPType.MatrixIndexing);
 	
-		String2CPInstructionType.put( "tsmm"   , CPINSTRUCTION_TYPE.MMTSJ);
-		String2CPInstructionType.put( "pmm"   , CPINSTRUCTION_TYPE.PMMJ);
-		String2CPInstructionType.put( "mmchain"   , CPINSTRUCTION_TYPE.MMChain);
+		String2CPInstructionType.put( "tsmm"   , CPType.MMTSJ);
+		String2CPInstructionType.put( "pmm"   , CPType.PMMJ);
+		String2CPInstructionType.put( "mmchain"   , CPType.MMChain);
 		
-		String2CPInstructionType.put( "qr",    CPINSTRUCTION_TYPE.MultiReturnBuiltin);
-		String2CPInstructionType.put( "lu",    CPINSTRUCTION_TYPE.MultiReturnBuiltin);
-		String2CPInstructionType.put( "eigen", CPINSTRUCTION_TYPE.MultiReturnBuiltin);
-		String2CPInstructionType.put( "svd", 	 CPINSTRUCTION_TYPE.MultiReturnBuiltin);
+		String2CPInstructionType.put( "qr",    CPType.MultiReturnBuiltin);
+		String2CPInstructionType.put( "lu",    CPType.MultiReturnBuiltin);
+		String2CPInstructionType.put( "eigen", CPType.MultiReturnBuiltin);
+		String2CPInstructionType.put( "svd", 	 CPType.MultiReturnBuiltin);
 
-		String2CPInstructionType.put( "partition", 	CPINSTRUCTION_TYPE.Partition);
-		String2CPInstructionType.put( "compress", 	CPINSTRUCTION_TYPE.Compression);
-		String2CPInstructionType.put( "spoof", 		CPINSTRUCTION_TYPE.SpoofFused);
+		String2CPInstructionType.put( "partition", 	CPType.Partition);
+		String2CPInstructionType.put( "compress", 	CPType.Compression);
+		String2CPInstructionType.put( "spoof", 		CPType.SpoofFused);
 
 		
 		//CP FILE instruction
 		String2CPFileInstructionType = new HashMap<>();
-		String2CPFileInstructionType.put( "rmempty"	    , CPINSTRUCTION_TYPE.ParameterizedBuiltin);
+		String2CPFileInstructionType.put( "rmempty"	    , CPType.ParameterizedBuiltin);
 	}
 
 	public static CPInstruction parseSingleInstruction (String str ) 
@@ -293,7 +293,7 @@ public class CPInstructionParser extends InstructionParser
 		if ( str == null || str.isEmpty() )
 			return null;
 
-		CPINSTRUCTION_TYPE cptype = InstructionUtils.getCPType(str); 
+		CPType cptype = InstructionUtils.getCPType(str); 
 		if ( cptype == null ) 
 			throw new DMLRuntimeException("Unable derive cptype for instruction: " + str);
 		CPInstruction cpinst = parseSingleInstruction(cptype, str);
@@ -302,7 +302,7 @@ public class CPInstructionParser extends InstructionParser
 		return cpinst;
 	}
 	
-	public static CPInstruction parseSingleInstruction ( CPINSTRUCTION_TYPE cptype, String str ) 
+	public static CPInstruction parseSingleInstruction ( CPType cptype, String str ) 
 		throws DMLRuntimeException 
 	{
 		ExecType execType = null; 
@@ -347,7 +347,7 @@ public class CPInstructionParser extends InstructionParser
 				return BuiltinUnaryCPInstruction.parseInstruction(str);
 			
 			case BuiltinNary:
-				return BuiltinNary.parseInstruction(str);
+				return BuiltinNaryCPInstruction.parseInstruction(str);
 			
 			case Reorg:
 				return ReorgCPInstruction.parseInstruction(str);

http://git-wip-us.apache.org/repos/asf/systemml/blob/75b93f26/src/main/java/org/apache/sysml/runtime/instructions/Instruction.java
----------------------------------------------------------------------
diff --git a/src/main/java/org/apache/sysml/runtime/instructions/Instruction.java b/src/main/java/org/apache/sysml/runtime/instructions/Instruction.java
index 5583b61..1171e80 100644
--- a/src/main/java/org/apache/sysml/runtime/instructions/Instruction.java
+++ b/src/main/java/org/apache/sysml/runtime/instructions/Instruction.java
@@ -30,7 +30,7 @@ import org.apache.sysml.runtime.controlprogram.context.ExecutionContext;
 
 public abstract class Instruction 
 {
-	public enum INSTRUCTION_TYPE { 
+	public enum IType { 
 		CONTROL_PROGRAM,
 		MAPREDUCE,
 		MAPREDUCE_JOB,
@@ -50,7 +50,7 @@ public abstract class Instruction
 	public static final String GPU_INST_PREFIX = "gpu_";
 	
 	//basic instruction meta data
-	protected INSTRUCTION_TYPE type = null;
+	protected IType type = null;
 	protected String instString = null;
 	protected String instOpcode = null;
 	private String extendedOpcode = null;
@@ -83,11 +83,11 @@ public abstract class Instruction
 		return endCol;
 	}
 
-	public void setType (INSTRUCTION_TYPE tp ) {
+	public void setType (IType tp ) {
 		type = tp;
 	}
 	
-	public INSTRUCTION_TYPE getType() {
+	public IType getType() {
 		return type;
 	}
 	
@@ -179,18 +179,18 @@ public abstract class Instruction
 				scriptInfo = " [" + filename + " " + beginLine + ":" + beginCol + "-" + endLine + ":" + endCol + "]";
 			else
 				scriptInfo = " [" + beginLine + ":" + beginCol + "-" + endLine + ":" + endCol + "]";
-			if( type == INSTRUCTION_TYPE.SPARK )
+			if( type == IType.SPARK )
 				extendedOpcode = SP_INST_PREFIX + getOpcode() + scriptInfo;
-			else if( type == INSTRUCTION_TYPE.GPU )
+			else if( type == IType.GPU )
 				extendedOpcode = GPU_INST_PREFIX + getOpcode() + scriptInfo;
 			else
 				extendedOpcode = getOpcode() + scriptInfo;
 		}
 		else {
 			// This ensures that there is no overhead if finegrained statistics is disabled
-			if( type == INSTRUCTION_TYPE.SPARK )
+			if( type == IType.SPARK )
 				extendedOpcode = SP_INST_PREFIX + getOpcode();
-			else if( type == INSTRUCTION_TYPE.GPU )
+			else if( type == IType.GPU )
 				extendedOpcode = GPU_INST_PREFIX + getOpcode();
 			else
 				extendedOpcode = getOpcode();

http://git-wip-us.apache.org/repos/asf/systemml/blob/75b93f26/src/main/java/org/apache/sysml/runtime/instructions/InstructionParser.java
----------------------------------------------------------------------
diff --git a/src/main/java/org/apache/sysml/runtime/instructions/InstructionParser.java b/src/main/java/org/apache/sysml/runtime/instructions/InstructionParser.java
index 251d37d..b38ccff 100644
--- a/src/main/java/org/apache/sysml/runtime/instructions/InstructionParser.java
+++ b/src/main/java/org/apache/sysml/runtime/instructions/InstructionParser.java
@@ -21,7 +21,7 @@ package org.apache.sysml.runtime.instructions;
 
 import org.apache.sysml.lops.LopProperties.ExecType;
 import org.apache.sysml.runtime.DMLRuntimeException;
-import org.apache.sysml.runtime.instructions.cp.CPInstruction.CPINSTRUCTION_TYPE;
+import org.apache.sysml.runtime.instructions.cp.CPInstruction.CPType;
 import org.apache.sysml.runtime.instructions.gpu.GPUInstruction.GPUINSTRUCTION_TYPE;
 import org.apache.sysml.runtime.instructions.mr.MRInstruction.MRINSTRUCTION_TYPE;
 import org.apache.sysml.runtime.instructions.spark.SPInstruction.SPINSTRUCTION_TYPE;
@@ -39,7 +39,7 @@ public class InstructionParser
 		if (   execType.equalsIgnoreCase(ExecType.CP.toString()) 
 			|| execType.equalsIgnoreCase(ExecType.CP_FILE.toString()) ) 
 		{
-			CPINSTRUCTION_TYPE cptype = InstructionUtils.getCPType(str); 
+			CPType cptype = InstructionUtils.getCPType(str); 
 			if( cptype == null )
 				throw new DMLRuntimeException("Unknown CP instruction: " + str);
 			return CPInstructionParser.parseSingleInstruction (cptype, str);

http://git-wip-us.apache.org/repos/asf/systemml/blob/75b93f26/src/main/java/org/apache/sysml/runtime/instructions/InstructionUtils.java
----------------------------------------------------------------------
diff --git a/src/main/java/org/apache/sysml/runtime/instructions/InstructionUtils.java b/src/main/java/org/apache/sysml/runtime/instructions/InstructionUtils.java
index 2a990d4..c564e67 100644
--- a/src/main/java/org/apache/sysml/runtime/instructions/InstructionUtils.java
+++ b/src/main/java/org/apache/sysml/runtime/instructions/InstructionUtils.java
@@ -72,7 +72,7 @@ import org.apache.sysml.runtime.functionobjects.ReduceAll;
 import org.apache.sysml.runtime.functionobjects.ReduceCol;
 import org.apache.sysml.runtime.functionobjects.ReduceDiag;
 import org.apache.sysml.runtime.functionobjects.ReduceRow;
-import org.apache.sysml.runtime.instructions.cp.CPInstruction.CPINSTRUCTION_TYPE;
+import org.apache.sysml.runtime.instructions.cp.CPInstruction.CPType;
 import org.apache.sysml.runtime.instructions.gpu.GPUInstruction.GPUINSTRUCTION_TYPE;
 import org.apache.sysml.runtime.instructions.mr.MRInstruction.MRINSTRUCTION_TYPE;
 import org.apache.sysml.runtime.instructions.spark.SPInstruction.SPINSTRUCTION_TYPE;
@@ -202,7 +202,7 @@ public class InstructionUtils
 		return SPInstructionParser.String2SPInstructionType.get( getOpCode(str) ); 
 	}
 
-	public static CPINSTRUCTION_TYPE getCPType( String str ) {
+	public static CPType getCPType( String str ) {
 		return CPInstructionParser.String2CPInstructionType.get( getOpCode(str) ); 
 	}
 
@@ -244,131 +244,135 @@ public class InstructionUtils
 		return false;
 	}
 
-	public static AggregateUnaryOperator parseBasicAggregateUnaryOperator(String opcode)
+	public static AggregateUnaryOperator parseBasicAggregateUnaryOperator(String opcode) {
+		return parseBasicAggregateUnaryOperator(opcode, 1);
+	}
+	
+	public static AggregateUnaryOperator parseBasicAggregateUnaryOperator(String opcode, int numThreads)
 	{
 		AggregateUnaryOperator aggun = null;
 		
 		if ( opcode.equalsIgnoreCase("uak+") ) {
 			AggregateOperator agg = new AggregateOperator(0, KahanPlus.getKahanPlusFnObject(), true, CorrectionLocationType.LASTCOLUMN);
-			aggun = new AggregateUnaryOperator(agg, ReduceAll.getReduceAllFnObject());
+			aggun = new AggregateUnaryOperator(agg, ReduceAll.getReduceAllFnObject(), numThreads);
 		} 		
 		else if ( opcode.equalsIgnoreCase("uark+") ) {
 			// RowSums
 			AggregateOperator agg = new AggregateOperator(0, KahanPlus.getKahanPlusFnObject(), true, CorrectionLocationType.LASTCOLUMN);
-			aggun = new AggregateUnaryOperator(agg, ReduceCol.getReduceColFnObject());
+			aggun = new AggregateUnaryOperator(agg, ReduceCol.getReduceColFnObject(), numThreads);
 		} 
 		else if ( opcode.equalsIgnoreCase("uack+") ) {
 			// ColSums
 			AggregateOperator agg = new AggregateOperator(0, KahanPlus.getKahanPlusFnObject(), true, CorrectionLocationType.LASTROW);
-			aggun = new AggregateUnaryOperator(agg, ReduceRow.getReduceRowFnObject());
+			aggun = new AggregateUnaryOperator(agg, ReduceRow.getReduceRowFnObject(), numThreads);
 		}
 		else if ( opcode.equalsIgnoreCase("uasqk+") ) {
 			AggregateOperator agg = new AggregateOperator(0, KahanPlusSq.getKahanPlusSqFnObject(), true, CorrectionLocationType.LASTCOLUMN);
-			aggun = new AggregateUnaryOperator(agg, ReduceAll.getReduceAllFnObject());
+			aggun = new AggregateUnaryOperator(agg, ReduceAll.getReduceAllFnObject(), numThreads);
 		}
 		else if ( opcode.equalsIgnoreCase("uarsqk+") ) {
 			// RowSums
 			AggregateOperator agg = new AggregateOperator(0, KahanPlusSq.getKahanPlusSqFnObject(), true, CorrectionLocationType.LASTCOLUMN);
-			aggun = new AggregateUnaryOperator(agg, ReduceCol.getReduceColFnObject());
+			aggun = new AggregateUnaryOperator(agg, ReduceCol.getReduceColFnObject(), numThreads);
 		}
 		else if ( opcode.equalsIgnoreCase("uacsqk+") ) {
 			// ColSums
 			AggregateOperator agg = new AggregateOperator(0, KahanPlusSq.getKahanPlusSqFnObject(), true, CorrectionLocationType.LASTROW);
-			aggun = new AggregateUnaryOperator(agg, ReduceRow.getReduceRowFnObject());
+			aggun = new AggregateUnaryOperator(agg, ReduceRow.getReduceRowFnObject(), numThreads);
 		}
 		else if ( opcode.equalsIgnoreCase("uamean") ) {
 			// Mean
 			AggregateOperator agg = new AggregateOperator(0, Mean.getMeanFnObject(), true, CorrectionLocationType.LASTTWOCOLUMNS);
-			aggun = new AggregateUnaryOperator(agg, ReduceAll.getReduceAllFnObject());
+			aggun = new AggregateUnaryOperator(agg, ReduceAll.getReduceAllFnObject(), numThreads);
 		} 
 		else if ( opcode.equalsIgnoreCase("uarmean") ) {
 			// RowMeans
 			AggregateOperator agg = new AggregateOperator(0, Mean.getMeanFnObject(), true, CorrectionLocationType.LASTTWOCOLUMNS);
-			aggun = new AggregateUnaryOperator(agg, ReduceCol.getReduceColFnObject());
+			aggun = new AggregateUnaryOperator(agg, ReduceCol.getReduceColFnObject(), numThreads);
 		} 
 		else if ( opcode.equalsIgnoreCase("uacmean") ) {
 			// ColMeans
 			AggregateOperator agg = new AggregateOperator(0, Mean.getMeanFnObject(), true, CorrectionLocationType.LASTTWOROWS);
-			aggun = new AggregateUnaryOperator(agg, ReduceRow.getReduceRowFnObject());
+			aggun = new AggregateUnaryOperator(agg, ReduceRow.getReduceRowFnObject(), numThreads);
 		}
 		else if ( opcode.equalsIgnoreCase("uavar") ) {
 			// Variance
 			CM varFn = CM.getCMFnObject(AggregateOperationTypes.VARIANCE);
 			CorrectionLocationType cloc = CorrectionLocationType.LASTFOURCOLUMNS;
 			AggregateOperator agg = new AggregateOperator(0, varFn, true, cloc);
-			aggun = new AggregateUnaryOperator(agg, ReduceAll.getReduceAllFnObject());
+			aggun = new AggregateUnaryOperator(agg, ReduceAll.getReduceAllFnObject(), numThreads);
 		}
 		else if ( opcode.equalsIgnoreCase("uarvar") ) {
 			// RowVariances
 			CM varFn = CM.getCMFnObject(AggregateOperationTypes.VARIANCE);
 			CorrectionLocationType cloc = CorrectionLocationType.LASTFOURCOLUMNS;
 			AggregateOperator agg = new AggregateOperator(0, varFn, true, cloc);
-			aggun = new AggregateUnaryOperator(agg, ReduceCol.getReduceColFnObject());
+			aggun = new AggregateUnaryOperator(agg, ReduceCol.getReduceColFnObject(), numThreads);
 		}
 		else if ( opcode.equalsIgnoreCase("uacvar") ) {
 			// ColVariances
 			CM varFn = CM.getCMFnObject(AggregateOperationTypes.VARIANCE);
 			CorrectionLocationType cloc = CorrectionLocationType.LASTFOURROWS;
 			AggregateOperator agg = new AggregateOperator(0, varFn, true, cloc);
-			aggun = new AggregateUnaryOperator(agg, ReduceRow.getReduceRowFnObject());
+			aggun = new AggregateUnaryOperator(agg, ReduceRow.getReduceRowFnObject(), numThreads);
 		}
 		else if ( opcode.equalsIgnoreCase("ua+") ) {
 			AggregateOperator agg = new AggregateOperator(0, Plus.getPlusFnObject());
-			aggun = new AggregateUnaryOperator(agg, ReduceAll.getReduceAllFnObject());
+			aggun = new AggregateUnaryOperator(agg, ReduceAll.getReduceAllFnObject(), numThreads);
 		} 
 		else if ( opcode.equalsIgnoreCase("uar+") ) {
 			// RowSums
 			AggregateOperator agg = new AggregateOperator(0, Plus.getPlusFnObject());
-			aggun = new AggregateUnaryOperator(agg, ReduceCol.getReduceColFnObject());
+			aggun = new AggregateUnaryOperator(agg, ReduceCol.getReduceColFnObject(), numThreads);
 		} 
 		else if ( opcode.equalsIgnoreCase("uac+") ) {
 			// ColSums
 			AggregateOperator agg = new AggregateOperator(0, Plus.getPlusFnObject());
-			aggun = new AggregateUnaryOperator(agg, ReduceRow.getReduceRowFnObject());
+			aggun = new AggregateUnaryOperator(agg, ReduceRow.getReduceRowFnObject(), numThreads);
 		}
 		else if ( opcode.equalsIgnoreCase("ua*") ) {
 			AggregateOperator agg = new AggregateOperator(1, Multiply.getMultiplyFnObject());
-			aggun = new AggregateUnaryOperator(agg, ReduceAll.getReduceAllFnObject());
+			aggun = new AggregateUnaryOperator(agg, ReduceAll.getReduceAllFnObject(), numThreads);
 		} 
 		else if ( opcode.equalsIgnoreCase("uamax") ) {
 			AggregateOperator agg = new AggregateOperator(-Double.MAX_VALUE, Builtin.getBuiltinFnObject("max"));
-			aggun = new AggregateUnaryOperator(agg, ReduceAll.getReduceAllFnObject());
+			aggun = new AggregateUnaryOperator(agg, ReduceAll.getReduceAllFnObject(), numThreads);
 		}
 		else if ( opcode.equalsIgnoreCase("uamin") ) {
 			AggregateOperator agg = new AggregateOperator(Double.MAX_VALUE, Builtin.getBuiltinFnObject("min"));
-			aggun = new AggregateUnaryOperator(agg, ReduceAll.getReduceAllFnObject());
+			aggun = new AggregateUnaryOperator(agg, ReduceAll.getReduceAllFnObject(), numThreads);
 		} 
 		else if ( opcode.equalsIgnoreCase("uatrace") ) {
 			AggregateOperator agg = new AggregateOperator(0, Plus.getPlusFnObject());
-			aggun = new AggregateUnaryOperator(agg, ReduceDiag.getReduceDiagFnObject());
+			aggun = new AggregateUnaryOperator(agg, ReduceDiag.getReduceDiagFnObject(), numThreads);
 		} 
 		else if ( opcode.equalsIgnoreCase("uaktrace") ) {
 			AggregateOperator agg = new AggregateOperator(0, KahanPlus.getKahanPlusFnObject(), true, CorrectionLocationType.LASTCOLUMN);
-			aggun = new AggregateUnaryOperator(agg, ReduceDiag.getReduceDiagFnObject());
+			aggun = new AggregateUnaryOperator(agg, ReduceDiag.getReduceDiagFnObject(), numThreads);
 		} 		
 		else if ( opcode.equalsIgnoreCase("uarmax") ) {
 			AggregateOperator agg = new AggregateOperator(-Double.MAX_VALUE, Builtin.getBuiltinFnObject("max"));
-			aggun = new AggregateUnaryOperator(agg, ReduceCol.getReduceColFnObject());
+			aggun = new AggregateUnaryOperator(agg, ReduceCol.getReduceColFnObject(), numThreads);
 		} 
 		else if (opcode.equalsIgnoreCase("uarimax") ) {
 			AggregateOperator agg = new AggregateOperator(-Double.MAX_VALUE, Builtin.getBuiltinFnObject("maxindex"), true, CorrectionLocationType.LASTCOLUMN);
-			aggun = new AggregateUnaryOperator(agg, ReduceCol.getReduceColFnObject());
+			aggun = new AggregateUnaryOperator(agg, ReduceCol.getReduceColFnObject(), numThreads);
 		}
 		else if ( opcode.equalsIgnoreCase("uarmin") ) {
 			AggregateOperator agg = new AggregateOperator(Double.MAX_VALUE, Builtin.getBuiltinFnObject("min"));
-			aggun = new AggregateUnaryOperator(agg, ReduceCol.getReduceColFnObject());
+			aggun = new AggregateUnaryOperator(agg, ReduceCol.getReduceColFnObject(), numThreads);
 		} 
 		else if (opcode.equalsIgnoreCase("uarimin") ) {
 			AggregateOperator agg = new AggregateOperator(Double.MAX_VALUE, Builtin.getBuiltinFnObject("minindex"), true, CorrectionLocationType.LASTCOLUMN);
-			aggun = new AggregateUnaryOperator(agg, ReduceCol.getReduceColFnObject());
+			aggun = new AggregateUnaryOperator(agg, ReduceCol.getReduceColFnObject(), numThreads);
 		}
 		else if ( opcode.equalsIgnoreCase("uacmax") ) {
 			AggregateOperator agg = new AggregateOperator(-Double.MAX_VALUE, Builtin.getBuiltinFnObject("max"));
-			aggun = new AggregateUnaryOperator(agg, ReduceRow.getReduceRowFnObject());
+			aggun = new AggregateUnaryOperator(agg, ReduceRow.getReduceRowFnObject(), numThreads);
 		} 
 		else if ( opcode.equalsIgnoreCase("uacmin") ) {
 			AggregateOperator agg = new AggregateOperator(Double.MAX_VALUE, Builtin.getBuiltinFnObject("min"));
-			aggun = new AggregateUnaryOperator(agg, ReduceRow.getReduceRowFnObject());
+			aggun = new AggregateUnaryOperator(agg, ReduceRow.getReduceRowFnObject(), numThreads);
 		}
 		
 		return aggun;

http://git-wip-us.apache.org/repos/asf/systemml/blob/75b93f26/src/main/java/org/apache/sysml/runtime/instructions/MRJobInstruction.java
----------------------------------------------------------------------
diff --git a/src/main/java/org/apache/sysml/runtime/instructions/MRJobInstruction.java b/src/main/java/org/apache/sysml/runtime/instructions/MRJobInstruction.java
index eceebba..88a309d 100644
--- a/src/main/java/org/apache/sysml/runtime/instructions/MRJobInstruction.java
+++ b/src/main/java/org/apache/sysml/runtime/instructions/MRJobInstruction.java
@@ -127,7 +127,7 @@ public class MRJobInstruction extends Instruction
 
 	public MRJobInstruction(JobType type)
 	{
-		setType(Instruction.INSTRUCTION_TYPE.MAPREDUCE_JOB);
+		setType(Instruction.IType.MAPREDUCE_JOB);
 		jobType = type;	
 		instOpcode = "MR-Job_"+getJobType();
 	}

http://git-wip-us.apache.org/repos/asf/systemml/blob/75b93f26/src/main/java/org/apache/sysml/runtime/instructions/cp/AggregateBinaryCPInstruction.java
----------------------------------------------------------------------
diff --git a/src/main/java/org/apache/sysml/runtime/instructions/cp/AggregateBinaryCPInstruction.java b/src/main/java/org/apache/sysml/runtime/instructions/cp/AggregateBinaryCPInstruction.java
index 100384f..4f542d6 100644
--- a/src/main/java/org/apache/sysml/runtime/instructions/cp/AggregateBinaryCPInstruction.java
+++ b/src/main/java/org/apache/sysml/runtime/instructions/cp/AggregateBinaryCPInstruction.java
@@ -34,10 +34,8 @@ import org.apache.sysml.runtime.matrix.operators.Operator;
 
 public class AggregateBinaryCPInstruction extends BinaryCPInstruction {
 
-	private AggregateBinaryCPInstruction(Operator op, CPOperand in1, CPOperand in2, CPOperand out, String opcode,
-			String istr) {
-		super(op, in1, in2, out, opcode, istr);
-		_cptype = CPINSTRUCTION_TYPE.AggregateBinary;
+	private AggregateBinaryCPInstruction(Operator op, CPOperand in1, CPOperand in2, CPOperand out, String opcode, String istr) {
+		super(CPType.AggregateBinary, op, in1, in2, out, opcode, istr);
 	}
 
 	public static AggregateBinaryCPInstruction parseInstruction( String str ) 

http://git-wip-us.apache.org/repos/asf/systemml/blob/75b93f26/src/main/java/org/apache/sysml/runtime/instructions/cp/AggregateTernaryCPInstruction.java
----------------------------------------------------------------------
diff --git a/src/main/java/org/apache/sysml/runtime/instructions/cp/AggregateTernaryCPInstruction.java b/src/main/java/org/apache/sysml/runtime/instructions/cp/AggregateTernaryCPInstruction.java
index a5cd372..c087016 100644
--- a/src/main/java/org/apache/sysml/runtime/instructions/cp/AggregateTernaryCPInstruction.java
+++ b/src/main/java/org/apache/sysml/runtime/instructions/cp/AggregateTernaryCPInstruction.java
@@ -30,8 +30,7 @@ public class AggregateTernaryCPInstruction extends ComputationCPInstruction {
 
 	private AggregateTernaryCPInstruction(Operator op, CPOperand in1, CPOperand in2, CPOperand in3, CPOperand out,
 			String opcode, String istr) {
-		super(op, in1, in2, in3, out, opcode, istr);
-		_cptype = CPINSTRUCTION_TYPE.AggregateTernary;
+		super(CPType.AggregateTernary, op, in1, in2, in3, out, opcode, istr);
 	}
 
 	public static AggregateTernaryCPInstruction parseInstruction( String str ) 

http://git-wip-us.apache.org/repos/asf/systemml/blob/75b93f26/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 8a26e25..132ec0a 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
@@ -43,8 +43,7 @@ public class AggregateUnaryCPInstruction extends UnaryCPInstruction {
 
 	protected AggregateUnaryCPInstruction(Operator op, CPOperand in1, CPOperand in2, CPOperand in3, CPOperand out,
 			String opcode, String istr) {
-		super(op, in1, in2, in3, out, opcode, istr);
-		_cptype = CPINSTRUCTION_TYPE.AggregateUnary;
+		super(CPType.AggregateUnary, op, in1, in2, in3, out, opcode, istr);
 	}
 
 	public static AggregateUnaryCPInstruction parseInstruction(String str)
@@ -61,9 +60,9 @@ public class AggregateUnaryCPInstruction extends UnaryCPInstruction {
 		}
 		else //DEFAULT BEHAVIOR
 		{
-			AggregateUnaryOperator aggun = InstructionUtils.parseBasicAggregateUnaryOperator(opcode);
-			aggun.setNumThreads( Integer.parseInt(parts[3]) );
-			return new AggregateUnaryCPInstruction(aggun, in1, out, opcode, str);				
+			AggregateUnaryOperator aggun = InstructionUtils
+				.parseBasicAggregateUnaryOperator(opcode, Integer.parseInt(parts[3]));
+			return new AggregateUnaryCPInstruction(aggun, in1, out, opcode, str);
 		}
 	}
 	

http://git-wip-us.apache.org/repos/asf/systemml/blob/75b93f26/src/main/java/org/apache/sysml/runtime/instructions/cp/AppendCPInstruction.java
----------------------------------------------------------------------
diff --git a/src/main/java/org/apache/sysml/runtime/instructions/cp/AppendCPInstruction.java b/src/main/java/org/apache/sysml/runtime/instructions/cp/AppendCPInstruction.java
index 74b2d6d..1754024 100644
--- a/src/main/java/org/apache/sysml/runtime/instructions/cp/AppendCPInstruction.java
+++ b/src/main/java/org/apache/sysml/runtime/instructions/cp/AppendCPInstruction.java
@@ -36,13 +36,11 @@ public abstract class AppendCPInstruction extends BinaryCPInstruction
 	}
 
 	//type (matrix cbind / scalar string concatenation)
-	protected AppendType _type;
+	protected final AppendType _type;
 
 	protected AppendCPInstruction(Operator op, CPOperand in1, CPOperand in2, CPOperand in3, CPOperand out,
 			AppendType type, String opcode, String istr) {
-		super(op, in1, in2, out, opcode, istr);
-		_cptype = CPINSTRUCTION_TYPE.Append;
-
+		super(CPType.Append, op, in1, in2, out, opcode, istr);
 		_type = type;
 	}
 

http://git-wip-us.apache.org/repos/asf/systemml/blob/75b93f26/src/main/java/org/apache/sysml/runtime/instructions/cp/ArithmeticBinaryCPInstruction.java
----------------------------------------------------------------------
diff --git a/src/main/java/org/apache/sysml/runtime/instructions/cp/ArithmeticBinaryCPInstruction.java b/src/main/java/org/apache/sysml/runtime/instructions/cp/ArithmeticBinaryCPInstruction.java
index 5507393..ade199a 100644
--- a/src/main/java/org/apache/sysml/runtime/instructions/cp/ArithmeticBinaryCPInstruction.java
+++ b/src/main/java/org/apache/sysml/runtime/instructions/cp/ArithmeticBinaryCPInstruction.java
@@ -30,8 +30,7 @@ public abstract class ArithmeticBinaryCPInstruction extends BinaryCPInstruction
 
 	protected ArithmeticBinaryCPInstruction(Operator op, CPOperand in1, CPOperand in2, CPOperand out, String opcode,
 			String istr) {
-		super(op, in1, in2, out, opcode, istr);
-		_cptype = CPINSTRUCTION_TYPE.ArithmeticBinary;
+		super(CPType.ArithmeticBinary, op, in1, in2, out, opcode, istr);
 	}
 
 	public static ArithmeticBinaryCPInstruction parseInstruction ( String str ) 

http://git-wip-us.apache.org/repos/asf/systemml/blob/75b93f26/src/main/java/org/apache/sysml/runtime/instructions/cp/BinaryCPInstruction.java
----------------------------------------------------------------------
diff --git a/src/main/java/org/apache/sysml/runtime/instructions/cp/BinaryCPInstruction.java b/src/main/java/org/apache/sysml/runtime/instructions/cp/BinaryCPInstruction.java
index 9c3470c..7d7382b 100644
--- a/src/main/java/org/apache/sysml/runtime/instructions/cp/BinaryCPInstruction.java
+++ b/src/main/java/org/apache/sysml/runtime/instructions/cp/BinaryCPInstruction.java
@@ -26,14 +26,14 @@ import org.apache.sysml.runtime.matrix.operators.Operator;
 
 public abstract class BinaryCPInstruction extends ComputationCPInstruction {
 
-	protected BinaryCPInstruction(Operator op, CPOperand in1, CPOperand in2, CPOperand out, String opcode,
+	protected BinaryCPInstruction(CPType type, Operator op, CPOperand in1, CPOperand in2, CPOperand out, String opcode,
 			String istr) {
-		super(op, in1, in2, out, opcode, istr);
+		super(type, op, in1, in2, out, opcode, istr);
 	}
 
-	protected BinaryCPInstruction(Operator op, CPOperand in1, CPOperand in2, CPOperand in3, CPOperand out,
+	protected BinaryCPInstruction(CPType type, Operator op, CPOperand in1, CPOperand in2, CPOperand in3, CPOperand out,
 			String opcode, String istr) {
-		super(op, in1, in2, in3, out, opcode, istr);
+		super(type, op, in1, in2, in3, out, opcode, istr);
 	}
 
 	protected static String parseBinaryInstruction(String instr, CPOperand in1, CPOperand in2, CPOperand out)

http://git-wip-us.apache.org/repos/asf/systemml/blob/75b93f26/src/main/java/org/apache/sysml/runtime/instructions/cp/BooleanBinaryCPInstruction.java
----------------------------------------------------------------------
diff --git a/src/main/java/org/apache/sysml/runtime/instructions/cp/BooleanBinaryCPInstruction.java b/src/main/java/org/apache/sysml/runtime/instructions/cp/BooleanBinaryCPInstruction.java
index 230ecea..9560470 100644
--- a/src/main/java/org/apache/sysml/runtime/instructions/cp/BooleanBinaryCPInstruction.java
+++ b/src/main/java/org/apache/sysml/runtime/instructions/cp/BooleanBinaryCPInstruction.java
@@ -31,8 +31,7 @@ public class BooleanBinaryCPInstruction extends BinaryCPInstruction {
 
 	private BooleanBinaryCPInstruction(Operator op, CPOperand in1, CPOperand in2, CPOperand out, String opcode,
 			String istr) {
-		super(op, in1, in2, out, opcode, istr);
-		_cptype = CPINSTRUCTION_TYPE.BooleanBinary;
+		super(CPType.BooleanBinary, op, in1, in2, out, opcode, istr);
 	}
 
 	public static BooleanBinaryCPInstruction parseInstruction (String str) 

http://git-wip-us.apache.org/repos/asf/systemml/blob/75b93f26/src/main/java/org/apache/sysml/runtime/instructions/cp/BooleanUnaryCPInstruction.java
----------------------------------------------------------------------
diff --git a/src/main/java/org/apache/sysml/runtime/instructions/cp/BooleanUnaryCPInstruction.java b/src/main/java/org/apache/sysml/runtime/instructions/cp/BooleanUnaryCPInstruction.java
index 9143179..e8d31c1 100644
--- a/src/main/java/org/apache/sysml/runtime/instructions/cp/BooleanUnaryCPInstruction.java
+++ b/src/main/java/org/apache/sysml/runtime/instructions/cp/BooleanUnaryCPInstruction.java
@@ -29,8 +29,7 @@ import org.apache.sysml.runtime.matrix.operators.SimpleOperator;
 public class BooleanUnaryCPInstruction extends UnaryCPInstruction {
 
 	private BooleanUnaryCPInstruction(Operator op, CPOperand in, CPOperand out, String opcode, String instr) {
-		super(op, in, out, opcode, instr);
-		_cptype = CPINSTRUCTION_TYPE.BooleanUnary;
+		super(CPType.BooleanUnary, op, in, out, opcode, instr);
 	}
 
 	public static BooleanUnaryCPInstruction parseInstruction (String str) 

http://git-wip-us.apache.org/repos/asf/systemml/blob/75b93f26/src/main/java/org/apache/sysml/runtime/instructions/cp/BreakPointInstruction.java
----------------------------------------------------------------------
diff --git a/src/main/java/org/apache/sysml/runtime/instructions/cp/BreakPointInstruction.java b/src/main/java/org/apache/sysml/runtime/instructions/cp/BreakPointInstruction.java
index 235a6f2..72dfd7e 100644
--- a/src/main/java/org/apache/sysml/runtime/instructions/cp/BreakPointInstruction.java
+++ b/src/main/java/org/apache/sysml/runtime/instructions/cp/BreakPointInstruction.java
@@ -43,7 +43,7 @@ public class BreakPointInstruction extends Instruction
 	 * Constructor for a breakpoint instruction
 	 */
 	public BreakPointInstruction() {
-		type = INSTRUCTION_TYPE.BREAKPOINT;
+		type = IType.BREAKPOINT;
 		bpStatus = BPINSTRUCTION_STATUS.ENABLED;
 	}
 
@@ -53,7 +53,7 @@ public class BreakPointInstruction extends Instruction
 	 * @param status Breakpoint instruction status
 	 */
 	public BreakPointInstruction(BPINSTRUCTION_STATUS status) {
-		type = INSTRUCTION_TYPE.BREAKPOINT;
+		type = IType.BREAKPOINT;
 		bpStatus = status;
 	}
 

http://git-wip-us.apache.org/repos/asf/systemml/blob/75b93f26/src/main/java/org/apache/sysml/runtime/instructions/cp/BuiltinBinaryCPInstruction.java
----------------------------------------------------------------------
diff --git a/src/main/java/org/apache/sysml/runtime/instructions/cp/BuiltinBinaryCPInstruction.java b/src/main/java/org/apache/sysml/runtime/instructions/cp/BuiltinBinaryCPInstruction.java
index 4f83714..eca6e94 100644
--- a/src/main/java/org/apache/sysml/runtime/instructions/cp/BuiltinBinaryCPInstruction.java
+++ b/src/main/java/org/apache/sysml/runtime/instructions/cp/BuiltinBinaryCPInstruction.java
@@ -29,19 +29,12 @@ import org.apache.sysml.runtime.matrix.operators.Operator;
 import org.apache.sysml.runtime.matrix.operators.RightScalarOperator;
 
 public abstract class BuiltinBinaryCPInstruction extends BinaryCPInstruction {
-	private int _arity;
 
-	protected BuiltinBinaryCPInstruction(Operator op, CPOperand in1, CPOperand in2, CPOperand out, int arity,
+	protected BuiltinBinaryCPInstruction(Operator op, CPOperand in1, CPOperand in2, CPOperand out,
 			String opcode, String istr) {
-		super(op, in1, in2, out, opcode, istr);
-		_cptype = CPINSTRUCTION_TYPE.BuiltinBinary;
-		_arity = arity;
+		super(CPType.BuiltinBinary, op, in1, in2, out, opcode, istr);
 	}
 
-	public int getArity() {
-		return _arity;
-	}
-	
 	public static BuiltinBinaryCPInstruction parseInstruction ( String str ) 
 		throws DMLRuntimeException {
 		CPOperand in1 = new CPOperand("", ValueType.UNKNOWN, DataType.UNKNOWN);

http://git-wip-us.apache.org/repos/asf/systemml/blob/75b93f26/src/main/java/org/apache/sysml/runtime/instructions/cp/BuiltinNary.java
----------------------------------------------------------------------
diff --git a/src/main/java/org/apache/sysml/runtime/instructions/cp/BuiltinNary.java b/src/main/java/org/apache/sysml/runtime/instructions/cp/BuiltinNary.java
deleted file mode 100644
index 1bacc70..0000000
--- a/src/main/java/org/apache/sysml/runtime/instructions/cp/BuiltinNary.java
+++ /dev/null
@@ -1,74 +0,0 @@
-/*
- * 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.Nary;
-import org.apache.sysml.runtime.DMLRuntimeException;
-import org.apache.sysml.runtime.functionobjects.Builtin;
-import org.apache.sysml.runtime.functionobjects.ValueFunction;
-import org.apache.sysml.runtime.instructions.InstructionUtils;
-import org.apache.sysml.runtime.matrix.operators.Operator;
-import org.apache.sysml.runtime.matrix.operators.SimpleOperator;
-
-/**
- * Instruction to handle a variable number of input operands. It parses an
- * instruction string to generate an object that is a subclass of
- * BuiltinMultipleCPInstruction. Currently the only subclass of
- * BuiltinMultipleCPInstruction is ScalarBuiltinMultipleCPInstruction. The
- * ScalarBuiltinMultipleCPInstruction class is responsible for printf-style
- * Java-based string formatting.
- *
- */
-public abstract class BuiltinNary extends CPInstruction 
-{
-	public CPOperand output;
-	public CPOperand[] inputs;
-
-	public BuiltinNary(Operator op, String opcode, String istr, CPOperand output, CPOperand... inputs) {
-		super(op, opcode, istr);
-		_cptype = CPINSTRUCTION_TYPE.BuiltinNary;
-		this.output = output;
-		this.inputs = inputs;
-	}
-
-	public static BuiltinNary parseInstruction(String str) throws DMLRuntimeException {
-		String[] parts = InstructionUtils.getInstructionPartsWithValueType(str);
-		String opcode = parts[0];
-		CPOperand outputOperand = new CPOperand(parts[parts.length - 1]);
-		CPOperand[] inputOperands = null;
-		if (parts.length > 2) {
-			inputOperands = new CPOperand[parts.length - 2];
-			for (int i = 1; i < parts.length-1; i++)
-				inputOperands[i-1] = new CPOperand(parts[i]);
-		}
-		
-		if( Nary.OperationType.PRINTF.name().equalsIgnoreCase(opcode) ) {
-			ValueFunction func = Builtin.getBuiltinFnObject(opcode);
-			return new ScalarBuiltinNaryCPInstruction(new SimpleOperator(func), 
-				opcode, str, outputOperand, inputOperands);
-		}
-		else if( opcode.equals("cbind") || opcode.equals("rbind") ) {
-			return new MatrixBuiltinNaryCPInstruction(null, 
-					opcode, str, outputOperand, inputOperands);
-		}
-		
-		throw new DMLRuntimeException("Opcode (" + opcode + ") not recognized in BuiltinMultipleCPInstruction");
-	}
-}

http://git-wip-us.apache.org/repos/asf/systemml/blob/75b93f26/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
new file mode 100644
index 0000000..1ed6055
--- /dev/null
+++ b/src/main/java/org/apache/sysml/runtime/instructions/cp/BuiltinNaryCPInstruction.java
@@ -0,0 +1,73 @@
+/*
+ * 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.Nary;
+import org.apache.sysml.runtime.DMLRuntimeException;
+import org.apache.sysml.runtime.functionobjects.Builtin;
+import org.apache.sysml.runtime.functionobjects.ValueFunction;
+import org.apache.sysml.runtime.instructions.InstructionUtils;
+import org.apache.sysml.runtime.matrix.operators.Operator;
+import org.apache.sysml.runtime.matrix.operators.SimpleOperator;
+
+/**
+ * Instruction to handle a variable number of input operands. It parses an
+ * instruction string to generate an object that is a subclass of
+ * BuiltinMultipleCPInstruction. Currently the only subclass of
+ * BuiltinMultipleCPInstruction is ScalarBuiltinMultipleCPInstruction. The
+ * ScalarBuiltinMultipleCPInstruction class is responsible for printf-style
+ * Java-based string formatting.
+ *
+ */
+public abstract class BuiltinNaryCPInstruction extends CPInstruction 
+{
+	protected final CPOperand output;
+	protected final CPOperand[] inputs;
+
+	public BuiltinNaryCPInstruction(Operator op, String opcode, String istr, CPOperand output, CPOperand... inputs) {
+		super(CPType.BuiltinNary, op, opcode, istr);
+		this.output = output;
+		this.inputs = inputs;
+	}
+
+	public static BuiltinNaryCPInstruction parseInstruction(String str) throws DMLRuntimeException {
+		String[] parts = InstructionUtils.getInstructionPartsWithValueType(str);
+		String opcode = parts[0];
+		CPOperand outputOperand = new CPOperand(parts[parts.length - 1]);
+		CPOperand[] inputOperands = null;
+		if (parts.length > 2) {
+			inputOperands = new CPOperand[parts.length - 2];
+			for (int i = 1; i < parts.length-1; i++)
+				inputOperands[i-1] = new CPOperand(parts[i]);
+		}
+		
+		if( Nary.OperationType.PRINTF.name().equalsIgnoreCase(opcode) ) {
+			ValueFunction func = Builtin.getBuiltinFnObject(opcode);
+			return new ScalarBuiltinNaryCPInstruction(new SimpleOperator(func), 
+				opcode, str, outputOperand, inputOperands);
+		}
+		else if( opcode.equals("cbind") || opcode.equals("rbind") ) {
+			return new MatrixBuiltinNaryCPInstruction(null, 
+					opcode, str, outputOperand, inputOperands);
+		}
+		
+		throw new DMLRuntimeException("Opcode (" + opcode + ") not recognized in BuiltinMultipleCPInstruction");
+	}
+}

http://git-wip-us.apache.org/repos/asf/systemml/blob/75b93f26/src/main/java/org/apache/sysml/runtime/instructions/cp/BuiltinUnaryCPInstruction.java
----------------------------------------------------------------------
diff --git a/src/main/java/org/apache/sysml/runtime/instructions/cp/BuiltinUnaryCPInstruction.java b/src/main/java/org/apache/sysml/runtime/instructions/cp/BuiltinUnaryCPInstruction.java
index 42db461..6b055a4 100644
--- a/src/main/java/org/apache/sysml/runtime/instructions/cp/BuiltinUnaryCPInstruction.java
+++ b/src/main/java/org/apache/sysml/runtime/instructions/cp/BuiltinUnaryCPInstruction.java
@@ -33,19 +33,11 @@ import org.apache.sysml.runtime.matrix.operators.UnaryOperator;
 
 public abstract class BuiltinUnaryCPInstruction extends UnaryCPInstruction {
 
-	int arity;
-
-	protected BuiltinUnaryCPInstruction(Operator op, CPOperand in, CPOperand out, int _arity, String opcode,
+	protected BuiltinUnaryCPInstruction(Operator op, CPOperand in, CPOperand out, String opcode,
 			String istr) {
-		super(op, in, out, opcode, istr);
-		_cptype = CPINSTRUCTION_TYPE.BuiltinUnary;
-		arity = _arity;
+		super(CPType.BuiltinUnary, op, in, out, opcode, istr);
 	}
 
-	public int getArity() {
-		return arity;
-	}
-	
 	public static BuiltinUnaryCPInstruction parseInstruction ( String str ) 
 		throws DMLRuntimeException 
 	{

http://git-wip-us.apache.org/repos/asf/systemml/blob/75b93f26/src/main/java/org/apache/sysml/runtime/instructions/cp/CPInstruction.java
----------------------------------------------------------------------
diff --git a/src/main/java/org/apache/sysml/runtime/instructions/cp/CPInstruction.java b/src/main/java/org/apache/sysml/runtime/instructions/cp/CPInstruction.java
index d7fc623..0b27768 100644
--- a/src/main/java/org/apache/sysml/runtime/instructions/cp/CPInstruction.java
+++ b/src/main/java/org/apache/sysml/runtime/instructions/cp/CPInstruction.java
@@ -29,7 +29,7 @@ import org.apache.sysml.runtime.matrix.operators.Operator;
 
 public abstract class CPInstruction extends Instruction 
 {
-	public enum CPINSTRUCTION_TYPE { INVALID, 
+	public enum CPType { INVALID, 
 		AggregateUnary, AggregateBinary, AggregateTernary, ArithmeticBinary, 
 		Ternary, Quaternary, BooleanBinary, BooleanUnary, BuiltinBinary, BuiltinUnary, BuiltinNary, 
 		MultiReturnParameterizedBuiltin, ParameterizedBuiltin, MultiReturnBuiltin, 
@@ -37,10 +37,9 @@ public abstract class CPInstruction extends Instruction
 		MatrixIndexing, MMTSJ, PMMJ, MMChain, MatrixReshape, Partition, Compression, SpoofFused,
 		StringInit, CentralMoment, Covariance, UaggOuterChain, Convolution }
 	
-	protected CPINSTRUCTION_TYPE _cptype;
-	protected Operator _optr;
-	
-	protected boolean _requiresLabelUpdate = false;
+	protected final CPType _cptype;
+	protected final Operator _optr;
+	protected final boolean _requiresLabelUpdate;
 	
 	// Generic miscellaneous timers that are applicable to all CP (and few SP) instructions 
 	public final static String MISC_TIMER_GET_SPARSE_MB =          		"aqrs";	// time spent in bringing input sparse matrix block
@@ -59,8 +58,14 @@ public abstract class CPInstruction extends Instruction
 	public final static String MISC_TIMER_CSR_LIX_COPY =				"csrlix";// time spent in CSR-specific method to address performance issues due to repeated re-shifting on update-in-place.
 	public final static String MISC_TIMER_LIX_COPY =					"lixcp";// time spent in range copy
 
-	protected CPInstruction(String opcode, String istr) {
-		type = INSTRUCTION_TYPE.CONTROL_PROGRAM;
+	protected CPInstruction(CPType type, String opcode, String istr) {
+		this(type, null, opcode, istr);
+	}
+
+	protected CPInstruction(CPType type, Operator op, String opcode, String istr) {
+		_cptype = type;
+		_optr = op;
+		super.type = IType.CONTROL_PROGRAM;
 		instString = istr;
 
 		// prepare opcode and update requirement for repeated usage
@@ -68,18 +73,12 @@ public abstract class CPInstruction extends Instruction
 		_requiresLabelUpdate = super.requiresLabelUpdate();
 	}
 
-	protected CPInstruction(Operator op, String opcode, String istr) {
-		this(opcode, istr);
-		_optr = op;
-	}
-
-	public CPINSTRUCTION_TYPE getCPInstructionType() {
+	public CPType getCPInstructionType() {
 		return _cptype;
 	}
 	
 	@Override
-	public boolean requiresLabelUpdate()
-	{
+	public boolean requiresLabelUpdate() {
 		return _requiresLabelUpdate;
 	}
 

http://git-wip-us.apache.org/repos/asf/systemml/blob/75b93f26/src/main/java/org/apache/sysml/runtime/instructions/cp/CPOperand.java
----------------------------------------------------------------------
diff --git a/src/main/java/org/apache/sysml/runtime/instructions/cp/CPOperand.java b/src/main/java/org/apache/sysml/runtime/instructions/cp/CPOperand.java
index 6fb5753..c39b617 100644
--- a/src/main/java/org/apache/sysml/runtime/instructions/cp/CPOperand.java
+++ b/src/main/java/org/apache/sysml/runtime/instructions/cp/CPOperand.java
@@ -28,7 +28,6 @@ import org.apache.sysml.runtime.instructions.Instruction;
 
 public class CPOperand 
 {
-	
 	private String _name;
 	private ValueType _valueType;
 	private DataType _dataType;
@@ -73,18 +72,6 @@ public class CPOperand
 	public void setName(String name) {
 		_name = name;
 	}
-	
-	public void setValueType(ValueType vt) {
-		_valueType = vt;
-	}
-	
-	public void setDataType(DataType dt) {
-		_dataType = dt;
-	}
-	
-	public void setLiteral(boolean literal) {
-		_isLiteral = literal;
-	}
 
 	public void split(String str){
 		String[] opr = str.split(Instruction.VALUETYPE_PREFIX);
@@ -106,12 +93,6 @@ public class CPOperand
 		}
 	}
 
-	public void copy(CPOperand o){
-		_name = o.getName();
-		_valueType = o.getValueType();
-		_dataType = o.getDataType();
-	}
-
 	@Override
 	public String toString() {
 		return ToStringBuilder.reflectionToString(this, ToStringStyle.SHORT_PREFIX_STYLE);

http://git-wip-us.apache.org/repos/asf/systemml/blob/75b93f26/src/main/java/org/apache/sysml/runtime/instructions/cp/CentralMomentCPInstruction.java
----------------------------------------------------------------------
diff --git a/src/main/java/org/apache/sysml/runtime/instructions/cp/CentralMomentCPInstruction.java b/src/main/java/org/apache/sysml/runtime/instructions/cp/CentralMomentCPInstruction.java
index b8ba345..aa3fd86 100644
--- a/src/main/java/org/apache/sysml/runtime/instructions/cp/CentralMomentCPInstruction.java
+++ b/src/main/java/org/apache/sysml/runtime/instructions/cp/CentralMomentCPInstruction.java
@@ -107,9 +107,8 @@ public class CentralMomentCPInstruction extends AggregateUnaryCPInstruction {
 		ScalarObject order = ec.getScalarInput(scalarInput.getName(), scalarInput.getValueType(), scalarInput.isLiteral()); 
 		
 		CMOperator cm_op = ((CMOperator)_optr); 
-		if ( cm_op.getAggOpType() == AggregateOperationTypes.INVALID ) {
-			((CMOperator)_optr).setCMAggOp((int)order.getLongValue());
-		}
+		if ( cm_op.getAggOpType() == AggregateOperationTypes.INVALID )
+			cm_op = cm_op.setCMAggOp((int)order.getLongValue());
 		
 		CM_COV_Object cmobj = null; 
 		if (input3 == null ) {
@@ -123,7 +122,7 @@ public class CentralMomentCPInstruction extends AggregateUnaryCPInstruction {
 		
 		ec.releaseMatrixInput(input1.getName(), getExtendedOpcode());
 		
-		double val = cmobj.getRequiredResult(_optr);
+		double val = cmobj.getRequiredResult(cm_op);
 		DoubleObject ret = new DoubleObject(output_name, val);
 		ec.setScalarOutput(output_name, ret);
 	}

http://git-wip-us.apache.org/repos/asf/systemml/blob/75b93f26/src/main/java/org/apache/sysml/runtime/instructions/cp/CompressionCPInstruction.java
----------------------------------------------------------------------
diff --git a/src/main/java/org/apache/sysml/runtime/instructions/cp/CompressionCPInstruction.java b/src/main/java/org/apache/sysml/runtime/instructions/cp/CompressionCPInstruction.java
index 6169076..d9f6c32 100644
--- a/src/main/java/org/apache/sysml/runtime/instructions/cp/CompressionCPInstruction.java
+++ b/src/main/java/org/apache/sysml/runtime/instructions/cp/CompressionCPInstruction.java
@@ -31,7 +31,7 @@ import org.apache.sysml.runtime.matrix.operators.Operator;
 public class CompressionCPInstruction extends UnaryCPInstruction {
 
 	private CompressionCPInstruction(Operator op, CPOperand in, CPOperand out, String opcode, String istr) {
-		super(op, in, null, null, out, opcode, istr);
+		super(CPType.Compression, op, in, null, null, out, opcode, istr);
 	}
 
 	public static Instruction parseInstruction(String str)
@@ -42,7 +42,7 @@ public class CompressionCPInstruction extends UnaryCPInstruction {
 		CPOperand in1 = new CPOperand(parts[1]);
 		CPOperand out = new CPOperand(parts[2]);
 		
-		return new CompressionCPInstruction(null, in1, out, opcode, str);				
+		return new CompressionCPInstruction(null, in1, out, opcode, str);
 	}
 	
 	@Override