Repository: systemml
Updated Branches:
  refs/heads/master 95bf8cfe6 -> f1b9d1c08


[SYSTEMML-2468] Fix MNC sparsity estimator integer overflows

This patch fixes various cases of the MNC (matrix histogram) sparsity
estimator that ran into integer overflows on moderately large data.


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

Branch: refs/heads/master
Commit: f1b9d1c08d750059af7c4dad6938d80d4852ee86
Parents: 95bf8cf
Author: Matthias Boehm <[email protected]>
Authored: Tue Oct 16 21:48:38 2018 +0200
Committer: Matthias Boehm <[email protected]>
Committed: Tue Oct 16 21:48:50 2018 +0200

----------------------------------------------------------------------
 .../apache/sysml/hops/estim/EstimatorMatrixHistogram.java | 10 +++++-----
 1 file changed, 5 insertions(+), 5 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/systemml/blob/f1b9d1c0/src/main/java/org/apache/sysml/hops/estim/EstimatorMatrixHistogram.java
----------------------------------------------------------------------
diff --git 
a/src/main/java/org/apache/sysml/hops/estim/EstimatorMatrixHistogram.java 
b/src/main/java/org/apache/sysml/hops/estim/EstimatorMatrixHistogram.java
index 206c6d5..52cca3d 100644
--- a/src/main/java/org/apache/sysml/hops/estim/EstimatorMatrixHistogram.java
+++ b/src/main/java/org/apache/sysml/hops/estim/EstimatorMatrixHistogram.java
@@ -152,19 +152,19 @@ public class EstimatorMatrixHistogram extends 
SparsityEstimator
                //dot(h1.cNnz,h2rNnz) gives the exact number of non-zeros in 
the output
                if( h1.rMaxNnz <= 1 || h2.cMaxNnz <= 1 ) {
                        for( int j=0; j<h1.getCols(); j++ )
-                               nnz += h1.cNnz[j] * h2.rNnz[j];
+                               nnz += (long)h1.cNnz[j] * h2.rNnz[j];
                }
                //special case, with hybrid exact and approximate output
                else if(h1.cNnz1e!=null && h2.rNnz1e != null) {
                        //note: normally h1.getRows()*h2.getCols() would define 
mnOut
                        //but by leveraging the knowledge of rows/cols w/ <=1 
nnz, we account
                        //that exact and approximate fractions touch different 
areas
-                       long mnOut = (h1.rNonEmpty-h1.rN1) * 
(h2.cNonEmpty-h2.cN1);
+                       long mnOut = (long)(h1.rNonEmpty-h1.rN1) * 
(h2.cNonEmpty-h2.cN1);
                        double spOutRest = 0;
                        for( int j=0; j<h1.getCols(); j++ ) {
                                //exact fractions, w/o double counting
-                               nnz += h1.cNnz1e[j] * h2.rNnz[j];
-                               nnz += (h1.cNnz[j]-h1.cNnz1e[j]) * h2.rNnz1e[j];
+                               nnz += (long)h1.cNnz1e[j] * h2.rNnz[j];
+                               nnz += (long)(h1.cNnz[j]-h1.cNnz1e[j]) * 
h2.rNnz1e[j];
                                //approximate fraction, w/o double counting
                                double lsp = (double)(h1.cNnz[j]-h1.cNnz1e[j]) 
                                        * (h2.rNnz[j]-h2.rNnz1e[j]) / mnOut;
@@ -174,7 +174,7 @@ public class EstimatorMatrixHistogram extends 
SparsityEstimator
                }
                //general case with approximate output
                else {
-                       long mnOut = h1.getRows()*h2.getCols();
+                       long mnOut = (long)h1.getRows()*h2.getCols();
                        double spOut = 0;
                        for( int j=0; j<h1.getCols(); j++ ) {
                                double lsp = (double) h1.cNnz[j] * h2.rNnz[j] / 
mnOut;

Reply via email to