You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@systemml.apache.org by mb...@apache.org on 2018/02/19 08:37:15 UTC
systemml git commit: [SYSTEMML-2130] Sparse block API extension for
validity checks
Repository: systemml
Updated Branches:
refs/heads/master f4954b78f -> e9a6e396a
[SYSTEMML-2130] Sparse block API extension for validity checks
Closes #730.
Project: http://git-wip-us.apache.org/repos/asf/systemml/repo
Commit: http://git-wip-us.apache.org/repos/asf/systemml/commit/e9a6e396
Tree: http://git-wip-us.apache.org/repos/asf/systemml/tree/e9a6e396
Diff: http://git-wip-us.apache.org/repos/asf/systemml/diff/e9a6e396
Branch: refs/heads/master
Commit: e9a6e396a3d46e0e2ce41f196e5920d3c8508dce
Parents: f4954b7
Author: Janardhan Pulivarthi <j1...@protonmail.com>
Authored: Mon Feb 19 00:35:31 2018 -0800
Committer: Matthias Boehm <mb...@gmail.com>
Committed: Mon Feb 19 00:35:32 2018 -0800
----------------------------------------------------------------------
.../runtime/controlprogram/ProgramBlock.java | 6 +++
.../sysml/runtime/matrix/data/SparseBlock.java | 14 ++++++
.../runtime/matrix/data/SparseBlockCOO.java | 8 ++-
.../runtime/matrix/data/SparseBlockCSR.java | 53 +++++++++++++++++++-
.../runtime/matrix/data/SparseBlockMCSR.java | 8 ++-
5 files changed, 86 insertions(+), 3 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/systemml/blob/e9a6e396/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 28256f6..54c9e70 100644
--- a/src/main/java/org/apache/sysml/runtime/controlprogram/ProgramBlock.java
+++ b/src/main/java/org/apache/sysml/runtime/controlprogram/ProgramBlock.java
@@ -363,7 +363,13 @@ public class ProgramBlock implements ParseInfo
synchronized( mb ) { //potential state change
mb.recomputeNonZeros();
mb.examSparsity();
+
+ }
+ if( mb.isInSparseFormat() && mb.isAllocated() ) {
+ mb.getSparseBlock().checkValidity(mb.getNumRows(),
+ mb.getNumColumns(), mb.getNonZeros(), true);
}
+
boolean sparse2 = mb.isInSparseFormat();
long nnz2 = mb.getNonZeros();
mo.release();
http://git-wip-us.apache.org/repos/asf/systemml/blob/e9a6e396/src/main/java/org/apache/sysml/runtime/matrix/data/SparseBlock.java
----------------------------------------------------------------------
diff --git a/src/main/java/org/apache/sysml/runtime/matrix/data/SparseBlock.java b/src/main/java/org/apache/sysml/runtime/matrix/data/SparseBlock.java
index d4e8d3d..7579029 100644
--- a/src/main/java/org/apache/sysml/runtime/matrix/data/SparseBlock.java
+++ b/src/main/java/org/apache/sysml/runtime/matrix/data/SparseBlock.java
@@ -247,6 +247,20 @@ public abstract class SparseBlock implements Serializable
*/
public abstract boolean isEmpty(int r);
+ /**
+ * Validate the correctness of the internal data structures of the different
+ * sparse block implementations.
+ *
+ * @param rlen number of rows
+ * @param clen number of columns
+ * @param nnz number of non zeros
+ * @param strict enforce optional properties
+ * @return true if the sparse block is valid wrt the corresponding format
+ * such as COO, CSR, MCSR.
+ */
+
+ public abstract boolean checkValidity(int rlen, int clen, long nnz, boolean strict);
+
////////////////////////
//obtain indexes/values/positions
http://git-wip-us.apache.org/repos/asf/systemml/blob/e9a6e396/src/main/java/org/apache/sysml/runtime/matrix/data/SparseBlockCOO.java
----------------------------------------------------------------------
diff --git a/src/main/java/org/apache/sysml/runtime/matrix/data/SparseBlockCOO.java b/src/main/java/org/apache/sysml/runtime/matrix/data/SparseBlockCOO.java
index bd59644..3cd500a 100644
--- a/src/main/java/org/apache/sysml/runtime/matrix/data/SparseBlockCOO.java
+++ b/src/main/java/org/apache/sysml/runtime/matrix/data/SparseBlockCOO.java
@@ -191,7 +191,13 @@ public class SparseBlockCOO extends SparseBlock
public boolean isAllocated(int r) {
return true;
}
-
+
+ @Override
+ public boolean checkValidity(int rlen, int clen, long nnz, boolean strict) {
+ //empty implementation
+ return true;
+ }
+
@Override
public void reset() {
_size = 0;
http://git-wip-us.apache.org/repos/asf/systemml/blob/e9a6e396/src/main/java/org/apache/sysml/runtime/matrix/data/SparseBlockCSR.java
----------------------------------------------------------------------
diff --git a/src/main/java/org/apache/sysml/runtime/matrix/data/SparseBlockCSR.java b/src/main/java/org/apache/sysml/runtime/matrix/data/SparseBlockCSR.java
index 69488ad..de0c34b 100644
--- a/src/main/java/org/apache/sysml/runtime/matrix/data/SparseBlockCSR.java
+++ b/src/main/java/org/apache/sysml/runtime/matrix/data/SparseBlockCSR.java
@@ -841,7 +841,58 @@ public class SparseBlockCSR extends SparseBlock
return sb.toString();
}
-
+
+ @Override
+ public boolean checkValidity(int rlen, int clen, long nnz, boolean strict) {
+ //1. correct meta data
+ if( rlen < 0 || clen < 0 ) {
+ throw new RuntimeException("Invalid block dimensions: "+rlen+" "+clen);
+ }
+
+ //2. correct array lengths
+ if(_size != nnz && _ptr.length < rlen+1 && _values.length < nnz && _indexes.length < nnz ) {
+ throw new RuntimeException("Incorrect array lengths.");
+ }
+
+ //3. non-decreasing row pointers
+ for( int i=1; i<rlen; i++ ) {
+ if(_ptr[i-1] > _ptr[i] && strict)
+ throw new RuntimeException("Row pointers are decreasing at row: "+i
+ + ", with pointers "+_ptr[i-1]+" > "+_ptr[i]);
+ }
+
+ //4. sorted column indexes per row
+ for( int i=0; i<rlen; i++ ) {
+ int apos = pos(i);
+ int alen = size(i);
+ for( int k=apos+1; k<apos+alen; k++)
+ if( _indexes[k-1] >= _indexes[k] )
+ throw new RuntimeException("Wrong sparse row ordering: "
+ + k + " "+_indexes[k-1]+" "+_indexes[k]);
+ for( int k=apos; k<apos+alen; k++ )
+ if( _values[k] == 0 )
+ throw new RuntimeException("Wrong sparse row: zero at "
+ + k + " at col index " + _indexes[k]);
+ }
+
+ //5. non-existing zero values
+ for( int i=0; i<_size; i++ ) {
+ if( _values[i] == 0 ) {
+ throw new RuntimeException("The values array should not contain zeros."
+ + " The " + i + "th value is "+_values[i]);
+ }
+ }
+
+ //6. a capacity that is no larger than nnz times resize factor.
+ int capacity = _values.length;
+ if(capacity > nnz*RESIZE_FACTOR1 ) {
+ throw new RuntimeException("Capacity is larger than the nnz times a resize factor."
+ + " Current size: "+capacity+ ", while Expected size:"+nnz*RESIZE_FACTOR1);
+ }
+
+ return true;
+ }
+
///////////////////////////
// private helper methods
http://git-wip-us.apache.org/repos/asf/systemml/blob/e9a6e396/src/main/java/org/apache/sysml/runtime/matrix/data/SparseBlockMCSR.java
----------------------------------------------------------------------
diff --git a/src/main/java/org/apache/sysml/runtime/matrix/data/SparseBlockMCSR.java b/src/main/java/org/apache/sysml/runtime/matrix/data/SparseBlockMCSR.java
index 73db5ec..954248d 100644
--- a/src/main/java/org/apache/sysml/runtime/matrix/data/SparseBlockMCSR.java
+++ b/src/main/java/org/apache/sysml/runtime/matrix/data/SparseBlockMCSR.java
@@ -157,7 +157,13 @@ public class SparseBlockMCSR extends SparseBlock
public boolean isAllocated(int r) {
return (_rows[r] != null);
}
-
+
+ @Override
+ public boolean checkValidity(int rlen, int clen, long nnz, boolean strict) {
+ // empty implementation
+ return true;
+ }
+
@Override
public void reset() {
for( SparseRow row : _rows )