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 )