[SYSTEMML-2049] Basic runtime integration new dense block abstraction

This patch modifies the entire matrix block runtime to use the new dense
block abstraction. So far, we still do not support large-dense blocks as
this requires a re-implementation of relevant operators. However, this
basic integration enables an incremental (operation-wise) handling.


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

Branch: refs/heads/master
Commit: e642469550d888695f151fe6dd57b95159507a16
Parents: 9526f7d
Author: Matthias Boehm <[email protected]>
Authored: Sat Dec 9 00:45:03 2017 -0800
Committer: Matthias Boehm <[email protected]>
Committed: Tue Dec 12 18:56:03 2017 -0800

----------------------------------------------------------------------
 .../sysml/parser/BuiltinFunctionExpression.java |   2 +-
 .../sysml/runtime/codegen/CodegenUtils.java     |   2 +-
 .../sysml/runtime/codegen/SpoofCellwise.java    |  86 ++-
 .../runtime/codegen/SpoofMultiAggregate.java    |   6 +-
 .../sysml/runtime/codegen/SpoofOperator.java    |   2 +-
 .../runtime/codegen/SpoofOuterProduct.java      |  29 +-
 .../sysml/runtime/codegen/SpoofRowwise.java     |  18 +-
 .../sysml/runtime/compress/ColGroupDDC.java     |   2 +-
 .../sysml/runtime/compress/ColGroupDDC1.java    |  14 +-
 .../sysml/runtime/compress/ColGroupDDC2.java    |  10 +-
 .../sysml/runtime/compress/ColGroupOLE.java     |  12 +-
 .../sysml/runtime/compress/ColGroupRLE.java     |  12 +-
 .../runtime/compress/ColGroupUncompressed.java  |  10 +-
 .../runtime/compress/CompressedMatrixBlock.java |   8 +-
 .../compress/utils/LinearAlgebraUtils.java      |   2 +-
 .../runtime/controlprogram/ProgramBlock.java    |   2 +-
 .../cp/ConvolutionCPInstruction.java            |   9 +-
 .../cp/MatrixIndexingCPInstruction.java         |   4 +-
 .../cp/MatrixMatrixBuiltinCPInstruction.java    |  17 +-
 .../instructions/gpu/context/GPUObject.java     |   7 +-
 .../mr/UaggOuterChainInstruction.java           |   4 +-
 .../spark/ConvolutionSPInstruction.java         |   3 +-
 .../spark/UaggOuterChainSPInstruction.java      |  12 +-
 .../spark/utils/RDDConverterUtils.java          |   2 +-
 .../spark/utils/RDDConverterUtilsExt.java       |   2 +-
 .../runtime/io/ReaderTextCellParallel.java      |   4 +-
 .../apache/sysml/runtime/io/WriterTextCell.java |   4 +-
 .../data/BinaryBlockToBinaryCellConverter.java  |   2 +-
 .../data/BinaryBlockToTextCellConverter.java    |   2 +-
 .../sysml/runtime/matrix/data/DenseBlock.java   |  54 ++
 .../runtime/matrix/data/DenseBlockDRB.java      |  74 ++-
 .../runtime/matrix/data/DenseBlockFactory.java  |   4 +
 .../runtime/matrix/data/DenseBlockLDRB.java     |  70 +-
 .../runtime/matrix/data/LibCommonsMath.java     |   6 +-
 .../sysml/runtime/matrix/data/LibMatrixAgg.java |  57 +-
 .../runtime/matrix/data/LibMatrixBincell.java   |  36 +-
 .../sysml/runtime/matrix/data/LibMatrixDNN.java |   8 +-
 .../LibMatrixDNNConv2dBackwardDataHelper.java   |   4 +-
 .../LibMatrixDNNConv2dBackwardFilterHelper.java |  10 +-
 .../matrix/data/LibMatrixDNNConv2dHelper.java   |  27 +-
 .../runtime/matrix/data/LibMatrixDNNHelper.java |  21 +-
 .../matrix/data/LibMatrixDNNIm2ColHelper.java   |   8 +-
 .../data/LibMatrixDNNPoolingBackwardHelper.java |  16 +-
 .../matrix/data/LibMatrixDNNPoolingHelper.java  |   6 +-
 .../data/LibMatrixDNNRotate180Helper.java       |   4 +-
 .../runtime/matrix/data/LibMatrixDatagen.java   |   6 +-
 .../runtime/matrix/data/LibMatrixMult.java      | 154 +++--
 .../runtime/matrix/data/LibMatrixNative.java    |  16 +-
 .../runtime/matrix/data/LibMatrixOuterAgg.java  |  48 +-
 .../runtime/matrix/data/LibMatrixReorg.java     |  71 +-
 .../sysml/runtime/matrix/data/MatrixBlock.java  | 640 +++++++++----------
 .../sysml/runtime/util/ConvolutionUtils.java    |   6 +-
 .../sysml/runtime/util/DataConverter.java       |  27 +-
 .../util/FastBufferedDataOutputStream.java      |  20 +-
 .../apache/sysml/runtime/util/SortUtils.java    |   2 +-
 .../org/apache/sysml/udf/lib/CumSumProd.java    |   8 +-
 .../apache/sysml/udf/lib/MultiInputCbind.java   |   4 +-
 .../org/apache/sysml/udf/lib/RowClassMeet.java  |   6 +-
 .../apache/sysml/udf/lib/SGDNesterovUpdate.java |  20 +-
 .../scala/org/apache/sysml/api/dl/Utils.scala   |   4 +-
 .../codegen/CPlanVectorPrimitivesTest.java      |  12 +-
 .../unary/matrix/SVDFactorizeTest.java          |  14 +-
 62 files changed, 941 insertions(+), 811 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/systemml/blob/e6424695/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 db1b638..ab6fb54 100644
--- a/src/main/java/org/apache/sysml/parser/BuiltinFunctionExpression.java
+++ b/src/main/java/org/apache/sysml/parser/BuiltinFunctionExpression.java
@@ -1291,7 +1291,7 @@ public class BuiltinFunctionExpression extends 
DataIdentifier
                }
                Expression [] temp = _args.clone();
                _args = new Expression[_args.length + 1];
-           System.arraycopy(temp, 0, _args, 0, temp.length);
+               System.arraycopy(temp, 0, _args, 0, temp.length);
        }
        
        @Override

http://git-wip-us.apache.org/repos/asf/systemml/blob/e6424695/src/main/java/org/apache/sysml/runtime/codegen/CodegenUtils.java
----------------------------------------------------------------------
diff --git a/src/main/java/org/apache/sysml/runtime/codegen/CodegenUtils.java 
b/src/main/java/org/apache/sysml/runtime/codegen/CodegenUtils.java
index 726e267..2e84eae 100644
--- a/src/main/java/org/apache/sysml/runtime/codegen/CodegenUtils.java
+++ b/src/main/java/org/apache/sysml/runtime/codegen/CodegenUtils.java
@@ -170,7 +170,7 @@ public class CodegenUtils
        public static SideInput createSideInput(MatrixBlock in) {
                SideInput ret = (in.isInSparseFormat() || !in.isAllocated()) ?
                        new SideInput(null, in, in.getNumColumns()) :
-                       new SideInput(in.getDenseBlock(), null, 
in.getNumColumns());
+                       new SideInput(in.getDenseBlockValues(), null, 
in.getNumColumns());
                return (ret.mdat != null) ? new SideInputSparseCell(ret) : ret;
        }
        

http://git-wip-us.apache.org/repos/asf/systemml/blob/e6424695/src/main/java/org/apache/sysml/runtime/codegen/SpoofCellwise.java
----------------------------------------------------------------------
diff --git a/src/main/java/org/apache/sysml/runtime/codegen/SpoofCellwise.java 
b/src/main/java/org/apache/sysml/runtime/codegen/SpoofCellwise.java
index 5acd5b4..8c7e14d 100644
--- a/src/main/java/org/apache/sysml/runtime/codegen/SpoofCellwise.java
+++ b/src/main/java/org/apache/sysml/runtime/codegen/SpoofCellwise.java
@@ -44,6 +44,7 @@ import org.apache.sysml.runtime.functionobjects.ValueFunction;
 import org.apache.sysml.runtime.instructions.cp.DoubleObject;
 import org.apache.sysml.runtime.instructions.cp.KahanObject;
 import org.apache.sysml.runtime.instructions.cp.ScalarObject;
+import org.apache.sysml.runtime.matrix.data.DenseBlock;
 import org.apache.sysml.runtime.matrix.data.IJV;
 import org.apache.sysml.runtime.matrix.data.LibMatrixMult;
 import org.apache.sysml.runtime.matrix.data.MatrixBlock;
