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
