This is an automated email from the ASF dual-hosted git repository.

mboehm7 pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/systemds.git


The following commit(s) were added to refs/heads/main by this push:
     new d7267058f8 [MINOR] Improved code coverage and fixes sparsity estimators
d7267058f8 is described below

commit d7267058f8226035858327057655a3417c94d0dd
Author: Matthias Boehm <[email protected]>
AuthorDate: Mon Nov 25 12:09:33 2024 +0100

    [MINOR] Improved code coverage and fixes sparsity estimators
---
 .../apache/sysds/hops/estim/EstimationUtils.java   |   4 +-
 .../apache/sysds/hops/estim/EstimatorBitsetMM.java |  18 +++-
 .../test/component/estim/SelfProductTest.java      | 107 ++++++++++++---------
 .../component/estim/SquaredProductChainTest.java   |  11 +++
 4 files changed, 91 insertions(+), 49 deletions(-)

diff --git a/src/main/java/org/apache/sysds/hops/estim/EstimationUtils.java 
b/src/main/java/org/apache/sysds/hops/estim/EstimationUtils.java
index 2cdb46b912..eeca0f115f 100644
--- a/src/main/java/org/apache/sysds/hops/estim/EstimationUtils.java
+++ b/src/main/java/org/apache/sysds/hops/estim/EstimationUtils.java
@@ -94,8 +94,8 @@ public abstract class EstimationUtils
                                double[] avals = a.values(i);
                                int aix = a.pos(i);
                                Arrays.fill(tmp, 0); //reset