@@ -260,15 +261,15 @@ public abstract class SpoofCellwise extends SpoofOperator 
implements Serializabl
                                        lnnz += task.get();
                                if( _type == CellType.COL_AGG ) {
                                        //aggregate partial results
-                                       double[] c = out.getDenseBlock();
+                                       double[] c = out.getDenseBlockValues();
                                        ValueFunction vfun = getAggFunction();
                                        if( vfun instanceof KahanFunction ) {
                                                for( ParExecTask task : tasks )
-                                                       
LibMatrixMult.vectAdd(task.getResult().getDenseBlock(), c, 0, 0, n);
+                                                       
LibMatrixMult.vectAdd(task.getResult().getDenseBlockValues(), c, 0, 0, n);
                                        }
                                        else {
                                                for( ParExecTask task : tasks ) 
{
-                                                       double[] tmp = 
task.getResult().getDenseBlock();
+                                                       double[] tmp = 
task.getResult().getDenseBlockValues();
                                                        for(int j=0; j<n; j++)
                                                                c[j] = 
vfun.execute(c[j], tmp[j]);
                                                }
@@ -290,11 +291,11 @@ public abstract class SpoofCellwise extends SpoofOperator 
implements Serializabl
        /////////
        //function dispatch
        
-       private long executeDense(double[] a, SideInput[] b, double[] scalars, 
+       private long executeDense(DenseBlock a, SideInput[] b, double[] 
scalars, 
                        MatrixBlock out, int m, int n, boolean sparseSafe, int 
rl, int ru) 
                throws DMLRuntimeException 
        {
-               double[] c = out.getDenseBlock();
+               double[] c = out.getDenseBlockValues();
                SideInput[] lb = createSparseSideInputs(b);
                
                if( _type == CellType.NO_AGG ) {
@@ -315,7 +316,7 @@ public abstract class SpoofCellwise extends SpoofOperator 
implements Serializabl
                return -1;
        }
        
-       private double executeDenseAndAgg(double[] a, SideInput[] b, double[] 
scalars, 
+       private double executeDenseAndAgg(DenseBlock a, SideInput[] b, double[] 
scalars, 
                        int m, int n, boolean sparseSafe, int rl, int ru) 
throws DMLRuntimeException 
        {
                SideInput[] lb = createSparseSideInputs(b);
@@ -385,14 +386,14 @@ public abstract class SpoofCellwise extends SpoofOperator 
implements Serializabl
                        return lnnz;
                }
                else if( _type == CellType.ROW_AGG ) {
-                       double[] c = out.getDenseBlock();
+                       double[] c = out.getDenseBlockValues();
                        if( _aggOp == AggOp.SUM || _aggOp == AggOp.SUM_SQ )
                                return executeCompressedRowAggSum(a, b, 
scalars, c, m, n, sparseSafe, rl, ru);
                        else
                                return executeCompressedRowAggMxx(a, b, 
scalars, c, m, n, sparseSafe, rl, ru);
                }
                else if( _type == CellType.COL_AGG ) {
-                       double[] c = out.getDenseBlock();
+                       double[] c = out.getDenseBlockValues();
                        if( _aggOp == AggOp.SUM || _aggOp == AggOp.SUM_SQ )
                                return executeCompressedColAggSum(a, b, 
scalars, c, m, n, sparseSafe, rl, ru);
                        else
@@ -417,14 +418,16 @@ public abstract class SpoofCellwise extends SpoofOperator 
implements Serializabl
        /////////
        //core operator skeletons for dense, sparse, and compressed
 
-       private long executeDenseNoAgg(double[] a, SideInput[] b, double[] 
scalars,
+       private long executeDenseNoAgg(DenseBlock a, SideInput[] b, double[] 
scalars,
                        double[] c, int m, int n, boolean sparseSafe, int rl, 
int ru)
                throws DMLRuntimeException
        {
+               double[] data = (a != null) ? a.values(0) : null;
+               
                long lnnz = 0;
                for( int i=rl, ix=rl*n; i<ru; i++ )
                        for( int j=0; j<n; j++, ix++ ) {
-                               double aval = (a != null) ? a[ix] : 0;
+                               double aval = (data != null) ? data[ix] : 0;
                                if( aval != 0 || !sparseSafe) {
                                        c[ix] = genexec( aval, b, scalars, m, 
n, i, j);
                                        lnnz += (c[ix]!=0) ? 1 : 0;
@@ -433,16 +436,18 @@ public abstract class SpoofCellwise extends SpoofOperator 
implements Serializabl
                return lnnz;
        }
        
-       private long executeDenseRowAggSum(double[] a, SideInput[] b, double[] 
scalars,
+       private long executeDenseRowAggSum(DenseBlock a, SideInput[] b, 
double[] scalars,
                double[] c, int m, int n, boolean sparseSafe, int rl, int ru)
        {
+               double[] data = (a != null) ? a.values(0) : null;
+               
                KahanFunction kplus = (KahanFunction) getAggFunction();
                KahanObject kbuff = new KahanObject(0, 0);
                long lnnz = 0;
                for( int i=rl, ix=rl*n; i<ru; i++ ) {
                        kbuff.set(0, 0);
                        for( int j=0; j<n; j++, ix++ ) {
-                               double aval = (a != null) ? a[ix] : 0;
+                               double aval = (data != null) ? data[ix] : 0;
                                if( aval != 0 || !sparseSafe)
                                        kplus.execute2(kbuff, genexec(aval, b, 
scalars, m, n, i, j));
                        }
@@ -451,14 +456,16 @@ public abstract class SpoofCellwise extends SpoofOperator 
implements Serializabl
                return lnnz;
        }
        
-       private long executeDenseRowAggMxx(double[] a, SideInput[] b, double[] 
scalars,
+       private long executeDenseRowAggMxx(DenseBlock a, SideInput[] b, 
double[] scalars,
                        double[] c, int m, int n, boolean sparseSafe, int rl, 
int ru)
                throws DMLRuntimeException 
        {
+               double[] data = (a != null) ? a.values(0) : null;
+               
                double initialVal = (_aggOp==AggOp.MIN) ? Double.MAX_VALUE : 
-Double.MAX_VALUE;
                ValueFunction vfun = getAggFunction();
                long lnnz = 0;
-               if( a == null && !sparseSafe ) { //empty
+               if( data == null && !sparseSafe ) { //empty
                        for( int i=rl; i<ru; i++ ) {
                                double tmp = initialVal;
                                for( int j=0; j<n; j++ )
@@ -466,13 +473,13 @@ public abstract class SpoofCellwise extends SpoofOperator 
implements Serializabl
                                lnnz += ((c[i] = tmp)!=0) ? 1 : 0;
                        }
                }
-               else if( a != null ) { //general case
+               else if( data != null ) { //general case
                        for( int i=rl, ix=rl*n; i<ru; i++ ) {
                                double tmp = initialVal;
                                for( int j=0; j<n; j++, ix++ )
-                                       if( a[ix] != 0 || !sparseSafe)
-                                               tmp = vfun.execute(tmp, 
genexec(a[ix], b, scalars, m, n, i, j));
-                               if( sparseSafe && UtilFunctions.containsZero(a, 
ix-n, n) )
+                                       if( data[ix] != 0 || !sparseSafe)
+                                               tmp = vfun.execute(tmp, 
genexec(data[ix], b, scalars, m, n, i, j));
+                               if( sparseSafe && 
UtilFunctions.containsZero(data, ix-n, n) )
                                        tmp = vfun.execute(tmp, 0);
                                lnnz += ((c[i] = tmp)!=0) ? 1 : 0;
                        }
@@ -480,16 +487,18 @@ public abstract class SpoofCellwise extends SpoofOperator 
implements Serializabl
                return lnnz;
        }
        
-       private long executeDenseColAggSum(double[] a, SideInput[] b, double[] 
scalars,
+       private long executeDenseColAggSum(DenseBlock a, SideInput[] b, 
double[] scalars,
                double[] c, int m, int n, boolean sparseSafe, int rl, int ru)
        {
+               double[] data = (a != null) ? a.values(0) : null;
+               
                KahanFunction kplus = (KahanFunction) getAggFunction();
                KahanObject kbuff = new KahanObject(0, 0);
                double[] corr = new double[n];
                
                for( int i=rl, ix=rl*n; i<ru; i++ )
                        for( int j=0; j<n; j++, ix++ ) {
-                               double aval = (a != null) ? a[ix] : 0;
+                               double aval = (data != null) ? data[ix] : 0;
                                if( aval != 0 || !sparseSafe) {
                                        kbuff.set(c[j], corr[j]);
                                        kplus.execute2(kbuff, genexec(aval, b, 
scalars, m, n, i, j));
@@ -500,25 +509,27 @@ public abstract class SpoofCellwise extends SpoofOperator 
implements Serializabl
                return -1;
        }
        
-       private long executeDenseColAggMxx(double[] a, SideInput[] b, double[] 
scalars,
+       private long executeDenseColAggMxx(DenseBlock a, SideInput[] b, 
double[] scalars,
                        double[] c, int m, int n, boolean sparseSafe, int rl, 
int ru)
                throws DMLRuntimeException 
        {
+               double[] data = (a != null) ? a.values(0) : null;
+               
                double initialVal = (_aggOp==AggOp.MIN) ? Double.MAX_VALUE : 
-Double.MAX_VALUE;
                ValueFunction vfun = getAggFunction();
                Arrays.fill(c, initialVal);
                
-               if( a == null && !sparseSafe ) { //empty
+               if( data == null && !sparseSafe ) { //empty
                        for( int i=rl; i<ru; i++ )
                                for( int j=0; j<n; j++ )
                                        c[j] = vfun.execute(c[j], genexec(0, b, 
scalars, m, n, i, j));
                }
-               else if( a != null ) { //general case
+               else if( data != null ) { //general case
                        int[] counts = new int[n];
                        for( int i=rl, ix=rl*n; i<ru; i++ )
                                for( int j=0; j<n; j++, ix++ )
-                                       if( a[ix] != 0 || !sparseSafe) {
-                                               c[j] = vfun.execute(c[j], 
genexec(a[ix], b, scalars, m, n, i, j));
+                                       if( data[ix] != 0 || !sparseSafe) {
+                                               c[j] = vfun.execute(c[j], 
genexec(data[ix], b, scalars, m, n, i, j));
                                                counts[j] ++;
                                        }
                        if( sparseSafe )
@@ -529,26 +540,30 @@ public abstract class SpoofCellwise extends SpoofOperator 
implements Serializabl
                return -1;
        }
        
-       private double executeDenseAggSum(double[] a, SideInput[] b, double[] 
scalars,
+       private double executeDenseAggSum(DenseBlock a, SideInput[] b, double[] 
scalars,
                        int m, int n, boolean sparseSafe, int rl, int ru)
                throws DMLRuntimeException 
        {
+               double[] data = (a != null) ? a.values(0) : null;
+               
                KahanFunction kplus = (KahanFunction) getAggFunction();
                KahanObject kbuff = new KahanObject(0, 0);
                
                for( int i=rl, ix=rl*n; i<ru; i++ ) 
                        for( int j=0; j<n; j++, ix++ ) {
-                               double aval = (a != null) ? a[ix] : 0;
+                               double aval = (data != null) ? data[ix] : 0;
                                if( aval != 0 || !sparseSafe)
                                        kplus.execute2(kbuff, genexec(aval, b, 
scalars, m, n, i, j));
                        }
                return kbuff._sum;
        }
        
-       private double executeDenseAggMxx(double[] a, SideInput[] b, double[] 
scalars,
+       private double executeDenseAggMxx(DenseBlock a, SideInput[] b, double[] 
scalars,
                        int m, int n, boolean sparseSafe, int rl, int ru)
                throws DMLRuntimeException 
        {
+               double[] data = (a != null) ? a.values(0) : null;
+               
                //safe aggregation for min/max w/ handling of zero entries
                //note: sparse safe with zero value as min/max handled outside
                double ret = (_aggOp==AggOp.MIN) ? Double.MAX_VALUE : 
-Double.MAX_VALUE; 
@@ -556,7 +571,7 @@ public abstract class SpoofCellwise extends SpoofOperator 
implements Serializabl
                
                for( int i=rl, ix=rl*n; i<ru; i++ ) 
                        for( int j=0; j<n; j++, ix++ ) {
-                               double aval = (a != null) ? a[ix] : 0;
+                               double aval = (data != null) ? data[ix] : 0;
                                if( aval != 0 || !sparseSafe)
                                        ret = vfun.execute(ret, genexec(aval, 
b, scalars, m, n, i, j));
                        }
@@ -606,7 +621,7 @@ public abstract class SpoofCellwise extends SpoofOperator 
implements Serializabl
        {
                //note: sequential scan algorithm for both sparse-safe and 
-unsafe
                //in order to avoid binary search for sparse-unsafe
-               double[] c = out.getDenseBlock();
+               double[] c = out.getDenseBlockValues();
                long lnnz = 0;
                for(int i=rl, cix=rl*n; i<ru; i++, cix+=n) {
                        int lastj = -1;
@@ -643,7 +658,7 @@ public abstract class SpoofCellwise extends SpoofOperator 
implements Serializabl
 
                //note: sequential scan algorithm for both sparse-safe and 
-unsafe
                //in order to avoid binary search for sparse-unsafe
-               double[] c = out.getDenseBlock();
+               double[] c = out.getDenseBlockValues();
                long lnnz = 0;
                for(int i=rl; i<ru; i++) {
                        kbuff.set(0, 0);
@@ -682,7 +697,7 @@ public abstract class SpoofCellwise extends SpoofOperator 
implements Serializabl
                
                //note: sequential scan algorithm for both sparse-safe and 
-unsafe 
                //in order to avoid binary search for sparse-unsafe 
-               double[] c = out.getDenseBlock();
+               double[] c = out.getDenseBlockValues();
                long lnnz = 0;
                for(int i=rl; i<ru; i++) {
                        double tmp = (sparseSafe && sblock.size(i) < n) ? 0 : 
initialVal;
@@ -722,7 +737,7 @@ public abstract class SpoofCellwise extends SpoofOperator 
implements Serializabl
                
                //note: sequential scan algorithm for both sparse-safe and 
-unsafe
                //in order to avoid binary search for sparse-unsafe
-               double[] c = out.getDenseBlock();
+               double[] c = out.getDenseBlockValues();
                for(int i=rl; i<ru; i++) {
                        kbuff.set(0, 0);
                        int lastj = -1;
@@ -767,7 +782,7 @@ public abstract class SpoofCellwise extends SpoofOperator 
implements Serializabl
        {
                double initialVal = (_aggOp==AggOp.MIN) ? Double.MAX_VALUE : 
-Double.MAX_VALUE;
                ValueFunction vfun = getAggFunction();
-               double[] c = out.getDenseBlock();
+               double[] c = out.getDenseBlockValues();
                Arrays.fill(c, initialVal);
                int[] count = new int[n];
                
@@ -878,7 +893,8 @@ public abstract class SpoofCellwise extends SpoofOperator 
implements Serializabl
                        MatrixBlock out, int m, int n, boolean sparseSafe, int 
rl, int ru)
                throws DMLRuntimeException
        {
-               double[] c = out.getDenseBlock();
+               double[] c = (out.getDenseBlock() != null) ?
+                       out.getDenseBlockValues() : null;
                SparseBlock csblock = out.getSparseBlock();
                
                //preallocate sparse rows to avoid reallocations

http://git-wip-us.apache.org/repos/asf/systemml/blob/e6424695/src/main/java/org/apache/sysml/runtime/codegen/SpoofMultiAggregate.java
----------------------------------------------------------------------
diff --git 
a/src/main/java/org/apache/sysml/runtime/codegen/SpoofMultiAggregate.java 
b/src/main/java/org/apache/sysml/runtime/codegen/SpoofMultiAggregate.java
index 64dd5c5..c141b2d 100644
--- a/src/main/java/org/apache/sysml/runtime/codegen/SpoofMultiAggregate.java
+++ b/src/main/java/org/apache/sysml/runtime/codegen/SpoofMultiAggregate.java
@@ -94,7 +94,7 @@ public abstract class SpoofMultiAggregate extends 
SpoofOperator implements Seria
                //result allocation and preparations
                out.reset(1, _aggOps.length, false);
                out.allocateDenseBlock();
-               double[] c = out.getDenseBlock();
+               double[] c = out.getDenseBlockValues();
                setInitialOutputValues(c);
                
                //input preparation
@@ -109,7 +109,7 @@ public abstract class SpoofMultiAggregate extends 
SpoofOperator implements Seria
                        if( inputs.get(0) instanceof CompressedMatrixBlock )
                                
executeCompressed((CompressedMatrixBlock)inputs.get(0), b, scalars, c, m, n, 0, 
m);
                        else if( !inputs.get(0).isInSparseFormat() )
-                               executeDense(inputs.get(0).getDenseBlock(), b, 
scalars, c, m, n, 0, m);
+                               
executeDense(inputs.get(0).getDenseBlockValues(), b, scalars, c, m, n, 0, m);
                        else    
                                executeSparse(inputs.get(0).getSparseBlock(), 
b, scalars, c, m, n, sparseSafe, 0, m);
                }
@@ -307,7 +307,7 @@ public abstract class SpoofMultiAggregate extends 
SpoofOperator implements Seria
                        if( _a instanceof CompressedMatrixBlock )
                                executeCompressed((CompressedMatrixBlock)_a, 
_b, _scalars, c, _rlen, _clen, _rl, _ru);
                        else if( !_a.isInSparseFormat() )
-                               executeDense(_a.getDenseBlock(), _b, _scalars, 
c, _rlen, _clen, _rl, _ru);
+                               executeDense(_a.getDenseBlockValues(), _b, 
_scalars, c, _rlen, _clen, _rl, _ru);
                        else    
                                executeSparse(_a.getSparseBlock(), _b, 
_scalars, c, _rlen, _clen, _safe, _rl, _ru);
                        return c;

http://git-wip-us.apache.org/repos/asf/systemml/blob/e6424695/src/main/java/org/apache/sysml/runtime/codegen/SpoofOperator.java
----------------------------------------------------------------------
diff --git a/src/main/java/org/apache/sysml/runtime/codegen/SpoofOperator.java 
b/src/main/java/org/apache/sysml/runtime/codegen/SpoofOperator.java
index 4505c3e..2267a47 100644
--- a/src/main/java/org/apache/sysml/runtime/codegen/SpoofOperator.java
+++ b/src/main/java/org/apache/sysml/runtime/codegen/SpoofOperator.java
@@ -112,7 +112,7 @@ public abstract class SpoofOperator implements Serializable
                        }
                        else {
                                b[i-offset] = new SideInput(
-                                       in.getDenseBlock(), null, clen);
+                                       in.getDenseBlockValues(), null, clen);
                        }
                }
                

http://git-wip-us.apache.org/repos/asf/systemml/blob/e6424695/src/main/java/org/apache/sysml/runtime/codegen/SpoofOuterProduct.java
----------------------------------------------------------------------
diff --git 
a/src/main/java/org/apache/sysml/runtime/codegen/SpoofOuterProduct.java 
b/src/main/java/org/apache/sysml/runtime/codegen/SpoofOuterProduct.java
index e99ebe1..6919655 100644
--- a/src/main/java/org/apache/sysml/runtime/codegen/SpoofOuterProduct.java
+++ b/src/main/java/org/apache/sysml/runtime/codegen/SpoofOuterProduct.java
@@ -97,10 +97,10 @@ public abstract class SpoofOuterProduct extends 
SpoofOperator
                if( a instanceof CompressedMatrixBlock )
                        executeCellwiseCompressed((CompressedMatrixBlock)a, 
ab[0], ab[1], b, scalars, out, m, n, k, _outerProductType, 0, m, 0, n);
                else if( !a.isInSparseFormat() )
-                       executeCellwiseDense(a.getDenseBlock(), ab[0], ab[1], 
b, scalars, out.getDenseBlock(), m, n, k, _outerProductType, 0, m, 0, n);
+                       executeCellwiseDense(a.getDenseBlockValues(), ab[0], 
ab[1], b, scalars, out.getDenseBlockValues(), m, n, k, _outerProductType, 0, m, 
0, n);
                else
                        executeCellwiseSparse(a.getSparseBlock(), ab[0], ab[1], 
b, scalars, out, m, n, k, a.getNonZeros(), _outerProductType, 0, m, 0, n);
-               return new DoubleObject(out.getDenseBlock()[0]);
+               return new DoubleObject(out.getDenseBlock().get(0, 0));
        }
        
        @Override
@@ -200,19 +200,19 @@ public abstract class SpoofOuterProduct extends 
SpoofOperator
                        case LEFT_OUTER_PRODUCT:
                        case RIGHT_OUTER_PRODUCT:
                                if( a instanceof CompressedMatrixBlock )
-                                       
executeCompressed((CompressedMatrixBlock)a, ab[0], ab[1], b, scalars, 
out.getDenseBlock(), 
+                                       
executeCompressed((CompressedMatrixBlock)a, ab[0], ab[1], b, scalars, 
out.getDenseBlockValues(), 
                                                m, n, k, _outerProductType, 0, 
m, 0, ((CompressedMatrixBlock)a).getNumColGroups());
                                else if( !a.isInSparseFormat() )
-                                       executeDense(a.getDenseBlock(), ab[0], 
ab[1], b, scalars, out.getDenseBlock(), m, n, k, _outerProductType, 0, m, 0, n);
+                                       executeDense(a.getDenseBlockValues(), 
ab[0], ab[1], b, scalars, out.getDenseBlockValues(), m, n, k, 
_outerProductType, 0, m, 0, n);
                                else
-                                       executeSparse(a.getSparseBlock(), 
ab[0], ab[1], b, scalars, out.getDenseBlock(), m, n, k, a.getNonZeros(), 
_outerProductType, 0, m, 0, n);
+                                       executeSparse(a.getSparseBlock(), 
ab[0], ab[1], b, scalars, out.getDenseBlockValues(), m, n, k, a.getNonZeros(), 
_outerProductType, 0, m, 0, n);
                                break;
                                
                        case CELLWISE_OUTER_PRODUCT:
                                if( a instanceof CompressedMatrixBlock )
                                        
executeCellwiseCompressed((CompressedMatrixBlock)a, ab[0], ab[1], b, scalars, 
out, m, n, k, _outerProductType, 0, m, 0, n);
                                else if( !a.isInSparseFormat() )
-                                       executeCellwiseDense(a.getDenseBlock(), 
ab[0], ab[1], b, scalars, out.getDenseBlock(), m, n, k, _outerProductType, 0, 
m, 0, n);
+                                       
executeCellwiseDense(a.getDenseBlockValues(), ab[0], ab[1], b, scalars, 
out.getDenseBlockValues(), m, n, k, _outerProductType, 0, m, 0, n);
                                else 
                                        
executeCellwiseSparse(a.getSparseBlock(), ab[0], ab[1], b, scalars, out, m, n, 
k, a.getNonZeros(), _outerProductType, 0, m, 0, n);
                                break;
@@ -485,7 +485,7 @@ public abstract class SpoofOuterProduct extends 
SpoofOperator
                
                if( !out.isInSparseFormat() ) //DENSE
                {
-                       double[] c = out.getDenseBlock();
+                       double[] c = out.getDenseBlockValues();
                        double tmp = 0;
                        for( int bi=rl; bi<ru; bi+=blocksizeIJ ) {
                                int bimin = Math.min(ru, bi+blocksizeIJ);
@@ -569,7 +569,8 @@ public abstract class SpoofOuterProduct extends 
SpoofOperator
                //NOTE: we don't create sparse side inputs w/ row-major cursors 
because 
                //compressed data is access in a column-major order 
                
-               double[] c = out.getDenseBlock();
+               double[] c = (out.getDenseBlock() != null) ?
+                       out.getDenseBlockValues() : null;
                SparseBlock csblock = out.getSparseBlock();
                
                Iterator<IJV> iter = a.getIterator(rl, ru, false);
@@ -641,17 +642,17 @@ public abstract class SpoofOuterProduct extends 
SpoofOperator
                                case LEFT_OUTER_PRODUCT:
                                case RIGHT_OUTER_PRODUCT:
                                        if( _a instanceof CompressedMatrixBlock 
)
-                                               
executeCompressed((CompressedMatrixBlock)_a, _u, _v, _b, _scalars, 
_c.getDenseBlock(), _rlen, _clen, _k, _type, _rl, _ru, _cl, _cu);
+                                               
executeCompressed((CompressedMatrixBlock)_a, _u, _v, _b, _scalars, 
_c.getDenseBlockValues(), _rlen, _clen, _k, _type, _rl, _ru, _cl, _cu);
                                        else if( !_a.isInSparseFormat() )
-                                               
executeDense(_a.getDenseBlock(), _u, _v, _b, _scalars, _c.getDenseBlock(), 
_rlen, _clen, _k, _type, _rl, _ru, _cl, _cu);
+                                               
executeDense(_a.getDenseBlockValues(), _u, _v, _b, _scalars, 
_c.getDenseBlockValues(), _rlen, _clen, _k, _type, _rl, _ru, _cl, _cu);
                                        else
-                                               
executeSparse(_a.getSparseBlock(), _u, _v, _b, _scalars, _c.getDenseBlock(), 
_rlen, _clen, _k, _a.getNonZeros(), _type,  _rl, _ru, _cl, _cu);
+                                               
executeSparse(_a.getSparseBlock(), _u, _v, _b, _scalars, 
_c.getDenseBlockValues(), _rlen, _clen, _k, _a.getNonZeros(), _type,  _rl, _ru, 
_cl, _cu);
                                        break;
                                case CELLWISE_OUTER_PRODUCT:
                                        if( _a instanceof CompressedMatrixBlock 
)
                                                
executeCellwiseCompressed((CompressedMatrixBlock)_a, _u, _v, _b, _scalars, _c, 
_rlen, _clen, _k, _type, _rl, _ru, _cl, _cu);
                                        else if( !_c.isInSparseFormat() )
-                                               
executeCellwiseDense(_a.getDenseBlock(), _u, _v, _b, _scalars, 
_c.getDenseBlock(), _rlen, _clen, _k, _type, _rl, _ru, _cl, _cu);
+                                               
executeCellwiseDense(_a.getDenseBlockValues(), _u, _v, _b, _scalars, 
_c.getDenseBlockValues(), _rlen, _clen, _k, _type, _rl, _ru, _cl, _cu);
                                        else 
                                                
executeCellwiseSparse(_a.getSparseBlock(), _u, _v, _b, _scalars, _c, _rlen, 
_clen, _k, _a.getNonZeros(), _type,  _rl, _ru, _cl, _cu);
                                        break;
@@ -706,10 +707,10 @@ public abstract class SpoofOuterProduct extends 
SpoofOperator
                        if( _a instanceof CompressedMatrixBlock )
                                
executeCellwiseCompressed((CompressedMatrixBlock)_a, _u, _v, _b, _scalars, out, 
_rlen, _clen, _k, _type, _rl, _ru, _cl, _cu);
                        else if( !_a.isInSparseFormat() )
-                               executeCellwiseDense(_a.getDenseBlock(), _u, 
_v, _b, _scalars, out.getDenseBlock(), _rlen, _clen, _k, _type, _rl, _ru, _cl, 
_cu);
+                               executeCellwiseDense(_a.getDenseBlockValues(), 
_u, _v, _b, _scalars, out.getDenseBlockValues(), _rlen, _clen, _k, _type, _rl, 
_ru, _cl, _cu);
                        else
                                executeCellwiseSparse(_a.getSparseBlock(), _u, 
_v, _b, _scalars, out, _rlen, _clen, _k, _a.getNonZeros(), _type, _rl, _ru, 
_cl, _cu);
-                       return out.getDenseBlock()[0];
+                       return out.quickGetValue(0, 0);
                }
        }
 }

http://git-wip-us.apache.org/repos/asf/systemml/blob/e6424695/src/main/java/org/apache/sysml/runtime/codegen/SpoofRowwise.java
----------------------------------------------------------------------
diff --git a/src/main/java/org/apache/sysml/runtime/codegen/SpoofRowwise.java 
b/src/main/java/org/apache/sysml/runtime/codegen/SpoofRowwise.java
index 150b45e..c40be9f 100644
--- a/src/main/java/org/apache/sysml/runtime/codegen/SpoofRowwise.java
+++ b/src/main/java/org/apache/sysml/runtime/codegen/SpoofRowwise.java
@@ -33,6 +33,7 @@ import org.apache.sysml.runtime.compress.BitmapEncoder;
 import org.apache.sysml.runtime.compress.CompressedMatrixBlock;
 import org.apache.sysml.runtime.instructions.cp.DoubleObject;
 import org.apache.sysml.runtime.instructions.cp.ScalarObject;
+import org.apache.sysml.runtime.matrix.data.DenseBlock;
 import org.apache.sysml.runtime.matrix.data.LibMatrixMult;
 import org.apache.sysml.runtime.matrix.data.LibMatrixReorg;
 import org.apache.sysml.runtime.matrix.data.MatrixBlock;
@@ -137,7 +138,7 @@ public abstract class SpoofRowwise extends SpoofOperator
                        getMinColsMatrixSideInputs(inputs) : -1;
                if( !aggIncr || !out.isAllocated() )
                        allocateOutputMatrix(m, n, n2, out);
-               double[] c = out.getDenseBlock();
+               double[] c = out.getDenseBlockValues();
                final boolean flipOut = _type.isRowTypeB1ColumnAgg()
                        && LibSpoofPrimitives.isFlipOuter(out.getNumRows(), 
out.getNumColumns());
                
@@ -218,7 +219,7 @@ public abstract class SpoofRowwise extends SpoofOperator
                                //aggregate partial results
                                int len = _type.isColumnAgg() ? 
out.getNumRows()*out.getNumColumns() : 1;
                                for( Future<double[]> task : taskret )
-                                       LibMatrixMult.vectAdd(task.get(), 
out.getDenseBlock(), 0, 0, len);
+                                       LibMatrixMult.vectAdd(task.get(), 
out.getDenseBlockValues(), 0, 0, len);
                                out.recomputeNonZeros();
                        }
                        else {
@@ -286,15 +287,16 @@ public abstract class SpoofRowwise extends SpoofOperator
                out.setNumColumns(rlen);
        }
        
-       private void executeDense(double[] a, SideInput[] b, double[] scalars, 
double[] c, int n, int rl, int ru) 
+       private void executeDense(DenseBlock a, SideInput[] b, double[] 
scalars, double[] c, int n, int rl, int ru) 
        {
-               if( a == null )
+               double[] data = (a != null) ? a.values(0) : null;
+               if( data == null )
                        return;
                
                SideInput[] lb = createSparseSideInputs(b, true);
                for( int i=rl, aix=rl*n; i<ru; i++, aix+=n ) {
                        //call generated method
-                       genexec( a, aix, lb, scalars, c, n, i );
+                       genexec( data, aix, lb, scalars, c, n, i );
                }
        }
        
@@ -414,11 +416,11 @@ public abstract class SpoofRowwise extends SpoofOperator
                                
LibSpoofPrimitives.setupThreadLocalMemory(_reqVectMem, _clen, _clen2);
                        
                        if( _a instanceof CompressedMatrixBlock )
-                               executeCompressed((CompressedMatrixBlock)_a, 
_b, _scalars, _c.getDenseBlock(), _clen, _rl, _ru);
+                               executeCompressed((CompressedMatrixBlock)_a, 
_b, _scalars, _c.getDenseBlockValues(), _clen, _rl, _ru);
                        else if( !_a.isInSparseFormat() )
-                               executeDense(_a.getDenseBlock(), _b, _scalars, 
_c.getDenseBlock(), _clen, _rl, _ru);
+                               executeDense(_a.getDenseBlock(), _b, _scalars, 
_c.getDenseBlockValues(), _clen, _rl, _ru);
                        else
-                               executeSparse(_a.getSparseBlock(), _b, 
_scalars, _c.getDenseBlock(), _clen, _rl, _ru);
+                               executeSparse(_a.getSparseBlock(), _b, 
_scalars, _c.getDenseBlockValues(), _clen, _rl, _ru);
                        
                        if( _reqVectMem > 0 )
                                LibSpoofPrimitives.cleanupThreadLocalMemory();

http://git-wip-us.apache.org/repos/asf/systemml/blob/e6424695/src/main/java/org/apache/sysml/runtime/compress/ColGroupDDC.java
----------------------------------------------------------------------
diff --git a/src/main/java/org/apache/sysml/runtime/compress/ColGroupDDC.java 
b/src/main/java/org/apache/sysml/runtime/compress/ColGroupDDC.java
index d261f96..9973ec2 100644
--- a/src/main/java/org/apache/sysml/runtime/compress/ColGroupDDC.java
+++ b/src/main/java/org/apache/sysml/runtime/compress/ColGroupDDC.java
@@ -194,7 +194,7 @@ public abstract class ColGroupDDC extends ColGroupValue
        }
        
        protected void computeRowMxx(MatrixBlock result, Builtin builtin, int 
rl, int ru) {
-               double[] c = result.getDenseBlock();
+               double[] c = result.getDenseBlockValues();
                int ncol = getNumCols();
                
                for( int i=rl; i<ru; i++ )

http://git-wip-us.apache.org/repos/asf/systemml/blob/e6424695/src/main/java/org/apache/sysml/runtime/compress/ColGroupDDC1.java
----------------------------------------------------------------------
diff --git a/src/main/java/org/apache/sysml/runtime/compress/ColGroupDDC1.java 
b/src/main/java/org/apache/sysml/runtime/compress/ColGroupDDC1.java
index 63ab3e7..e14f27f 100644
--- a/src/main/java/org/apache/sysml/runtime/compress/ColGroupDDC1.java
+++ b/src/main/java/org/apache/sysml/runtime/compress/ColGroupDDC1.java
@@ -195,7 +195,7 @@ public class ColGroupDDC1 extends ColGroupDDC
        public void decompressToBlock(MatrixBlock target, int colpos) {
                int nrow = getNumRows();
                int ncol = getNumCols();
-               double[] c = target.getDenseBlock();
+               double[] c = target.getDenseBlockValues();
                int nnz = 0;
                for( int i = 0; i < nrow; i++ )
                        nnz += ((c[i] = 
_values[(_data[i]&0xFF)*ncol+colpos])!=0) ? 1 : 0;
@@ -237,7 +237,7 @@ public class ColGroupDDC1 extends ColGroupDDC
                throws DMLRuntimeException 
        {
                double[] b = ConverterUtils.getDenseVector(vector);
-               double[] c = result.getDenseBlock();
+               double[] c = result.getDenseBlockValues();
                final int numCols = getNumCols();
                final int numVals = getNumValues();
                
@@ -260,7 +260,7 @@ public class ColGroupDDC1 extends ColGroupDDC
                throws DMLRuntimeException 
        {
                double[] b = ConverterUtils.getDenseVector(vector);
-               double[] c = result.getDenseBlock();
+               double[] c = result.getDenseBlockValues();
                
                //prepare distinct values once
                double[][] vals = new double[grps.length][];
@@ -286,7 +286,7 @@ public class ColGroupDDC1 extends ColGroupDDC
        @Override
        public void leftMultByRowVector(MatrixBlock vector, MatrixBlock result) 
throws DMLRuntimeException {
                double[] a = ConverterUtils.getDenseVector(vector);
-               double[] c = result.getDenseBlock();
+               double[] c = result.getDenseBlockValues();
                final int nrow = getNumRows();
                final int numVals = getNumValues();
                
@@ -303,7 +303,7 @@ public class ColGroupDDC1 extends ColGroupDDC
        
        @Override
        public void leftMultByRowVector(ColGroupDDC a, MatrixBlock result) 
throws DMLRuntimeException {
-               double[] c = result.getDenseBlock();
+               double[] c = result.getDenseBlockValues();
                final int nrow = getNumRows();
                final int numVals = getNumValues();
                
@@ -342,7 +342,7 @@ public class ColGroupDDC1 extends ColGroupDDC
        protected void computeRowSums(MatrixBlock result, KahanFunction kplus, 
int rl, int ru) {
                KahanObject kbuff = new KahanObject(0, 0);
                KahanPlus kplus2 = KahanPlus.getKahanPlusFnObject();
-               double[] c = result.getDenseBlock();
+               double[] c = result.getDenseBlockValues();
                
                //pre-aggregate nnz per value tuple
                double[] vals = sumAllValues(kplus, kbuff, false);
@@ -362,7 +362,7 @@ public class ColGroupDDC1 extends ColGroupDDC
        {
                KahanObject kbuff = new KahanObject(0, 0);
                KahanPlus kplus2 = KahanPlus.getKahanPlusFnObject();
-               double[] c = result.getDenseBlock();
+               double[] c = result.getDenseBlockValues();
                
                //prepare distinct values once
                double[][] vals = new double[grps.length][];

http://git-wip-us.apache.org/repos/asf/systemml/blob/e6424695/src/main/java/org/apache/sysml/runtime/compress/ColGroupDDC2.java
----------------------------------------------------------------------
diff --git a/src/main/java/org/apache/sysml/runtime/compress/ColGroupDDC2.java 
b/src/main/java/org/apache/sysml/runtime/compress/ColGroupDDC2.java
index d9c851d..b046350 100644
--- a/src/main/java/org/apache/sysml/runtime/compress/ColGroupDDC2.java
+++ b/src/main/java/org/apache/sysml/runtime/compress/ColGroupDDC2.java
@@ -184,7 +184,7 @@ public class ColGroupDDC2 extends ColGroupDDC
        public void decompressToBlock(MatrixBlock target, int colpos) {
                int nrow = getNumRows();
                int ncol = getNumCols();
-               double[] c = target.getDenseBlock();
+               double[] c = target.getDenseBlockValues();
                int nnz = 0;
                for( int i = 0; i < nrow; i++ )
                        nnz += ((c[i] = _values[_data[i]*ncol+colpos])!=0) ? 1 
: 0;
@@ -224,7 +224,7 @@ public class ColGroupDDC2 extends ColGroupDDC
        @Override
        public void rightMultByVector(MatrixBlock vector, MatrixBlock result, 
int rl, int ru) throws DMLRuntimeException {
                double[] b = ConverterUtils.getDenseVector(vector);
-               double[] c = result.getDenseBlock();
+               double[] c = result.getDenseBlockValues();
                final int numCols = getNumCols();
                final int numVals = getNumValues();
 
@@ -247,7 +247,7 @@ public class ColGroupDDC2 extends ColGroupDDC
                throws DMLRuntimeException 
        {
                double[] a = ConverterUtils.getDenseVector(vector);
-               double[] c = result.getDenseBlock();
+               double[] c = result.getDenseBlockValues();
                final int nrow = getNumRows();
                final int ncol = getNumCols();
                final int numVals = getNumValues();
@@ -280,7 +280,7 @@ public class ColGroupDDC2 extends ColGroupDDC
        public void leftMultByRowVector(ColGroupDDC a, MatrixBlock result) 
                throws DMLRuntimeException 
        {
-               double[] c = result.getDenseBlock();
+               double[] c = result.getDenseBlockValues();
                final int nrow = getNumRows();
                final int ncol = getNumCols();
                final int numVals = getNumValues();
@@ -341,7 +341,7 @@ public class ColGroupDDC2 extends ColGroupDDC
        protected void computeRowSums(MatrixBlock result, KahanFunction kplus, 
int rl, int ru) {
                KahanObject kbuff = new KahanObject(0, 0);
                KahanPlus kplus2 = KahanPlus.getKahanPlusFnObject();
-               double[] c = result.getDenseBlock();
+               double[] c = result.getDenseBlockValues();
                
                //pre-aggregate nnz per value tuple
                double[] vals = sumAllValues(kplus, kbuff, false);

http://git-wip-us.apache.org/repos/asf/systemml/blob/e6424695/src/main/java/org/apache/sysml/runtime/compress/ColGroupOLE.java
----------------------------------------------------------------------
diff --git a/src/main/java/org/apache/sysml/runtime/compress/ColGroupOLE.java 
b/src/main/java/org/apache/sysml/runtime/compress/ColGroupOLE.java
index 540739a..b655804 100644
--- a/src/main/java/org/apache/sysml/runtime/compress/ColGroupOLE.java
+++ b/src/main/java/org/apache/sysml/runtime/compress/ColGroupOLE.java
@@ -200,7 +200,7 @@ public class ColGroupOLE extends ColGroupOffset
                final int numCols = getNumCols();
                final int numVals = getNumValues();
                final int n = getNumRows();
-               double[] c = target.getDenseBlock();
+               double[] c = target.getDenseBlockValues();
                
                //cache blocking config and position array
                int[] apos = allocIVector(numVals, true);
@@ -298,7 +298,7 @@ public class ColGroupOLE extends ColGroupOffset
                        throws DMLRuntimeException 
        {
                double[] b = ConverterUtils.getDenseVector(vector);
-               double[] c = result.getDenseBlock();
+               double[] c = result.getDenseBlockValues();
                final int blksz = BitmapEncoder.BITMAP_BLOCK_SZ;
                final int numCols = getNumCols();
                final int numVals = getNumValues();
@@ -388,7 +388,7 @@ public class ColGroupOLE extends ColGroupOffset
                throws DMLRuntimeException 
        {
                double[] a = ConverterUtils.getDenseVector(vector);
-               double[] c = result.getDenseBlock();
+               double[] c = result.getDenseBlockValues();
                final int blksz = BitmapEncoder.BITMAP_BLOCK_SZ;
                final int numCols = getNumCols();
                final int numVals = getNumValues();
@@ -462,7 +462,7 @@ public class ColGroupOLE extends ColGroupOffset
                throws DMLRuntimeException 
        {
                //note: this method is only applicable for numrows < blocksize
-               double[] c = result.getDenseBlock();
+               double[] c = result.getDenseBlockValues();
                final int numCols = getNumCols();
                final int numVals = getNumValues();
                
@@ -518,7 +518,7 @@ public class ColGroupOLE extends ColGroupOffset
                
                final int blksz = BitmapEncoder.BITMAP_BLOCK_SZ;
                final int numVals = getNumValues();
-               double[] c = result.getDenseBlock();
+               double[] c = result.getDenseBlockValues();
                
                if( ALLOW_CACHE_CONSCIOUS_ROWSUMS &&
                        LOW_LEVEL_OPT && numVals > 1 && _numRows > blksz )
@@ -625,7 +625,7 @@ public class ColGroupOLE extends ColGroupOffset
                //NOTE: zeros handled once for all column groups outside
                final int blksz = BitmapEncoder.BITMAP_BLOCK_SZ;
                final int numVals = getNumValues();
-               double[] c = result.getDenseBlock();
+               double[] c = result.getDenseBlockValues();
                
                //iterate over all values and their bitmaps
                for (int k = 0; k < numVals; k++) 

http://git-wip-us.apache.org/repos/asf/systemml/blob/e6424695/src/main/java/org/apache/sysml/runtime/compress/ColGroupRLE.java
----------------------------------------------------------------------
diff --git a/src/main/java/org/apache/sysml/runtime/compress/ColGroupRLE.java 
b/src/main/java/org/apache/sysml/runtime/compress/ColGroupRLE.java
index 169ee4b..fdce4f5 100644
--- a/src/main/java/org/apache/sysml/runtime/compress/ColGroupRLE.java
+++ b/src/main/java/org/apache/sysml/runtime/compress/ColGroupRLE.java
@@ -191,7 +191,7 @@ public class ColGroupRLE extends ColGroupOffset
                final int numCols = getNumCols();
                final int numVals = getNumValues();
                final int n = getNumRows();
-               double[] c = target.getDenseBlock();
+               double[] c = target.getDenseBlockValues();
                
                //position and start offset arrays
                int[] astart = new int[numVals];
@@ -269,7 +269,7 @@ public class ColGroupRLE extends ColGroupOffset
                        throws DMLRuntimeException 
        {
                double[] b = ConverterUtils.getDenseVector(vector);
-               double[] c = result.getDenseBlock();
+               double[] c = result.getDenseBlockValues();
                final int numCols = getNumCols();
                final int numVals = getNumValues();
                
@@ -365,7 +365,7 @@ public class ColGroupRLE extends ColGroupOffset
                        throws DMLRuntimeException 
        {               
                double[] a = ConverterUtils.getDenseVector(vector);
-               double[] c = result.getDenseBlock();
+               double[] c = result.getDenseBlockValues();
                final int numCols = getNumCols();
                final int numVals = getNumValues();
                final int n = getNumRows();
@@ -443,7 +443,7 @@ public class ColGroupRLE extends ColGroupOffset
                        throws DMLRuntimeException 
        {
                //note: this method is only applicable for numrows < blocksize
-               double[] c = result.getDenseBlock();
+               double[] c = result.getDenseBlockValues();
                final int numCols = getNumCols();
                final int numVals = getNumValues();
 
@@ -538,7 +538,7 @@ public class ColGroupRLE extends ColGroupOffset
                KahanPlus kplus2 = KahanPlus.getKahanPlusFnObject();
                
                final int numVals = getNumValues();
-               double[] c = result.getDenseBlock();
+               double[] c = result.getDenseBlockValues();
                
                if( ALLOW_CACHE_CONSCIOUS_ROWSUMS 
                        && LOW_LEVEL_OPT && numVals > 1 
@@ -651,7 +651,7 @@ public class ColGroupRLE extends ColGroupOffset
        {
                //NOTE: zeros handled once for all column groups outside
                final int numVals = getNumValues();
-               double[] c = result.getDenseBlock();
+               double[] c = result.getDenseBlockValues();
                
                for (int k = 0; k < numVals; k++) {
                        int boff = _ptr[k];

http://git-wip-us.apache.org/repos/asf/systemml/blob/e6424695/src/main/java/org/apache/sysml/runtime/compress/ColGroupUncompressed.java
----------------------------------------------------------------------
diff --git 
a/src/main/java/org/apache/sysml/runtime/compress/ColGroupUncompressed.java 
b/src/main/java/org/apache/sysml/runtime/compress/ColGroupUncompressed.java
index c219ad6..b610adf 100644
--- a/src/main/java/org/apache/sysml/runtime/compress/ColGroupUncompressed.java
+++ b/src/main/java/org/apache/sysml/runtime/compress/ColGroupUncompressed.java
@@ -279,7 +279,7 @@ public class ColGroupUncompressed extends ColGroup
                
                MatrixBlock shortVector = new MatrixBlock(clen, 1, false);
                shortVector.allocateDenseBlock();
-               double[] b = shortVector.getDenseBlock();
+               double[] b = shortVector.getDenseBlockValues();
                for (int colIx = 0; colIx < clen; colIx++)
                        b[colIx] = vector.quickGetValue(_colIndexes[colIx], 0);
                shortVector.recomputeNonZeros();
@@ -296,7 +296,7 @@ public class ColGroupUncompressed extends ColGroup
                
                MatrixBlock shortVector = new MatrixBlock(clen, 1, false);
                shortVector.allocateDenseBlock();
-               double[] b = shortVector.getDenseBlock();
+               double[] b = shortVector.getDenseBlockValues();
                for (int colIx = 0; colIx < clen; colIx++)
                        b[colIx] = vector.quickGetValue(_colIndexes[colIx], 0);
                shortVector.recomputeNonZeros();
@@ -314,7 +314,7 @@ public class ColGroupUncompressed extends ColGroup
                
                // copying partialResult to the proper indices of the result
                if( !pret.isEmptyBlock(false) ) {
-                       double[] rsltArr = result.getDenseBlock();
+                       double[] rsltArr = result.getDenseBlockValues();
                        for (int colIx = 0; colIx < _colIndexes.length; colIx++)
                                rsltArr[_colIndexes[colIx]] = 
pret.quickGetValue(0, colIx);
                        result.recomputeNonZeros();
@@ -329,7 +329,7 @@ public class ColGroupUncompressed extends ColGroup
                
                // copying partialResult to the proper indices of the result
                if( !pret.isEmptyBlock(false) ) {
-                       double[] rsltArr = result.getDenseBlock();
+                       double[] rsltArr = result.getDenseBlockValues();
                        for (int colIx = 0; colIx < _colIndexes.length; colIx++)
                                rsltArr[_colIndexes[colIx]] = 
pret.quickGetValue(0, colIx);
                        result.recomputeNonZeros();
@@ -490,7 +490,7 @@ public class ColGroupUncompressed extends ColGroup
                                }
                                else {
                                        final int clen = getNumCols();
-                                       double[] a = _data.getDenseBlock();
+                                       double[] a = 
_data.getDenseBlockValues();
                                        for(int j=0, aix=rowIx*clen; j<clen; 
j++)
                                                buff[_colIndexes[j]] = a[aix+j];
                                }

http://git-wip-us.apache.org/repos/asf/systemml/blob/e6424695/src/main/java/org/apache/sysml/runtime/compress/CompressedMatrixBlock.java
----------------------------------------------------------------------
diff --git 
a/src/main/java/org/apache/sysml/runtime/compress/CompressedMatrixBlock.java 
b/src/main/java/org/apache/sysml/runtime/compress/CompressedMatrixBlock.java
index e1a6a7b..81cc9cf 100644
--- a/src/main/java/org/apache/sysml/runtime/compress/CompressedMatrixBlock.java
+++ b/src/main/java/org/apache/sysml/runtime/compress/CompressedMatrixBlock.java
@@ -1188,7 +1188,7 @@ public class CompressedMatrixBlock extends MatrixBlock 
implements Externalizable
                //special handling init value for rowmins/rowmax
                if( op.indexFn instanceof ReduceCol && op.aggOp.increOp.fn 
instanceof Builtin ) {
                        double val = Double.MAX_VALUE * 
((((Builtin)op.aggOp.increOp.fn).getBuiltinCode()==BuiltinCode.MAX)?-1:1);
-                       Arrays.fill(ret.getDenseBlock(), val);
+                       ret.getDenseBlock().set(val);
                }
                
                //core unary aggregate
@@ -1820,7 +1820,8 @@ public class CompressedMatrixBlock extends MatrixBlock 
implements Externalizable
                                _ret = new MatrixBlock(ret.getNumRows(), 
ret.getNumColumns(), false);
                                _ret.allocateDenseBlock();
                                if( _op.aggOp.increOp.fn instanceof Builtin )
-                                       System.arraycopy(ret.getDenseBlock(), 
0, _ret.getDenseBlock(), 0, ret.getNumRows()*ret.getNumColumns());
+                                       
System.arraycopy(ret.getDenseBlockValues(), 0,
+                                               _ret.getDenseBlockValues(), 0, 
ret.getNumRows()*ret.getNumColumns());
                        }
                        else { //colSums
                                _ret = ret;
@@ -2117,7 +2118,8 @@ public class CompressedMatrixBlock extends MatrixBlock 
implements Externalizable
                        ColGroupValue grpVal = (ColGroupValue)grp;
                        MatrixBlock vals = grpVal.getValuesAsBlock();
                        int[] counts = grpVal.getCounts(true);
-                       SortUtils.sortByValue(0, vals.getNumRows(), 
vals.getDenseBlock(), counts);
+                       double[] data = (vals.getDenseBlock()!=null) ? 
vals.getDenseBlockValues() : null;
+                       SortUtils.sortByValue(0, vals.getNumRows(), data, 
counts);
                        MatrixBlock counts2 = 
ColGroupValue.getCountsAsBlock(counts);
                        return vals.sortOperations(counts2, result);
                }

http://git-wip-us.apache.org/repos/asf/systemml/blob/e6424695/src/main/java/org/apache/sysml/runtime/compress/utils/LinearAlgebraUtils.java
----------------------------------------------------------------------
diff --git 
a/src/main/java/org/apache/sysml/runtime/compress/utils/LinearAlgebraUtils.java 
b/src/main/java/org/apache/sysml/runtime/compress/utils/LinearAlgebraUtils.java
index de6e233..981d944 100644
--- 
a/src/main/java/org/apache/sysml/runtime/compress/utils/LinearAlgebraUtils.java
+++ 
b/src/main/java/org/apache/sysml/runtime/compress/utils/LinearAlgebraUtils.java
@@ -145,7 +145,7 @@ public class LinearAlgebraUtils
        }
        
        public static void copyNonZerosToUpperTriangle( MatrixBlock ret, 
MatrixBlock tmp, int ix ) {
-               double[] a = tmp.getDenseBlock();
+               double[] a = tmp.getDenseBlockValues();
                for(int i=0; i<tmp.getNumColumns(); i++) {
                        if( a[i] != 0 ) {
                                ret.setValueDenseUnsafe(

http://git-wip-us.apache.org/repos/asf/systemml/blob/e6424695/src/main/java/org/apache/sysml/runtime/controlprogram/ProgramBlock.java
----------------------------------------------------------------------
diff --git 
a/src/main/java/org/apache/sysml/runtime/controlprogram/ProgramBlock.java 
b/src/main/java/org/apache/sysml/runtime/controlprogram/ProgramBlock.java
index 0996cd9..28256f6 100644
--- a/src/main/java/org/apache/sysml/runtime/controlprogram/ProgramBlock.java
+++ b/src/main/java/org/apache/sysml/runtime/controlprogram/ProgramBlock.java
@@ -255,7 +255,7 @@ public class ProgramBlock implements ParseInfo
                {
                        // start time measurement for statistics
                        long t0 = (DMLScript.STATISTICS || 
LOG.isTraceEnabled()) ?
-                                       System.nanoTime() : 0;
+                               System.nanoTime() : 0;
 
                        // pre-process instruction (debug state, inst patching, 
listeners)
                        Instruction tmp = currInst.preprocessInstruction( ec );

http://git-wip-us.apache.org/repos/asf/systemml/blob/e6424695/src/main/java/org/apache/sysml/runtime/instructions/cp/ConvolutionCPInstruction.java
----------------------------------------------------------------------
diff --git 
a/src/main/java/org/apache/sysml/runtime/instructions/cp/ConvolutionCPInstruction.java
 
b/src/main/java/org/apache/sysml/runtime/instructions/cp/ConvolutionCPInstruction.java
index 6be6459..08d220e 100644
--- 
a/src/main/java/org/apache/sysml/runtime/instructions/cp/ConvolutionCPInstruction.java
+++ 
b/src/main/java/org/apache/sysml/runtime/instructions/cp/ConvolutionCPInstruction.java
@@ -310,7 +310,7 @@ public class ConvolutionCPInstruction extends 
UnaryCPInstruction {
                }
                else {
                        outputBlock = new MatrixBlock(C, 1, 
false).allocateBlock();
-                       double [] output = outputBlock.getDenseBlock();
+                       double [] output = outputBlock.getDenseBlockValues();
                        if(input.isInSparseFormat()) {
                                SparseBlock sblock = input.getSparseBlock();
                                for(int n = 0; n < input.getNumRows(); n++) {
@@ -333,7 +333,7 @@ public class ConvolutionCPInstruction extends 
UnaryCPInstruction {
                                }
                        }
                        else {
-                               double [] inArr = input.getDenseBlock();
+                               double [] inArr = input.getDenseBlockValues();
                                if(inArr != null) {
                                        KahanPlus kplus = 
KahanPlus.getKahanPlusFnObject();
                                        for(int c = 0; c < C; c++) {
@@ -348,7 +348,7 @@ public class ConvolutionCPInstruction extends 
UnaryCPInstruction {
                                        }
                                }
                        }
-                       outputBlock.recomputeNonZeros(getExtendedOpcode());
+                       outputBlock.recomputeNonZeros();
                }
                
                // release inputs/outputs
@@ -468,7 +468,8 @@ public class ConvolutionCPInstruction extends 
UnaryCPInstruction {
                                // bias_add(empty mb, bias)
                                outputBlock = new MatrixBlock(N, K*P*Q, 
false).allocateBlock();
                                for(int n = 0;  n < params.N; n++) 
-                                       ConvolutionUtils.fillBias(bias, 
outputBlock.getDenseBlock(), n, n+1, params.N, params.K, params.P*params.Q);
+                                       ConvolutionUtils.fillBias(bias, 
outputBlock.getDenseBlockValues(),
+                                               n, n+1, params.N, params.K, 
params.P*params.Q);
                        }
                        else {
                                outputBlock = new MatrixBlock(N, K*P*Q, 
false).allocateBlock();

http://git-wip-us.apache.org/repos/asf/systemml/blob/e6424695/src/main/java/org/apache/sysml/runtime/instructions/cp/MatrixIndexingCPInstruction.java
----------------------------------------------------------------------
diff --git 
a/src/main/java/org/apache/sysml/runtime/instructions/cp/MatrixIndexingCPInstruction.java
 
b/src/main/java/org/apache/sysml/runtime/instructions/cp/MatrixIndexingCPInstruction.java
index bee0434..4a636e1 100644
--- 
a/src/main/java/org/apache/sysml/runtime/instructions/cp/MatrixIndexingCPInstruction.java
+++ 
b/src/main/java/org/apache/sysml/runtime/instructions/cp/MatrixIndexingCPInstruction.java
@@ -75,7 +75,7 @@ public final class MatrixIndexingCPInstruction extends 
IndexingCPInstruction {
                                
                                //ensure correct sparse/dense output 
representation
                                if( checkGuardedRepresentationChange(matBlock, 
resultBlock) )
-                                       
resultBlock.examSparsity(getExtendedOpcode());
+                                       resultBlock.examSparsity();
                        }
                        
                        //unpin output
@@ -115,7 +115,7 @@ public final class MatrixIndexingCPInstruction extends 
IndexingCPInstruction {
                        
                        //ensure correct sparse/dense output representation
                        //(memory guarded by release of input)
-                       resultBlock.examSparsity(getExtendedOpcode());
+                       resultBlock.examSparsity();
                        
                        //unpin output
                        ec.setMatrixOutput(output.getName(), resultBlock, 
updateType, getExtendedOpcode());

http://git-wip-us.apache.org/repos/asf/systemml/blob/e6424695/src/main/java/org/apache/sysml/runtime/instructions/cp/MatrixMatrixBuiltinCPInstruction.java
----------------------------------------------------------------------
diff --git 
a/src/main/java/org/apache/sysml/runtime/instructions/cp/MatrixMatrixBuiltinCPInstruction.java
 
b/src/main/java/org/apache/sysml/runtime/instructions/cp/MatrixMatrixBuiltinCPInstruction.java
index f247740..24af9b5 100644
--- 
a/src/main/java/org/apache/sysml/runtime/instructions/cp/MatrixMatrixBuiltinCPInstruction.java
+++ 
b/src/main/java/org/apache/sysml/runtime/instructions/cp/MatrixMatrixBuiltinCPInstruction.java
@@ -39,14 +39,13 @@ public class MatrixMatrixBuiltinCPInstruction extends 
BuiltinBinaryCPInstruction
                throws DMLRuntimeException
        {
                String opcode = getOpcode();
-        
-        if ( LibCommonsMath.isSupportedMatrixMatrixOperation(opcode) ) {
-               MatrixBlock solution = 
LibCommonsMath.matrixMatrixOperations(ec.getMatrixObject(input1.getName()), 
(MatrixObject)ec.getVariable(input2.getName()), opcode);
-               ec.setMatrixOutput(output.getName(), solution, 
getExtendedOpcode());
-               return;
-        }
+
+               if ( LibCommonsMath.isSupportedMatrixMatrixOperation(opcode) ) {
+                       MatrixBlock solution = 
LibCommonsMath.matrixMatrixOperations(ec.getMatrixObject(input1.getName()), 
(MatrixObject)ec.getVariable(input2.getName()), opcode);
+                       ec.setMatrixOutput(output.getName(), solution, 
getExtendedOpcode());
+                       return;
+               }
                
-        /* Default behavior of this instruction */
                String output_name = output.getName();
                BinaryOperator bop = (BinaryOperator) _optr;
                
@@ -62,7 +61,7 @@ public class MatrixMatrixBuiltinCPInstruction extends 
BuiltinBinaryCPInstruction
                if( checkGuardedRepresentationChange(inBlock1, inBlock2, 
retBlock) ) {
                        retBlock.examSparsity();
                }
-        
+
                ec.setMatrixOutput(output_name, retBlock, getExtendedOpcode());
        }
-}
\ No newline at end of file
+}

http://git-wip-us.apache.org/repos/asf/systemml/blob/e6424695/src/main/java/org/apache/sysml/runtime/instructions/gpu/context/GPUObject.java
----------------------------------------------------------------------
diff --git 
a/src/main/java/org/apache/sysml/runtime/instructions/gpu/context/GPUObject.java
 
b/src/main/java/org/apache/sysml/runtime/instructions/gpu/context/GPUObject.java
index c4a16fc..22cdbcb 100644
--- 
a/src/main/java/org/apache/sysml/runtime/instructions/gpu/context/GPUObject.java
+++ 
b/src/main/java/org/apache/sysml/runtime/instructions/gpu/context/GPUObject.java
@@ -772,7 +772,7 @@ public class GPUObject {
                        
                        // Only recompute non-zero if unknown, else this will 
incur huge penalty !!
                        if(tmp.getNonZeros() < 0) {
-                               tmp.recomputeNonZeros(opcode);
+                               tmp.recomputeNonZeros();
                        }
                        long nnz = tmp.getNonZeros();
                        mat.getMatrixCharacteristics().setNonZeros(nnz);
@@ -833,7 +833,7 @@ public class GPUObject {
                                        
GPUStatistics.maintainCPMiscTimes(opcode, 
GPUInstruction.MISC_TIMER_HOST_TO_DEVICE, System.nanoTime() - t1);
                        }
                } else {
-                       double[] data = tmp.getDenseBlock();
+                       double[] data = tmp.getDenseBlockValues();
 
                        if (data == null && tmp.getSparseBlock() != null)
                                throw new DMLRuntimeException("Incorrect 
sparsity calculation");
@@ -886,7 +886,8 @@ public class GPUObject {
                                start = System.nanoTime();
                        MatrixBlock tmp = new 
MatrixBlock(toIntExact(mat.getNumRows()), toIntExact(mat.getNumColumns()), 
false);
                        tmp.allocateDenseBlock();
-                       
LibMatrixCUDA.cudaSupportFunctions.deviceToHost(getGPUContext(), 
getJcudaDenseMatrixPtr(), tmp.getDenseBlock(), instName, isEviction);
+                       
LibMatrixCUDA.cudaSupportFunctions.deviceToHost(getGPUContext(),
+                               getJcudaDenseMatrixPtr(), 
tmp.getDenseBlockValues(), instName, isEviction);
                        tmp.recomputeNonZeros();
                        mat.acquireModify(tmp);
                        mat.release();

http://git-wip-us.apache.org/repos/asf/systemml/blob/e6424695/src/main/java/org/apache/sysml/runtime/instructions/mr/UaggOuterChainInstruction.java
----------------------------------------------------------------------
diff --git 
a/src/main/java/org/apache/sysml/runtime/instructions/mr/UaggOuterChainInstruction.java
 
b/src/main/java/org/apache/sysml/runtime/instructions/mr/UaggOuterChainInstruction.java
index c0c772c..3a378b6 100644
--- 
a/src/main/java/org/apache/sysml/runtime/instructions/mr/UaggOuterChainInstruction.java
+++ 
b/src/main/java/org/apache/sysml/runtime/instructions/mr/UaggOuterChainInstruction.java
@@ -165,8 +165,8 @@ public class UaggOuterChainInstruction extends 
BinaryInstruction implements IDis
                                                Arrays.sort(_bv);
                                        }
                                }
-               
-                               LibMatrixOuterAgg.resetOutputMatix(in1Ix, 
(MatrixBlock)in1Val, outIx, (MatrixBlock)outVal, _uaggOp);
+                               
+                               LibMatrixOuterAgg.resetOutputMatrix(in1Ix, 
(MatrixBlock)in1Val, outIx, (MatrixBlock)outVal, _uaggOp);
                                
LibMatrixOuterAgg.aggregateMatrix((MatrixBlock)in1Val, (MatrixBlock)outVal, 
_bv, _bvi, _bOp, _uaggOp);
                        }
                        else //default case 

http://git-wip-us.apache.org/repos/asf/systemml/blob/e6424695/src/main/java/org/apache/sysml/runtime/instructions/spark/ConvolutionSPInstruction.java
----------------------------------------------------------------------
diff --git 
a/src/main/java/org/apache/sysml/runtime/instructions/spark/ConvolutionSPInstruction.java
 
b/src/main/java/org/apache/sysml/runtime/instructions/spark/ConvolutionSPInstruction.java
index 874371d..f812f86 100644
--- 
a/src/main/java/org/apache/sysml/runtime/instructions/spark/ConvolutionSPInstruction.java
+++ 
b/src/main/java/org/apache/sysml/runtime/instructions/spark/ConvolutionSPInstruction.java
@@ -19,7 +19,6 @@
 package org.apache.sysml.runtime.instructions.spark;
 
 import java.util.ArrayList;
-import java.util.Arrays;
 import java.util.Iterator;
 
 import org.apache.spark.api.java.JavaPairRDD;
@@ -360,7 +359,7 @@ public class ConvolutionSPInstruction extends 
UnarySPInstruction {
                                else {
                                        outputBlock = new MatrixBlock(params.N, 
params.C*params.P*params.Q, false).allocateBlock();
                                        
if(instOpcode.equalsIgnoreCase("maxpooling"))
-                                               
Arrays.fill(outputBlock.getDenseBlock(), -Double.MAX_VALUE);
+                                               
outputBlock.getDenseBlock().set(-Double.MAX_VALUE);
                                        LibMatrixDNN.maxpooling(matBlock, 
outputBlock, params);
                                }
                        }

http://git-wip-us.apache.org/repos/asf/systemml/blob/e6424695/src/main/java/org/apache/sysml/runtime/instructions/spark/UaggOuterChainSPInstruction.java
----------------------------------------------------------------------
diff --git 
a/src/main/java/org/apache/sysml/runtime/instructions/spark/UaggOuterChainSPInstruction.java
 
b/src/main/java/org/apache/sysml/runtime/instructions/spark/UaggOuterChainSPInstruction.java
index 9c7aefc..43c2106 100644
--- 
a/src/main/java/org/apache/sysml/runtime/instructions/spark/UaggOuterChainSPInstruction.java
+++ 
b/src/main/java/org/apache/sysml/runtime/instructions/spark/UaggOuterChainSPInstruction.java
@@ -124,9 +124,9 @@ public class UaggOuterChainSPInstruction extends 
BinarySPInstruction {
                JavaPairRDD<MatrixIndexes,MatrixBlock> in1 = 
sec.getBinaryBlockRDDHandleForVariable( rddVar );
                MatrixCharacteristics mcIn = 
sec.getMatrixCharacteristics(rddVar);
                boolean noKeyChange = preservesPartitioning(mcIn, 
_uaggOp.indexFn); 
-                               
+               
                //execute UAggOuterChain instruction
-               JavaPairRDD<MatrixIndexes,MatrixBlock> out = null;              
+               JavaPairRDD<MatrixIndexes,MatrixBlock> out = null;
 
                if (LibMatrixOuterAgg.isSupportedUaggOp(_uaggOp, _bOp))
                {
@@ -168,7 +168,7 @@ public class UaggOuterChainSPInstruction extends 
BinarySPInstruction {
                        sec.setMatrixOutput(output.getName(), tmp, 
getExtendedOpcode());
                }
                else //R/C AGG (output is rdd)
-               {                       
+               {
                        //put output RDD handle into symbol table
                        updateUnaryAggOutputMatrixCharacteristics(sec);
                        
@@ -250,7 +250,7 @@ public class UaggOuterChainSPInstruction extends 
BinarySPInstruction {
                public LazyIterableIterator<Tuple2<MatrixIndexes, MatrixBlock>> 
call(Iterator<Tuple2<MatrixIndexes, MatrixBlock>> arg0)
                        throws Exception 
                {
-                       return new RDDMapUAggOuterChainIterator(arg0);  
+                       return new RDDMapUAggOuterChainIterator(arg0);
                }
                
                private class RDDMapUAggOuterChainIterator extends 
LazyIterableIterator<Tuple2<MatrixIndexes, MatrixBlock>>
@@ -272,9 +272,9 @@ public class UaggOuterChainSPInstruction extends 
BinarySPInstruction {
                                if((LibMatrixOuterAgg.isRowIndexMax(_uaggOp)) 
|| (LibMatrixOuterAgg.isRowIndexMin(_uaggOp)))
                                        bvi = _bvi.getValue();
 
-                               LibMatrixOuterAgg.resetOutputMatix(in1Ix, 
in1Val, outIx, outVal, _uaggOp);
+                               LibMatrixOuterAgg.resetOutputMatrix(in1Ix, 
in1Val, outIx, outVal, _uaggOp);
                                LibMatrixOuterAgg.aggregateMatrix(in1Val, 
outVal, _bv.value(), bvi, _bOp, _uaggOp);
-
+                               
                                return new Tuple2<>(outIx, outVal);
                        }
                }

http://git-wip-us.apache.org/repos/asf/systemml/blob/e6424695/src/main/java/org/apache/sysml/runtime/instructions/spark/utils/RDDConverterUtils.java
----------------------------------------------------------------------
diff --git 
a/src/main/java/org/apache/sysml/runtime/instructions/spark/utils/RDDConverterUtils.java
 
b/src/main/java/org/apache/sysml/runtime/instructions/spark/utils/RDDConverterUtils.java
index b5ce814..53e42ac 100644
--- 
a/src/main/java/org/apache/sysml/runtime/instructions/spark/utils/RDDConverterUtils.java
+++ 
b/src/main/java/org/apache/sysml/runtime/instructions/spark/utils/RDDConverterUtils.java
@@ -422,7 +422,7 @@ public class RDDConverterUtils
                        return Vectors.sparse(row.getNumColumns(), 
                                        row.getSparseBlock().indexes(0), 
row.getSparseBlock().values(0));
                else // DENSE ROW
-                       return Vectors.dense(row.getDenseBlock());
+                       return Vectors.dense(row.getDenseBlockValues());
        }
        
        /////////////////////////////////

http://git-wip-us.apache.org/repos/asf/systemml/blob/e6424695/src/main/java/org/apache/sysml/runtime/instructions/spark/utils/RDDConverterUtilsExt.java
----------------------------------------------------------------------
diff --git 
a/src/main/java/org/apache/sysml/runtime/instructions/spark/utils/RDDConverterUtilsExt.java
 
b/src/main/java/org/apache/sysml/runtime/instructions/spark/utils/RDDConverterUtilsExt.java
index 951877e..eddc971 100644
--- 
a/src/main/java/org/apache/sysml/runtime/instructions/spark/utils/RDDConverterUtilsExt.java
+++ 
b/src/main/java/org/apache/sysml/runtime/instructions/spark/utils/RDDConverterUtilsExt.java
@@ -231,7 +231,7 @@ public class RDDConverterUtilsExt
                        throw new DMLRuntimeException("MatrixBlock of size " + 
limit + " cannot be converted to dense numpy array");
                ret = new byte[(int) (limit * times)];
 
-               double [] denseBlock = mb.getDenseBlock();
+               double [] denseBlock = mb.getDenseBlockValues();
                if(mb.isEmptyBlock()) {
                        for(int i=0;i < limit;i++){
                        ByteBuffer.wrap(ret, i*times, 
times).order(ByteOrder.nativeOrder()).putDouble(0);

http://git-wip-us.apache.org/repos/asf/systemml/blob/e6424695/src/main/java/org/apache/sysml/runtime/io/ReaderTextCellParallel.java
----------------------------------------------------------------------
diff --git 
a/src/main/java/org/apache/sysml/runtime/io/ReaderTextCellParallel.java 
b/src/main/java/org/apache/sysml/runtime/io/ReaderTextCellParallel.java
index 2afbd7e..6f4fa25 100644
--- a/src/main/java/org/apache/sysml/runtime/io/ReaderTextCellParallel.java
+++ b/src/main/java/org/apache/sysml/runtime/io/ReaderTextCellParallel.java
@@ -97,9 +97,9 @@ public class ReaderTextCellParallel extends MatrixReader
 
                //finally check if change of sparse/dense block representation 
required
                if( !AGGREGATE_BLOCK_NNZ )
-                       ret.recomputeNonZeros();                        
+                       ret.recomputeNonZeros();
                ret.examSparsity();
-               
+
                return ret;
        }
 

http://git-wip-us.apache.org/repos/asf/systemml/blob/e6424695/src/main/java/org/apache/sysml/runtime/io/WriterTextCell.java
----------------------------------------------------------------------
diff --git a/src/main/java/org/apache/sysml/runtime/io/WriterTextCell.java 
b/src/main/java/org/apache/sysml/runtime/io/WriterTextCell.java
index 04dfd5a..b0636a3 100644
--- a/src/main/java/org/apache/sysml/runtime/io/WriterTextCell.java
+++ b/src/main/java/org/apache/sysml/runtime/io/WriterTextCell.java
@@ -91,7 +91,7 @@ public class WriterTextCell extends MatrixWriter
                        StringBuilder sb = new StringBuilder();
                        
                        if( sparse ) //SPARSE
-                       {                          
+                       {
                                Iterator<IJV> iter = 
src.getSparseBlockIterator(rl, ru);
                                while( iter.hasNext() )
                                {
@@ -111,7 +111,7 @@ public class WriterTextCell extends MatrixWriter
                        {
                                for( int i=rl; i<ru; i++ )
                                {
-                                       String rowIndex = 
Integer.toString(i+1);                                        
+                                       String rowIndex = Integer.toString(i+1);
                                        for( int j=0; j<clen; j++ )
                                        {
                                                double lvalue = 
src.getValueDenseUnsafe(i, j);

http://git-wip-us.apache.org/repos/asf/systemml/blob/e6424695/src/main/java/org/apache/sysml/runtime/matrix/data/BinaryBlockToBinaryCellConverter.java
----------------------------------------------------------------------
diff --git 
a/src/main/java/org/apache/sysml/runtime/matrix/data/BinaryBlockToBinaryCellConverter.java
 
b/src/main/java/org/apache/sysml/runtime/matrix/data/BinaryBlockToBinaryCellConverter.java
index 9c5d0d2..b7cc74e 100644
--- 
a/src/main/java/org/apache/sysml/runtime/matrix/data/BinaryBlockToBinaryCellConverter.java
+++ 
b/src/main/java/org/apache/sysml/runtime/matrix/data/BinaryBlockToBinaryCellConverter.java
@@ -69,7 +69,7 @@ Converter<MatrixIndexes, MatrixBlock, MatrixIndexes, 
MatrixCell>
                {
                        if(v1.getDenseBlock()==null)
                                return;
-                       denseArray=v1.getDenseBlock();
+                       denseArray=v1.getDenseBlockValues();
                        nextInDenseArray=0;
                        denseArraySize=v1.getNumRows()*v1.getNumColumns();
                }

http://git-wip-us.apache.org/repos/asf/systemml/blob/e6424695/src/main/java/org/apache/sysml/runtime/matrix/data/BinaryBlockToTextCellConverter.java
----------------------------------------------------------------------
diff --git 
a/src/main/java/org/apache/sysml/runtime/matrix/data/BinaryBlockToTextCellConverter.java
 
b/src/main/java/org/apache/sysml/runtime/matrix/data/BinaryBlockToTextCellConverter.java
index 98396d2..39ae854 100644
--- 
a/src/main/java/org/apache/sysml/runtime/matrix/data/BinaryBlockToTextCellConverter.java
+++ 
b/src/main/java/org/apache/sysml/runtime/matrix/data/BinaryBlockToTextCellConverter.java
@@ -74,7 +74,7 @@ Converter<MatrixIndexes, MatrixBlock, NullWritable, Text>
                {
                        if(v1.getDenseBlock()==null)
                                return;
-                       denseArray=v1.getDenseBlock();
+                       denseArray=v1.getDenseBlockValues();
                        nextInDenseArray=0;
                        denseArraySize=v1.getNumRows()*v1.getNumColumns();
                }

http://git-wip-us.apache.org/repos/asf/systemml/blob/e6424695/src/main/java/org/apache/sysml/runtime/matrix/data/DenseBlock.java
----------------------------------------------------------------------
diff --git a/src/main/java/org/apache/sysml/runtime/matrix/data/DenseBlock.java 
b/src/main/java/org/apache/sysml/runtime/matrix/data/DenseBlock.java
index d498b79..3d82969 100644
--- a/src/main/java/org/apache/sysml/runtime/matrix/data/DenseBlock.java
+++ b/src/main/java/org/apache/sysml/runtime/matrix/data/DenseBlock.java
@@ -56,6 +56,16 @@ public abstract class DenseBlock implements Serializable
        public abstract void reset(int rlen, int clen);
        
        /**
+        * Resets the dense block by setting the given value.
+        * 
+        * @param rlen number of rows
+        * @param clen number of columns
+        * @param v value
+        */
+       public abstract void reset(int rlen, int clen, double v);
+       
+       
+       /**
         * Get the number of rows.
         * 
         * @return number of rows
@@ -93,6 +103,19 @@ public abstract class DenseBlock implements Serializable
        public abstract long countNonZeros();
        
        /**
+        * Compute the number of non-zero values, which potentially 
+        * makes a full pass over the underlying blocks.
+        * 
+        * @param rl row lower index
+        * @param ru row upper index (exclusive)
+        * @param cl column lower index 
+        * @param cu column upper index (exclusive)
+        * @return number of non-zeros
+        */
+       public abstract long countNonZeros(int rl, int ru, int cl, int cu);
+       
+       
+       /**
         * Get the allocated blocks.
         * 
         * @return blocks
@@ -136,6 +159,26 @@ public abstract class DenseBlock implements Serializable
        public abstract int pos(int r, int c);
        
        /**
+        * Set the given value for the entire dense block (fill).
+        * 
+        * @param v value
+        */
+       public abstract void set(double v);
+       
+       /**
+        * Set the given value for an entire index range of the 
+        * dense block (fill).
+        * 
+        * @param rl row lower index
+        * @param ru row upper index (exclusive)
+        * @param cl column lower index 
+        * @param cu column upper index (exclusive)
+        * @param v value
+        */
+       public abstract void set(int rl, int ru, int cl, int cu, double v);
+       
+       
+       /**
         * Set the given value for a given row and column.
         * 
         * @param r row index
@@ -145,6 +188,14 @@ public abstract class DenseBlock implements Serializable
        public abstract void set(int r, int c, double v);
        
        /**
+        * Copy the given vector into the given row.
+        * 
+        * @param r row index
+        * @param v value vector
+        */
+       public abstract void set(int r, double[] v);
+       
+       /**
         * Get the value for a given row and column.
         * 
         * @param r row index
@@ -152,4 +203,7 @@ public abstract class DenseBlock implements Serializable
         * @return value
         */
        public abstract double get(int r, int c);
+       
+       @Override 
+       public abstract String toString();
 }

http://git-wip-us.apache.org/repos/asf/systemml/blob/e6424695/src/main/java/org/apache/sysml/runtime/matrix/data/DenseBlockDRB.java
----------------------------------------------------------------------
diff --git 
a/src/main/java/org/apache/sysml/runtime/matrix/data/DenseBlockDRB.java 
b/src/main/java/org/apache/sysml/runtime/matrix/data/DenseBlockDRB.java
index 6f2b11d..e0d9443 100644
--- a/src/main/java/org/apache/sysml/runtime/matrix/data/DenseBlockDRB.java
+++ b/src/main/java/org/apache/sysml/runtime/matrix/data/DenseBlockDRB.java
@@ -31,21 +31,36 @@ public class DenseBlockDRB extends DenseBlock
        private int clen;
 
        public DenseBlockDRB(int rlen, int clen) {
-               reset(rlen, clen);
+               reset(rlen, clen, 0);
        }
-       
+
+       public DenseBlockDRB(double[] data, int rlen, int clen) {
+               this.data = data;
+               this.rlen = rlen;
+               this.clen = clen;
+       }
+
        @Override
        public void reset() {
-               reset(rlen, clen);
+               reset(rlen, clen, 0);
        }
 
        @Override
        public void reset(int rlen, int clen) {
+               reset(rlen, clen, 0);
+       }
+       
+       @Override
+       public void reset(int rlen, int clen, double v) {
                int len = rlen * clen;
-               if( len < capacity() )
-                       Arrays.fill(data, 0, len, 0);
-               else
+               if( len > capacity() ) {
                        data = new double[len];
+                       if( v != 0 )
+                               Arrays.fill(data, v);
+               }
+               else {
+                       Arrays.fill(data, 0, len, v);
+               }
                this.rlen = rlen;
                this.clen = clen;
        }
@@ -73,9 +88,25 @@ public class DenseBlockDRB extends DenseBlock
        @Override
        public long countNonZeros() {
                final int len = rlen * clen;
+               double[] a = data;
                int nnz = 0;
                for(int i=0; i<len; i++)
-                       nnz += (data[i]!=0) ? 1 : 0;
+                       nnz += (a[i]!=0) ? 1 : 0;
+               return nnz;
+       }
+
+       @Override
+       public long countNonZeros(int rl, int ru, int cl, int cu) {
+               long nnz = 0;
+               if( cl==0 && cu==clen ) { //specific case: all cols
+                       for( int i=rl*clen; i<ru*clen; i++ )
+                               nnz += (data[i]!=0) ? 1 : 0;
+               }
+               else {
+                       for( int i=rl, ix=rl*clen; i<ru; i++, ix+=clen )
+                               for( int j=cl; j<cu; j++ )
+                                       nnz += (data[ix+j]!=0) ? 1 : 0;
+               }
                return nnz;
        }
 
@@ -105,12 +136,41 @@ public class DenseBlockDRB extends DenseBlock
        }
 
        @Override
+       public void set(double v) {
+               Arrays.fill(data, 0, rlen*clen, v);
+       }
+       
+       @Override
+       public void set(int rl, int ru, int cl, int cu, double v) {
+               for(int i=rl, ix=rl*clen; i<ru; i++, ix+=clen)
+                       Arrays.fill(data, ix+cl, ix+cu, v);
+       }
+
+       @Override
        public void set(int r, int c, double v) {
                data[pos(r, c)] = v;
        }
 
        @Override
+       public void set(int r, double[] v) {
+               System.arraycopy(v, 0, data, pos(r), clen);
+       }
+
+       @Override
        public double get(int r, int c) {
                return data[pos(r, c)];
        }
+       
+       @Override
+       public String toString() {
+               StringBuilder sb = new StringBuilder();
+               for(int i=0, ix=0; i<rlen; i++, ix+=clen) {
+                       for(int j=0; j<clen; j++) {
+                               sb.append(data[ix+j]);
+                               sb.append("\t");
+                       }
+                       sb.append("\n");
+               }
+               return sb.toString();
+       }
 }

http://git-wip-us.apache.org/repos/asf/systemml/blob/e6424695/src/main/java/org/apache/sysml/runtime/matrix/data/DenseBlockFactory.java
----------------------------------------------------------------------
diff --git 
a/src/main/java/org/apache/sysml/runtime/matrix/data/DenseBlockFactory.java 
b/src/main/java/org/apache/sysml/runtime/matrix/data/DenseBlockFactory.java
index 695b0af..b37e44d 100644
--- a/src/main/java/org/apache/sysml/runtime/matrix/data/DenseBlockFactory.java
+++ b/src/main/java/org/apache/sysml/runtime/matrix/data/DenseBlockFactory.java
@@ -28,6 +28,10 @@ public abstract class DenseBlockFactory
                return createDenseBlock(type, rlen, clen);
        }
 
+       public static DenseBlock createDenseBlock(double[] data, int rlen, int 
clen) {
+               return new DenseBlockDRB(data, rlen, clen);
+       }
+       
        public static DenseBlock createDenseBlock(DenseBlock.Type type, int 
rlen, int clen) {
                switch( type ) {
                        case DRB: return new DenseBlockDRB(rlen, clen);

http://git-wip-us.apache.org/repos/asf/systemml/blob/e6424695/src/main/java/org/apache/sysml/runtime/matrix/data/DenseBlockLDRB.java
----------------------------------------------------------------------
diff --git 
a/src/main/java/org/apache/sysml/runtime/matrix/data/DenseBlockLDRB.java 
b/src/main/java/org/apache/sysml/runtime/matrix/data/DenseBlockLDRB.java
index aeaad9a..c6ded3a 100644
--- a/src/main/java/org/apache/sysml/runtime/matrix/data/DenseBlockLDRB.java
+++ b/src/main/java/org/apache/sysml/runtime/matrix/data/DenseBlockLDRB.java
@@ -36,26 +36,31 @@ public class DenseBlockLDRB extends DenseBlock
        }
        
        public DenseBlockLDRB(int rlen, int clen, int blen) {
-               reset(rlen, clen, blen);
+               reset(rlen, clen, blen, 0);
        }
        
        @Override
        public void reset() {
-               reset(rlen, clen, blen);
+               reset(rlen, clen, blen, 0);
        }
 
        @Override
        public void reset(int rlen, int clen) {
-               reset(rlen, clen, blen);
+               reset(rlen, clen, blen, 0);
        }
        
-       private void reset(int rlen, int clen, int blen) {
+       @Override
+       public void reset(int rlen, int clen, double v) {
+               reset(rlen, clen, blen, v);
+       }
+       
+       private void reset(int rlen, int clen, int blen, double v) {
                long llen = (long) rlen * clen;
                int numPart = (int)Math.ceil((double)rlen / blen);
                if( this.blen == blen && llen < capacity() ) {
                        for(int i=0; i<numPart; i++) {
                                int len = Math.min((i+1)*blen,rlen)-i*blen;
-                               Arrays.fill(data[i], 0, len, 0);
+                               Arrays.fill(data[i], 0, len, v);
                        }
                }
                else {
@@ -63,9 +68,10 @@ public class DenseBlockLDRB extends DenseBlock
                        for(int i=0; i<numPart; i++) {
                                int len = Math.min((i+1)*blen,rlen)-i*blen;
                                data[i] = new double[len];
+                               if( v != 0 )
+                                       Arrays.fill(data[i], v);
                        }
                }
-               
                this.rlen = rlen;
                this.clen = clen;
                this.blen = blen;
@@ -104,6 +110,18 @@ public class DenseBlockLDRB extends DenseBlock
                }
                return nnz;
        }
+       
+       @Override
+       public long countNonZeros(int rl, int ru, int cl, int cu) {
+               long nnz = 0;
+               for(int bi=index(rl); bi<index(ru); bi++) {
+                       double[] a = data[bi];
+                       for(int i=pos(bi), ix=pos(bi)*clen; i<blen(bi); i++, 
ix+=clen)
+                               for( int j=cl; j<cu; j++ )
+                                       nnz += (a[ix+j]!=0) ? 1 : 0;
+               }
+               return nnz;
+       }
 
        @Override
        public double[][] values() {
@@ -131,14 +149,54 @@ public class DenseBlockLDRB extends DenseBlock
        }
 
        @Override
+       public void set(double v) {
+               for(int i=0; i<numBlocks(); i++)
+                       Arrays.fill(data[i], v);
+       }
+       
+       @Override
+       public void set(int rl, int ru, int cl, int cu, double v) {
+               for(int bi=index(rl); bi<=index(ru); bi++) {
+                       int imin = pos(bi);
+                       int imax = Math.min(ru, (bi+1)*blen)-bi;
+                       for(int i=imin, ix=imin*clen; i<imax; i++, ix+=clen)
+                               Arrays.fill(data, ix+cl, ix+cu, v);
+               }
+       }
+
+       @Override
        public void set(int r, int c, double v) {
                data[index(r)][pos(r, c)] = v;
        }
 
        @Override
+       public void set(int r, double[] v) {
+               System.arraycopy(v, 0, data[index(r)], pos(r), v.length);
+       }
+
+       @Override
        public double get(int r, int c) {
                return data[index(r)][pos(r, c)];
        }
+       
+       @Override
+       public String toString() {
+               StringBuilder sb = new StringBuilder();
+               for(int i=0; i<rlen; i++) {
+                       double[] data = values(index(i));
+                       int ix = pos(i);
+                       for(int j=0; j<clen; j++) {
+                               sb.append(data[ix+j]);
+                               sb.append("\t");
+                       }
+                       sb.append("\n");
+               }
+               return sb.toString();
+       }
+       
+       private int blen(int bix) {
+               return Math.min(blen, rlen-bix*blen);
+       }
 
        private static int blocksize(int rlen, int clen) {
                return Math.min(rlen, Integer.MAX_VALUE / clen);

http://git-wip-us.apache.org/repos/asf/systemml/blob/e6424695/src/main/java/org/apache/sysml/runtime/matrix/data/LibCommonsMath.java
----------------------------------------------------------------------
diff --git 
a/src/main/java/org/apache/sysml/runtime/matrix/data/LibCommonsMath.java 
b/src/main/java/org/apache/sysml/runtime/matrix/data/LibCommonsMath.java
index d55499d..30aec56 100644
--- a/src/main/java/org/apache/sysml/runtime/matrix/data/LibCommonsMath.java
+++ b/src/main/java/org/apache/sysml/runtime/matrix/data/LibCommonsMath.java
@@ -63,7 +63,7 @@ public class LibCommonsMath
                if(opcode.equals("inverse"))
                        return computeMatrixInverse(matrixInput);
                else if (opcode.equals("cholesky"))
-                       return computeCholesky(matrixInput);            
+                       return computeCholesky(matrixInput);
                return null;
        }
        
@@ -240,8 +240,8 @@ public class LibCommonsMath
                RealMatrix u = svd.getU();
                RealMatrix v = svd.getV();
                MatrixBlock U = DataConverter.convertToMatrixBlock(u.getData());
-               MatrixBlock Sigma = DataConverter.convertToMatrixBlock(sigma, 
true);
-               Sigma = LibMatrixReorg.diag(Sigma, new MatrixBlock(Sigma.rlen, 
Sigma.rlen, true));
+               MatrixBlock Sigma = DataConverter.convertToMatrixBlock(sigma, 
true);
+               Sigma = LibMatrixReorg.diag(Sigma, new MatrixBlock(Sigma.rlen, 
Sigma.rlen, true));
                MatrixBlock V = DataConverter.convertToMatrixBlock(v.getData());
 
                return new MatrixBlock[] { U, Sigma, V };

http://git-wip-us.apache.org/repos/asf/systemml/blob/e6424695/src/main/java/org/apache/sysml/runtime/matrix/data/LibMatrixAgg.java
----------------------------------------------------------------------
diff --git 
a/src/main/java/org/apache/sysml/runtime/matrix/data/LibMatrixAgg.java 
b/src/main/java/org/apache/sysml/runtime/matrix/data/LibMatrixAgg.java
index ae5e768..7e12de0 100644
--- a/src/main/java/org/apache/sysml/runtime/matrix/data/LibMatrixAgg.java
+++ b/src/main/java/org/apache/sysml/runtime/matrix/data/LibMatrixAgg.java
@@ -191,7 +191,7 @@ public class LibMatrixAgg
                if( in.isEmptyBlock(false) ){
                        aggregateUnaryMatrixEmpty(in, out, aggtype, 
uaop.indexFn);
                        return;
-               }       
+               }
                
                //Timing time = new Timing(true);
                
@@ -203,7 +203,7 @@ public class LibMatrixAgg
                        aggregateUnaryMatrixDense(in, out, aggtype, 
uaop.aggOp.increOp.fn, uaop.indexFn, 0, m);
                else
                        aggregateUnaryMatrixSparse(in, out, aggtype, 
uaop.aggOp.increOp.fn, uaop.indexFn, 0, m);
-                               
+               
                //cleanup output and change representation (if necessary)
                out.recomputeNonZeros();
                out.examSparsity();
@@ -255,7 +255,7 @@ public class LibMatrixAgg
                                                new RowAggTask(in, out, 
aggtype, uaop, i*blklen, Math.min((i+1)*blklen, m)) :
                                                new PartialAggTask(in, out, 
aggtype, uaop, i*blklen, Math.min((i+1)*blklen, m)) );
                        }
-                       pool.invokeAll(tasks);  
+                       pool.invokeAll(tasks);
                        pool.shutdown();
                        //aggregate partial results
                        if( !(uaop.indexFn instanceof ReduceCol) ) {
@@ -557,7 +557,7 @@ public class LibMatrixAgg
                if( (type == AggType.MAX_INDEX || type == AggType.MIN_INDEX) && 
ix.getColumnIndex()!=1 ) //MAXINDEX or MININDEX
                {
                        int m = out.rlen;
-                       double[] c = out.getDenseBlock();
+                       double[] c = out.getDenseBlockValues();
                        for( int i=0, cix=0; i<m; i++, cix+=2 )
                                c[cix] = 
UtilFunctions.computeCellIndex(ix.getColumnIndex(), bclen, (int)c[cix]-1);
                }
@@ -664,9 +664,9 @@ public class LibMatrixAgg
                KahanObject kbuff = new KahanObject(0, 0);
                KahanPlus kplus = KahanPlus.getKahanPlusFnObject();
                
-               double[] a = in1.denseBlock;
-               double[] b1 = in2.denseBlock;
-               double[] b2 = (in3!=null) ? in3.denseBlock : null; //if null, 
literal 1
+               double[] a = in1.getDenseBlockValues();
+               double[] b1 = in2.getDenseBlockValues();
+               double[] b2 = (in3!=null) ? in3.getDenseBlockValues() : null; 
//if null, literal 1
                final int n = in1.clen;
                
                if( ixFn instanceof ReduceAll ) //tak+*
@@ -682,7 +682,7 @@ public class LibMatrixAgg
                }
                else //tack+*
                {
-                       double[] c = ret.getDenseBlock();
+                       double[] c = ret.getDenseBlockValues();
                        for( int i=rl, ix=rl*n; i<ru; i++ )
                                for( int j=0; j<n; j++, ix++ ) {
                                        double b2val = (b2 != null) ? b2[ix] : 
1;
@@ -734,7 +734,7 @@ public class LibMatrixAgg
                                                double val = val1 * val2;
                                                if( val != 0 && lin3 != null )
                                                        val *= 
lin3.quickGetValue(i, aix[j]);
-                                               kplus.execute2( kbuff, val );   
                                                
+                                               kplus.execute2( kbuff, val );
                                        }
                                }       
                        ret.quickSetValue(0, 0, kbuff._sum);
@@ -742,7 +742,7 @@ public class LibMatrixAgg
                }
                else //tack+*
                {
-                       double[] c = ret.getDenseBlock();
+                       double[] c = ret.getDenseBlockValues();
                        for( int i=rl; i<ru; i++ )
                                if( !a.isEmpty(i) ) {
                                        int apos = a.pos(i);
@@ -825,8 +825,9 @@ public class LibMatrixAgg
                        }
                        else //DENSE target
                        {
+                               double[] a = target.getDenseBlockValues();
                                for ( int i=0; i < target.getNumColumns(); i++ 
) {
-                                       double d = target.denseBlock[ i ];
+                                       double d = a[ i ];
                                        if( d != 0 ) //sparse-safe
                                        {
                                                int g = (int) 
groups.quickGetValue(i, 0);
@@ -872,7 +873,7 @@ public class LibMatrixAgg
                        }
                        else //DENSE target
                        {
-                               double[] a = target.denseBlock;
+                               double[] a = target.getDenseBlockValues();
                                
                                for( int i=0, aix=0; i < groups.getNumRows(); 
i++, aix+=numCols ) 
                                {
@@ -944,7 +945,7 @@ public class LibMatrixAgg
                }
                else //DENSE target
                {
-                       double[] a = target.denseBlock;
+                       double[] a = target.getDenseBlockValues();
                        
                        for( int i=0, aix=0; i < groups.getNumRows(); i++, 
aix+=target.clen ) 
                        {
@@ -977,7 +978,7 @@ public class LibMatrixAgg
                if( groups.isInSparseFormat() || groups.isEmptyBlock(false) )
                        throw new DMLRuntimeException("Unsupported sparse input 
for aggregate-count on group vector.");
                
-               double[] a = groups.denseBlock;
+               double[] a = groups.getDenseBlockValues();
                int[] tmp = new int[numGroups];
                int m = groups.rlen;
                
@@ -1005,9 +1006,9 @@ public class LibMatrixAgg
                aggVal.allocateDenseBlock(); //should always stay in dense
                aggCorr.allocateDenseBlock(); //should always stay in dense
                
-               double[] a = in.getDenseBlock();
-               double[] c = aggVal.getDenseBlock();
-               double[] cc = aggCorr.getDenseBlock();
+               double[] a = in.getDenseBlockValues();
+               double[] c = aggVal.getDenseBlockValues();
+               double[] cc = aggCorr.getDenseBlockValues();
                
                KahanObject buffer1 = new KahanObject(0, 0);
                KahanPlus akplus = KahanPlus.getKahanPlusFnObject();
@@ -1043,8 +1044,8 @@ public class LibMatrixAgg
                aggCorr.allocateDenseBlock(); //should always stay in dense
                
                SparseBlock a = in.getSparseBlock();
-               double[] c = aggVal.getDenseBlock();
-               double[] cc = aggCorr.getDenseBlock();
+               double[] c = aggVal.getDenseBlockValues();
+               double[] cc = aggCorr.getDenseBlockValues();
                
                KahanObject buffer1 = new KahanObject(0, 0);
                KahanPlus akplus = KahanPlus.getKahanPlusFnObject();
@@ -1127,7 +1128,7 @@ public class LibMatrixAgg
                final int m = in.rlen;
                final int n = in.clen;
                
-               double[] a = in.getDenseBlock();
+               double[] a = in.getDenseBlockValues();
                
                KahanObject buffer = new KahanObject(0, 0);
                KahanPlus akplus = KahanPlus.getKahanPlusFnObject();
@@ -1158,7 +1159,7 @@ public class LibMatrixAgg
                final int n = in.clen;
                final int cix = (m-1)*n;
                
-               double[] a = in.getDenseBlock();
+               double[] a = in.getDenseBlockValues();
                
                KahanObject buffer = new KahanObject(0, 0);
                KahanPlus akplus = KahanPlus.getKahanPlusFnObject();
@@ -1228,7 +1229,7 @@ public class LibMatrixAgg
                final int m = in.rlen;
                final int n = in.clen;
                
-               double[] a = in.getDenseBlock();
+               double[] a = in.getDenseBlockValues();
                
                KahanObject buffer = new KahanObject(0, 0);
                KahanPlus akplus = KahanPlus.getKahanPlusFnObject();
@@ -1296,8 +1297,8 @@ public class LibMatrixAgg
                final int m = in.rlen;
                final int n = in.clen;
                
-               double[] a = in.getDenseBlock();
-               double[] c = out.getDenseBlock();               
+               double[] a = in.getDenseBlockValues();
+               double[] c = out.getDenseBlockValues();
                
                switch( optype )
                {
@@ -1419,7 +1420,7 @@ public class LibMatrixAgg
                final int n = in.clen;
                
                SparseBlock a = in.getSparseBlock();
-               double[] c = out.getDenseBlock();
+               double[] c = out.getDenseBlockValues();
                
                switch( optype )
                {
@@ -1539,8 +1540,8 @@ public class LibMatrixAgg
                final int m = in.rlen;
                final int n = in.clen;
                
-               double[] a = in.getDenseBlock();
-               double[] c = out.getDenseBlock();               
+               double[] a = in.getDenseBlockValues();
+               double[] c = out.getDenseBlockValues();
                
                switch( optype )
                {
@@ -1576,7 +1577,7 @@ public class LibMatrixAgg
                final int n = in.clen;
                
                SparseBlock a = in.getSparseBlock();
-               double[] c = out.getDenseBlock();
+               double[] c = out.getDenseBlockValues();
                
                switch( optype )
                {

Reply via email to