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 2016/01/24 01:09:20 UTC

[3/5] incubator-systemml git commit: Fix error handling ultra-sparse data generation (int overflow)

Fix error handling ultra-sparse data generation (int overflow)

Project: http://git-wip-us.apache.org/repos/asf/incubator-systemml/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-systemml/commit/10d1afc9
Tree: http://git-wip-us.apache.org/repos/asf/incubator-systemml/tree/10d1afc9
Diff: http://git-wip-us.apache.org/repos/asf/incubator-systemml/diff/10d1afc9

Branch: refs/heads/master
Commit: 10d1afc9dac5fe2c4615019e52113de8f9400754
Parents: 9cb7d55
Author: Matthias Boehm <mb...@us.ibm.com>
Authored: Fri Jan 22 20:54:05 2016 -0800
Committer: Matthias Boehm <mb...@us.ibm.com>
Committed: Sat Jan 23 16:08:07 2016 -0800

----------------------------------------------------------------------
 .../runtime/matrix/data/LibMatrixDatagen.java   | 27 +++++++++++---------
 1 file changed, 15 insertions(+), 12 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-systemml/blob/10d1afc9/src/main/java/org/apache/sysml/runtime/matrix/data/LibMatrixDatagen.java
----------------------------------------------------------------------
diff --git a/src/main/java/org/apache/sysml/runtime/matrix/data/LibMatrixDatagen.java b/src/main/java/org/apache/sysml/runtime/matrix/data/LibMatrixDatagen.java
index dcaaf1a..c190e50 100644
--- a/src/main/java/org/apache/sysml/runtime/matrix/data/LibMatrixDatagen.java
+++ b/src/main/java/org/apache/sysml/runtime/matrix/data/LibMatrixDatagen.java
@@ -127,19 +127,22 @@ public class LibMatrixDatagen
 	 * @return
 	 * @throws DMLRuntimeException
 	 */
-	public static long[] computeNNZperBlock(long nrow, long ncol, int brlen, int bclen, double sparsity) throws DMLRuntimeException {
-		int numBlocks = (int) (Math.ceil((double)nrow/brlen) * Math.ceil((double)ncol/bclen));
-		
-		// CURRENT: 
-		// 		Total #of NNZ is set to the expected value (nrow*ncol*sparsity).
-		// TODO: 
-		//		Instead of using the expected value, one should actually 
-		// 		treat NNZ as a random variable and accordingly generate a random value.
-		long nnz = (long) Math.ceil (nrow * (ncol*sparsity));
-
-		if ( numBlocks > Integer.MAX_VALUE ) {
-			throw new DMLRuntimeException("A random matrix of size [" + nrow + "," + ncol + "] can not be created. Number of blocks (" +  numBlocks + ") exceeds the maximum integer size. Try to increase the block size.");
+	public static long[] computeNNZperBlock(long nrow, long ncol, int brlen, int bclen, double sparsity) 
+		throws DMLRuntimeException 
+	{
+		long lnumBlocks = (long) (Math.ceil((double)nrow/brlen) * Math.ceil((double)ncol/bclen));
+		
+		//sanity check max number of blocks (before cast to avoid overflow)
+		if ( lnumBlocks > Integer.MAX_VALUE ) {
+			throw new DMLRuntimeException("A random matrix of size [" + nrow + "," + ncol + "] can not be created. "
+					+ "Number of blocks ("+lnumBlocks+") exceeds the maximum integer size. Try to increase the block size.");
 		}
+
+		// NOTE: Total #of NNZ is set to the expected value (nrow*ncol*sparsity).
+		// TODO: Instead of using the expected value, NNZ should be random variable 
+		
+		int numBlocks = (int) lnumBlocks;
+		long nnz = (long) Math.ceil (nrow * (ncol*sparsity));
 		
 		// Compute block-level NNZ
 		long[] ret  = new long[numBlocks];