-                               for( int k=aix; k<aix+n; k++ ) {
-                                       double aval = avals[k];
+                               for( int k=0; k<n; k++ ) {
+                                       double aval = avals[aix+k];
                                        if( aval == 0 ) continue;
                                        double[] bvals = a.values(k);
                                        int bix = a.pos(k);
diff --git a/src/main/java/org/apache/sysds/hops/estim/EstimatorBitsetMM.java 
b/src/main/java/org/apache/sysds/hops/estim/EstimatorBitsetMM.java
index 8917b03304..ec257553e7 100644
--- a/src/main/java/org/apache/sysds/hops/estim/EstimatorBitsetMM.java
+++ b/src/main/java/org/apache/sysds/hops/estim/EstimatorBitsetMM.java
@@ -45,6 +45,16 @@ import java.util.stream.IntStream;
  */
 public class EstimatorBitsetMM extends SparsityEstimator
 {
+       private final int _type;
+       
+       public EstimatorBitsetMM() {
+               this(-1);
+       }
+       
+       public EstimatorBitsetMM(int type) {
+               _type = type;
+       }
+       
        @Override
        public DataCharacteristics estim(MMNode root) {
                BitsetMatrix m1Map = getCachedSynopsis(root.getLeft());
@@ -205,14 +215,14 @@ public class EstimatorBitsetMM extends SparsityEstimator
                //protected abstract BitsetMatrix reshape(int rows, int cols, 
boolean byrow);
        }
        
-       public static BitsetMatrix createBitset(int m, int n) {
-               return (long)m*n < Integer.MAX_VALUE ?
+       public BitsetMatrix createBitset(int m, int n) {
+               return ((long)m*n < Integer.MAX_VALUE && _type != 2) ?
                        new BitsetMatrix1(m, n) : //linearized long array
                        new BitsetMatrix2(m, n);  //bitset per row
        }
        
-       public static BitsetMatrix createBitset(MatrixBlock in) {
-               return in.getLength() < Integer.MAX_VALUE ?
+       public BitsetMatrix createBitset(MatrixBlock in) {
+               return (in.getLength() < Integer.MAX_VALUE && _type != 2) ?
                        new BitsetMatrix1(in) : //linearized long array
                        new BitsetMatrix2(in);  //bitset per row
        }
diff --git 
a/src/test/java/org/apache/sysds/test/component/estim/SelfProductTest.java 
b/src/test/java/org/apache/sysds/test/component/estim/SelfProductTest.java
index 7167dc2226..dd827f4990 100644
--- a/src/test/java/org/apache/sysds/test/component/estim/SelfProductTest.java
+++ b/src/test/java/org/apache/sysds/test/component/estim/SelfProductTest.java
@@ -26,8 +26,10 @@ import org.apache.sysds.hops.estim.EstimatorBasicAvg;
 import org.apache.sysds.hops.estim.EstimatorBasicWorst;
 import org.apache.sysds.hops.estim.EstimatorBitsetMM;
 import org.apache.sysds.hops.estim.EstimatorDensityMap;
+import org.apache.sysds.hops.estim.EstimatorLayeredGraph;
 import org.apache.sysds.hops.estim.EstimatorMatrixHistogram;
 import org.apache.sysds.hops.estim.EstimatorSample;
+import org.apache.sysds.hops.estim.EstimatorSampleRa;
 import org.apache.sysds.hops.estim.SparsityEstimator;
 import org.apache.sysds.runtime.instructions.InstructionUtils;
 import org.apache.sysds.runtime.matrix.data.MatrixBlock;
@@ -37,8 +39,10 @@ import org.apache.sysds.test.TestUtils;
 public class SelfProductTest extends AutomatedTestBase 
 {
        private final static int m = 2500;
-       private final static double sparsity1 = 0.0001;
-       private final static double sparsity2 = 0.000001;
+       private final static double sparsity0 = 0.5;
+       private final static double sparsity1 = 0.1;
+       private final static double sparsity2 = 0.0001;
+       private final static double sparsity3 = 0.000001;
        private final static double eps1 = 0.05;
        private final static double eps2 = 1e-4;
        private final static double eps3 = 0;
@@ -50,97 +54,114 @@ public class SelfProductTest extends AutomatedTestBase
        }
        
        @Test
-       public void testBasicAvgCase1() {
-               runSparsityEstimateTest(new EstimatorBasicAvg(), m, sparsity1);
-       }
-       
-       @Test
-       public void testBasicAvgCase2() {
+       public void testBasicAvgCase() {
+               runSparsityEstimateTest(new EstimatorBasicAvg(), m/4, 
sparsity0);
+               runSparsityEstimateTest(new EstimatorBasicAvg(), m/2, 
sparsity1);
                runSparsityEstimateTest(new EstimatorBasicAvg(), m, sparsity2);
+               runSparsityEstimateTest(new EstimatorBasicAvg(), m, sparsity3);
        }
        
        @Test
-       public void testDensityMapCase1() {
-               runSparsityEstimateTest(new EstimatorDensityMap(), m, 
sparsity1);
-       }
-       
-       @Test
-       public void testDensityMapCase2() {
+       public void testDensityMapCase() {
+               runSparsityEstimateTest(new EstimatorDensityMap(), m/4, 
sparsity0);
+               runSparsityEstimateTest(new EstimatorDensityMap(), m/2, 
sparsity1);
                runSparsityEstimateTest(new EstimatorDensityMap(), m, 
sparsity2);
+               runSparsityEstimateTest(new EstimatorDensityMap(), m, 
sparsity3);
        }
        
        @Test
-       public void testDensityMap7Case1() {
-               runSparsityEstimateTest(new EstimatorDensityMap(7), m, 
sparsity1);
-       }
-       
-       @Test
-       public void testDensityMap7Case2() {
+       public void testDensityMap7Case() {
+               runSparsityEstimateTest(new EstimatorDensityMap(7), m/4, 
sparsity0);
+               runSparsityEstimateTest(new EstimatorDensityMap(7), m/2, 
sparsity1);
                runSparsityEstimateTest(new EstimatorDensityMap(7), m, 
sparsity2);
+               runSparsityEstimateTest(new EstimatorDensityMap(7), m, 
sparsity3);
        }
        
        @Test
-       public void testBitsetMatrixCase1() {
-               runSparsityEstimateTest(new EstimatorBitsetMM(), m, sparsity1);
+       public void testBitsetMatrixCase() {
+               runSparsityEstimateTest(new EstimatorBitsetMM(), m/4, 
sparsity0);
+               runSparsityEstimateTest(new EstimatorBitsetMM(), m/2, 
sparsity1);
+               runSparsityEstimateTest(new EstimatorBitsetMM(), m, sparsity2);
+               runSparsityEstimateTest(new EstimatorBitsetMM(), m, sparsity3);
        }
        
        @Test
-       public void testBitsetMatrixCase2() {
-               runSparsityEstimateTest(new EstimatorBitsetMM(), m, sparsity2);
+       public void testBitset2MatrixCase() {
+               runSparsityEstimateTest(new EstimatorBitsetMM(2), m/4, 
sparsity0);
+               runSparsityEstimateTest(new EstimatorBitsetMM(2), m/2, 
sparsity1);
+               runSparsityEstimateTest(new EstimatorBitsetMM(2), m, sparsity2);
+               runSparsityEstimateTest(new EstimatorBitsetMM(2), m, sparsity3);
        }
        
        @Test
-       public void testMatrixHistogramCase1() {
-               runSparsityEstimateTest(new EstimatorMatrixHistogram(false), m, 
sparsity1);
+       public void testMatrixHistogramCase() {
+               runSparsityEstimateTest(new EstimatorMatrixHistogram(false), 
m/4, sparsity0);
+               runSparsityEstimateTest(new EstimatorMatrixHistogram(false), 
m/2, sparsity1);
+               runSparsityEstimateTest(new EstimatorMatrixHistogram(false), m, 
sparsity2);
+               runSparsityEstimateTest(new EstimatorMatrixHistogram(false), m, 
sparsity3);
        }
        
        @Test
-       public void testMatrixHistogramCase2() {
-               runSparsityEstimateTest(new EstimatorMatrixHistogram(false), m, 
sparsity2);
+       public void testMatrixHistogramExceptCase() {
+               runSparsityEstimateTest(new EstimatorMatrixHistogram(true), 
m/4, sparsity0);
+               runSparsityEstimateTest(new EstimatorMatrixHistogram(true), 
m/2, sparsity1);
+               runSparsityEstimateTest(new EstimatorMatrixHistogram(true), m, 
sparsity2);
+               runSparsityEstimateTest(new EstimatorMatrixHistogram(true), m, 
sparsity3);
        }
        
        @Test
-       public void testMatrixHistogramExceptCase1() {
-               runSparsityEstimateTest(new EstimatorMatrixHistogram(true), m, 
sparsity1);
+       public void testSamplingDefCase() {
+               runSparsityEstimateTest(new EstimatorSample(), m, sparsity2);
+               runSparsityEstimateTest(new EstimatorSample(), m, sparsity3);
        }
        
        @Test
-       public void testMatrixHistogramExceptCase2() {
-               runSparsityEstimateTest(new EstimatorMatrixHistogram(true), m, 
sparsity2);
+       public void testSampling20Case() {
+               runSparsityEstimateTest(new EstimatorSample(0.2), m, sparsity2);
+               runSparsityEstimateTest(new EstimatorSample(0.2), m, sparsity3);
        }
        
        @Test
-       public void testSamplingDefCase1() {
-               runSparsityEstimateTest(new EstimatorSample(), m, sparsity1);
+       public void testSamplingRaDefCase() {
+               runSparsityEstimateTest(new EstimatorSampleRa(), m/4, 
sparsity0);
+               runSparsityEstimateTest(new EstimatorSampleRa(), m, sparsity2);
+               runSparsityEstimateTest(new EstimatorSampleRa(), m, sparsity3);
        }
        
        @Test
-       public void testSamplingDefCase2() {
-               runSparsityEstimateTest(new EstimatorSample(), m, sparsity2);
+       public void testSamplingRa20Case() {
+               runSparsityEstimateTest(new EstimatorSampleRa(0.2), m/4, 
sparsity0);
+               runSparsityEstimateTest(new EstimatorSampleRa(0.2), m, 
sparsity2);
+               runSparsityEstimateTest(new EstimatorSampleRa(0.2), m, 
sparsity3);
        }
        
        @Test
-       public void testSampling20Case1() {
-               runSparsityEstimateTest(new EstimatorSample(0.2), m, sparsity1);
+       public void testLayeredGraphDefCase() {
+               runSparsityEstimateTest(new EstimatorLayeredGraph(), m, 
sparsity2);
+               runSparsityEstimateTest(new EstimatorLayeredGraph(), m, 
sparsity3);
        }
        
        @Test
-       public void testSampling20Case2() {
-               runSparsityEstimateTest(new EstimatorSample(0.2), m, sparsity2);
+       public void testLayeredGraph64Case() {
+               runSparsityEstimateTest(new EstimatorLayeredGraph(64), m, 
sparsity2);
+               runSparsityEstimateTest(new EstimatorLayeredGraph(64), m, 
sparsity3);
        }
        
        private static void runSparsityEstimateTest(SparsityEstimator estim, 
int n, double sp) {
-               MatrixBlock m1 = MatrixBlock.randOperations(m, n, sp, 1, 1, 
"uniform", 3);
+               MatrixBlock m1 = MatrixBlock.randOperations(n, n, sp, 1, 1, 
"uniform", 3);
                MatrixBlock m3 = m1.aggregateBinaryOperations(m1, m1, 
                        new MatrixBlock(), 
InstructionUtils.getMatMultOperator(1));
-               double spExact = OptimizerUtils.getSparsity(m, m,
+               double spExact1 = OptimizerUtils.getSparsity(n, n,
                        EstimationUtils.getSelfProductOutputNnz(m1));
+               double spExact2 = sp<0.4 ? OptimizerUtils.getSparsity(n, n,
+                       EstimationUtils.getSparseProductOutputNnz(m1, m1)) : 
spExact1;
                
                //compare estimated and real sparsity
                double est = estim.estim(m1, m1);
                TestUtils.compareScalars(est, m3.getSparsity(),
                        (estim instanceof EstimatorBitsetMM) ? eps3 : //exact
                        (estim instanceof EstimatorBasicWorst) ? eps1 : eps2);
-               TestUtils.compareScalars(m3.getSparsity(), spExact, eps3);
+               TestUtils.compareScalars(m3.getSparsity(), spExact1, eps3);
+               TestUtils.compareScalars(m3.getSparsity(), spExact2, eps3);
        }
 }
diff --git 
a/src/test/java/org/apache/sysds/test/component/estim/SquaredProductChainTest.java
 
b/src/test/java/org/apache/sysds/test/component/estim/SquaredProductChainTest.java
index 25cd99ecaf..3747ac55f1 100644
--- 
a/src/test/java/org/apache/sysds/test/component/estim/SquaredProductChainTest.java
+++ 
b/src/test/java/org/apache/sysds/test/component/estim/SquaredProductChainTest.java
@@ -24,6 +24,7 @@ import org.apache.sysds.hops.estim.EstimatorBasicAvg;
 import org.apache.sysds.hops.estim.EstimatorBasicWorst;
 import org.apache.sysds.hops.estim.EstimatorBitsetMM;
 import org.apache.sysds.hops.estim.EstimatorDensityMap;
+import org.apache.sysds.hops.estim.EstimatorLayeredGraph;
 import org.apache.sysds.hops.estim.EstimatorMatrixHistogram;
 import org.apache.sysds.hops.estim.MMNode;
 import org.apache.sysds.hops.estim.SparsityEstimator;
@@ -126,6 +127,16 @@ public class SquaredProductChainTest extends 
AutomatedTestBase
                runSparsityEstimateTest(new EstimatorMatrixHistogram(true), m, 
k, n, n2, case2);
        }
        
+       @Test
+       public void testLayeredGraphCase1() {
+               runSparsityEstimateTest(new EstimatorLayeredGraph(32), m, k, n, 
n2, case1);
+       }
+       
+       @Test
+       public void testLayeredGraphCase2() {
+               runSparsityEstimateTest(new EstimatorLayeredGraph(32), m, k, n, 
n2, case2);
+       }
+       
        private static void runSparsityEstimateTest(SparsityEstimator estim, 
int m, int k, int n, int n2, double[] sp) {
                MatrixBlock m1 = MatrixBlock.randOperations(m, k, sp[0], 1, 1, 
"uniform", 1);
                MatrixBlock m2 = MatrixBlock.randOperations(k, n, sp[1], 1, 1, 
"uniform", 2);

Reply via email to