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 <j...@protonmail.com>
Authored: Mon Feb 19 00:35:31 2018 -0800
Committer: Matthias Boehm <mboe...@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 )

Reply via email to