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 )