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

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

commit 5e1cbbf0bdbf001819253efab3e7234c8a46d7e8
Author: baunsgaard <[email protected]>
AuthorDate: Wed Jun 8 23:24:02 2022 +0200

    [MINOR] Dense&SparseBlock internal toString improvement
    
    This commit change the internal toString to make it more readable
    when we internally in systemds change a matrix block into a string.
    This makes it more easy for us to debug a given matrix when printing.
    
    This commit also contain a minor fix to "compact(int r)" for sparse
    blocks that did not handle the transition between SparseRowScalar to
    SparseRowVector well. There are more of these instances inside MCSR that
    are not addressed in this commit.
---
 .../org/apache/sysds/runtime/data/DenseBlock.java  |  6 +++-
 .../apache/sysds/runtime/data/SparseBlockCSR.java  | 17 +++++----
 .../apache/sysds/runtime/data/SparseBlockMCSR.java | 40 ++++++++++++++--------
 .../org/apache/sysds/runtime/data/SparseRow.java   | 27 ++++++++++++---
 .../apache/sysds/runtime/data/SparseRowScalar.java |  5 +++
 .../apache/sysds/runtime/data/SparseRowVector.java | 37 ++++++++++++++++++--
 6 files changed, 100 insertions(+), 32 deletions(-)

diff --git a/src/main/java/org/apache/sysds/runtime/data/DenseBlock.java 
b/src/main/java/org/apache/sysds/runtime/data/DenseBlock.java
index 49d135087c..a0e4f0842e 100644
--- a/src/main/java/org/apache/sysds/runtime/data/DenseBlock.java
+++ b/src/main/java/org/apache/sysds/runtime/data/DenseBlock.java
@@ -650,7 +650,11 @@ public abstract class DenseBlock implements Serializable
                        double[] data = values(i);
                        int ix = pos(i);
                        for(int j=0; j<_odims[0]; j++) {
-                               sb.append(data[ix+j]);
+                               double v = data[ix+j];
+                               if(v == (long) v)
+                                       sb.append((long)v);
+                               else
+                                       sb.append(data[ix+j]);
                                sb.append("\t");
                        }
                        sb.append("\n");
diff --git a/src/main/java/org/apache/sysds/runtime/data/SparseBlockCSR.java 
b/src/main/java/org/apache/sysds/runtime/data/SparseBlockCSR.java
index 4093ed94c4..474c43694b 100644
--- a/src/main/java/org/apache/sysds/runtime/data/SparseBlockCSR.java
+++ b/src/main/java/org/apache/sysds/runtime/data/SparseBlockCSR.java
@@ -882,21 +882,20 @@ public class SparseBlockCSR extends SparseBlock
                sb.append(", nnz=");
                sb.append(size());
                sb.append("\n");
