Repository: systemml
Updated Branches:
  refs/heads/master 0c3a46ba1 -> b152d73b3


[SYSTEMML-2046] Fix right indexing / recompute nnz large dense blocks

This patch fixes two special cases related to large dense block,
specifically column right indexing and the recomputation of non-zeros.


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

Branch: refs/heads/master
Commit: b152d73b378055cc5e52ac954b0edd98f1254be8
Parents: 0c3a46b
Author: Matthias Boehm <[email protected]>
Authored: Sat Dec 30 12:06:59 2017 -0800
Committer: Matthias Boehm <[email protected]>
Committed: Sat Dec 30 12:06:59 2017 -0800

----------------------------------------------------------------------
 .../sysml/runtime/matrix/data/DenseBlockDRB.java | 10 +++++-----
 .../runtime/matrix/data/DenseBlockLDRB.java      | 19 +++++++++++++------
 .../sysml/runtime/matrix/data/MatrixBlock.java   |  2 +-
 3 files changed, 19 insertions(+), 12 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/systemml/blob/b152d73b/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 f1520c0..3cd7f52 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
@@ -22,6 +22,8 @@ package org.apache.sysml.runtime.matrix.data;
 
 import java.util.Arrays;
 
+import org.apache.sysml.runtime.util.UtilFunctions;
+
 public class DenseBlockDRB extends DenseBlock
 {
        private static final long serialVersionUID = 8546723684649816489L;
@@ -113,14 +115,12 @@ public class DenseBlockDRB extends DenseBlock
        @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;
+               if( cl == 0 && cu == clen ) { //specific case: all cols
+                       nnz += UtilFunctions.computeNnz(data, rl*clen, 
(ru-rl)*clen);
                }
                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;
+                               nnz += UtilFunctions.computeNnz(data, ix+cl, 
cu-cl);
                }
                return nnz;
        }

http://git-wip-us.apache.org/repos/asf/systemml/blob/b152d73b/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 ff3357b..7dfe57f 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
@@ -22,6 +22,8 @@ package org.apache.sysml.runtime.matrix.data;
 
 import java.util.Arrays;
 
+import org.apache.sysml.runtime.util.UtilFunctions;
+
 public class DenseBlockLDRB extends DenseBlock
 {
        private static final long serialVersionUID = -7285459683402612969L;
@@ -129,12 +131,17 @@ public class DenseBlockLDRB extends DenseBlock
        @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];
-                       int blen = blockSize(bi);
-                       for(int i=pos(bi), ix=pos(bi)*clen; i<blen; i++, 
ix+=clen)
-                               for( int j=cl; j<cu; j++ )
-                                       nnz += (a[ix+j]!=0) ? 1 : 0;
+               boolean rowBlock = (cl == 0 && cu == clen);
+               final int bil = index(rl);
+               final int biu = index(ru-1);
+               for(int bi=bil; bi<=biu; bi++) {
+                       int lpos = (bi==bil) ? pos(rl) : 0;
+                       int len = (bi==biu) ? pos(ru-1)-lpos+clen : 
blockSize(bi)*clen;
+                       if( rowBlock )
+                               nnz += UtilFunctions.computeNnz(data[bi], lpos, 
len);
+                       else
+                               for(int i=lpos; i<lpos+len; i+=clen)
+                                       nnz += 
UtilFunctions.computeNnz(data[i], i+cl, cu-cl);
                }
                return nnz;
        }

http://git-wip-us.apache.org/repos/asf/systemml/blob/b152d73b/src/main/java/org/apache/sysml/runtime/matrix/data/MatrixBlock.java
----------------------------------------------------------------------
diff --git 
a/src/main/java/org/apache/sysml/runtime/matrix/data/MatrixBlock.java 
b/src/main/java/org/apache/sysml/runtime/matrix/data/MatrixBlock.java
index cbeef5e..aa728b0 100644
--- a/src/main/java/org/apache/sysml/runtime/matrix/data/MatrixBlock.java
+++ b/src/main/java/org/apache/sysml/runtime/matrix/data/MatrixBlock.java
@@ -3755,7 +3755,7 @@ public class MatrixBlock extends MatrixValue implements 
CacheBlock, Externalizab
                                DenseBlock a = getDenseBlock();
                                double[] c = dest.getDenseBlockValues();
                                for( int i=rl; i<=ru; i++ )
-                                       c[i] = a.get(i, cl);
+                                       c[i-rl] = a.get(i, cl);
                        }
                }
                else { // GENERAL RANGE INDEXING

Reply via email to