+               final int rowDigits = 
(int)Math.max(Math.ceil(Math.log10(numRows())),1) ;
                for(int i = 0; i < numRows(); i++) {
                        // append row
                        final int pos = pos(i);
                        final int len = size(i);
                        if(pos < pos + len) {
-
-                               sb.append("row +");
-                               sb.append(i);
-                               sb.append(": ");
-
+                               sb.append(String.format("row %0"+rowDigits+"d 
-- ", i));
                                for(int j = pos; j < pos + len; j++) {
-                                       sb.append(_indexes[j]);
-                                       sb.append(": ");
-                                       sb.append(_values[j]);
-                                       sb.append("\t");
+                                       if(_values[j] == (long) _values[j])
+                                               
sb.append(String.format("%"+rowDigits+"d:%d", _indexes[j], (long)_values[j]));
+                                       else
+                                               
sb.append(String.format("%"+rowDigits+"d:%s", _indexes[j], 
Double.toString(_values[j])));
+                                       if(j + 1 < pos + len)
+                                               sb.append(", ");
                                }
                                sb.append("\n");
                        }
diff --git a/src/main/java/org/apache/sysds/runtime/data/SparseBlockMCSR.java 
b/src/main/java/org/apache/sysds/runtime/data/SparseBlockMCSR.java
index 9687dea49d..8774d3f763 100644
--- a/src/main/java/org/apache/sysds/runtime/data/SparseBlockMCSR.java
+++ b/src/main/java/org/apache/sysds/runtime/data/SparseBlockMCSR.java
@@ -148,11 +148,18 @@ public class SparseBlockMCSR extends SparseBlock
        
        @Override
        public void compact(int r) {
-               if( isAllocated(r) && _rows[r] instanceof SparseRowVector
-                       && _rows[r].size() > SparseBlock.INIT_CAPACITY
-                       && _rows[r].size() * SparseBlock.RESIZE_FACTOR1 
-                               < ((SparseRowVector)_rows[r]).capacity() ) {
-                       ((SparseRowVector)_rows[r]).compact();
+               if( isAllocated(r) ){
+                       if(_rows[r] instanceof SparseRowVector
+                         && _rows[r].size() > SparseBlock.INIT_CAPACITY
+                         && _rows[r].size() * SparseBlock.RESIZE_FACTOR1 
+                                 < ((SparseRowVector)_rows[r]).capacity() ) {
+                         ((SparseRowVector)_rows[r]).compact();
+                 }
+                 else if(_rows[r] instanceof SparseRowScalar) {
+                               SparseRowScalar s = (SparseRowScalar) _rows[r];
+                               if(s.getValue() == 0)
+                                       _rows[r] = null;
+                       }
                }
        }
        
@@ -173,7 +180,7 @@ public class SparseBlockMCSR extends SparseBlock
        
        @Override
        public boolean isAllocated(int r) {
-               return (_rows[r] != null);
+               return _rows[r] != null;
        }
 
        @Override
@@ -319,8 +326,13 @@ public class SparseBlockMCSR extends SparseBlock
        public boolean add(int r, int c, double v) {
                if( !isAllocated(r) )
                        _rows[r] = new SparseRowScalar();
-               else if( _rows[r] instanceof SparseRowScalar && 
!_rows[r].isEmpty())
-                       _rows[r] = new SparseRowVector(_rows[r]);
+               else if( _rows[r] instanceof SparseRowScalar && 
!_rows[r].isEmpty()){
+                       SparseRowScalar s = (SparseRowScalar) _rows[r];
+                       if(s.getIndex() == c)
+                               return s.set(s.getIndex(), v + s.getValue());
+                       else
+                         _rows[r] = new SparseRowVector(_rows[r]);
+               }
                return _rows[r].add(c, v);
        }
        
@@ -414,19 +426,17 @@ public class SparseBlockMCSR extends SparseBlock
        @Override
        public String toString() {
                StringBuilder sb = new StringBuilder();
+               final int nRow = numRows();
                sb.append("SparseBlockMCSR: rlen=");
-               sb.append(numRows());
+               sb.append(nRow);
                sb.append(", nnz=");
                sb.append(size());
                sb.append("\n");
-               for( int i=0; i<numRows(); i++ ) {
+               final int rowDigits = 
(int)Math.max(Math.ceil(Math.log10(nRow)),1) ;
+               for( int i=0; i<nRow; i++ ) {
                        if(isEmpty(i))
                                continue;
-                       sb.append("row +");
-                       sb.append(i);
-                       sb.append(": ");
-                       sb.append(_rows[i]);
-                       sb.append("\n");
+                       sb.append(String.format("row %0"+rowDigits+"d -- %s\n", 
i, _rows[i].toString()));
                }
                
                return sb.toString();
diff --git a/src/main/java/org/apache/sysds/runtime/data/SparseRow.java 
b/src/main/java/org/apache/sysds/runtime/data/SparseRow.java
index 8184c035c9..07b8c0903d 100644
--- a/src/main/java/org/apache/sysds/runtime/data/SparseRow.java
+++ b/src/main/java/org/apache/sysds/runtime/data/SparseRow.java
@@ -124,16 +124,33 @@ public abstract class SparseRow implements Serializable
         * and shifts non-zero entries to the left if necessary.
         */
        public abstract void compact();
+
+       /**
+        * In-place compaction of values over eps away from zero;
+        * and shifts non-zero entries to the left if necessary.
+        * @param eps epsilon value
+        */
+       public abstract void compact(double eps);
        
        @Override
        public String toString() {
                StringBuilder sb = new StringBuilder();
-               for(int i=0; i<size(); i++) {
-                       sb.append(indexes()[i]);
-                       sb.append(": ");
-                       sb.append(values()[i]);
-                       sb.append("\t");
+               final int s = size();
+               if(s == 0)
+                       return "";
+               final int[] indexes = indexes();
+               final double[] values = values();
+
+               final int rowDigits = (int) 
Math.max(Math.ceil(Math.log10(indexes[s-1])),1);
+               for(int i=0; i<s; i++){
+                       if(values[i] == (long) values[i])
+                               sb.append(String.format("%"+rowDigits+"d:%d", 
indexes[i], (long)values[i]));
+                       else
+                               sb.append(String.format("%"+rowDigits+"d:%s", 
indexes[i], Double.toString(values[i])));
+                       if(i + 1 < s)
+                               sb.append(", ");
                }
+               
                return sb.toString();
        }
 }
diff --git a/src/main/java/org/apache/sysds/runtime/data/SparseRowScalar.java 
b/src/main/java/org/apache/sysds/runtime/data/SparseRowScalar.java
index 5fe0889070..0b1ca982cd 100644
--- a/src/main/java/org/apache/sysds/runtime/data/SparseRowScalar.java
+++ b/src/main/java/org/apache/sysds/runtime/data/SparseRowScalar.java
@@ -103,6 +103,11 @@ public final class SparseRowScalar extends SparseRow{
                index = (value!=0) ? index : -1;
        }
 
+       @Override
+       public void compact(double eps) {
+               index = (Math.abs(value) < eps) ? -1: index;
+       }
+
        public int getIndex(){
                return index;
        }
diff --git a/src/main/java/org/apache/sysds/runtime/data/SparseRowVector.java 
b/src/main/java/org/apache/sysds/runtime/data/SparseRowVector.java
index 6d67707896..7419f126d1 100644
--- a/src/main/java/org/apache/sysds/runtime/data/SparseRowVector.java
+++ b/src/main/java/org/apache/sysds/runtime/data/SparseRowVector.java
@@ -58,6 +58,27 @@ public final class SparseRowVector extends SparseRow{
                        }
                size = nnz;
        }
+
+       /**
+        * Sparse row vector constructor that take a dense array, and allocate 
sparsely by ignoring zero values
+        * @param v The dense row
+        */
+       public SparseRowVector(double[] v){
+               int nnz = 0;
+               for(double vv: v)
+                       if(vv != 0)
+                               nnz++;
+
+               values = new double[nnz];
+               indexes = new int[nnz];
+               for(int i=0, pos=0; i<v.length; i++)
+                       if( v[i] != 0 ) {
+                               values[pos] = v[i];
+                               indexes[pos] = i;
+                               pos++;
+                       }
+               size = nnz;
+       }
        
        public SparseRowVector(int estnnz, int maxnnz) {
                if( estnnz > initialCapacity )
@@ -71,7 +92,7 @@ public final class SparseRowVector extends SparseRow{
        
        public SparseRowVector(SparseRow that) {
                size = that.size();
-               int cap = Math.max(initialCapacity, that.size());
+               int cap = Math.max(initialCapacity, size);
                
                //allocate arrays and copy new values
                values = Arrays.copyOf(that.values(), cap);
@@ -427,7 +448,19 @@ public final class SparseRowVector extends SparseRow{
        public void compact() {
                int nnz = 0;
                for( int i=0; i<size; i++ ) 
-                       if( values[i] != 0 ){
+                       if( values[i] != 0.0 ){
+                               values[nnz] = values[i];
+                               indexes[nnz] = indexes[i];
+                               nnz++;
+                       }
+               size = nnz; //adjust row size
+       }
+
+       @Override
+       public void compact(double eps) {
+               int nnz = 0;
+               for( int i=0; i<size; i++ ) 
+                       if( Math.abs(values[i]) > eps ){
                                values[nnz] = values[i];
                                indexes[nnz] = indexes[i];
                                nnz++;

Reply via email to