Repository: incubator-systemml
Updated Branches:
  refs/heads/master e7905fee2 -> 8ba0fdcca


[SYSTEMML-381] New data converters sparse block implementations

For all the sparse block implementations, we now provide an additional
generic copy constructor from SparseBlock. All of them have two special
cases: one for the same format, and one for generic SparseBlock; the
number of combinations is still linear in the number of formats.

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

Branch: refs/heads/master
Commit: 47742f2ee0b8b7284921bd9a0604dc1c574349b6
Parents: e7905fe
Author: Matthias Boehm <[email protected]>
Authored: Mon Jan 18 15:16:39 2016 -0800
Committer: Matthias Boehm <[email protected]>
Committed: Wed Jan 20 14:58:18 2016 -0800

----------------------------------------------------------------------
 .../runtime/matrix/data/SparseBlockCOO.java     | 41 ++++++++++++++++++++
 .../runtime/matrix/data/SparseBlockCSR.java     | 41 ++++++++++++++++++++
 .../runtime/matrix/data/SparseBlockMCSR.java    | 26 +++++++++++++
 3 files changed, 108 insertions(+)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-systemml/blob/47742f2e/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 0408dae..dae25a4 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
@@ -59,6 +59,47 @@ public class SparseBlockCOO extends SparseBlock
        }
        
        /**
+        * Copy constructor sparse block abstraction. 
+        */
+       public SparseBlockCOO(SparseBlock sblock)
+       {
+               long size = sblock.size();
+               if( size > Integer.MAX_VALUE )
+                       throw new RuntimeException("SparseBlockCOO supports 
nnz<=Integer.MAX_VALUE but got "+size);
+               
+               //special case SparseBlockCSR
+               if( sblock instanceof SparseBlockCOO ) { 
+                       SparseBlockCOO ocoo = (SparseBlockCOO)sblock;
+                       _rlen = ocoo._rlen;
+                       _rindexes = Arrays.copyOf(ocoo._rindexes, ocoo._size);
+                       _cindexes = Arrays.copyOf(ocoo._cindexes, ocoo._size);
+                       _values = Arrays.copyOf(ocoo._values, ocoo._size);
+                       _size = ocoo._size;
+               }
+               //general case SparseBlock
+               else {
+                       _rlen = sblock.numRows();  
+                       _rindexes = new int[(int)size];
+                       _cindexes = new int[(int)size];
+                       _values = new double[(int)size];
+                       _size = (int)size;
+                       
+                       for( int i=0, pos=0; i<_rlen; i++ ) {
+                               int apos = sblock.pos(i);
+                               int alen = sblock.size(i);
+                               int[] aix = sblock.indexes(i);
+                               double[] avals = sblock.values(i);
+                               for( int j=apos; j<apos+alen; j++ ) {
+                                       _rindexes[pos] = i;
+                                       _cindexes[pos] = aix[j];
+                                       _values[pos] = avals[j];
+                                       pos++;
+                               }
+                       }       
+               }
+       }
+       
+       /**
         * Copy constructor old sparse row representation. 
         */
        public SparseBlockCOO(SparseRow[] rows, int nnz)

http://git-wip-us.apache.org/repos/asf/incubator-systemml/blob/47742f2e/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 d4acc01..e0e1a23 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
@@ -61,6 +61,47 @@ public class SparseBlockCSR extends SparseBlock
        }
        
        /**
+        * Copy constructor sparse block abstraction. 
+        */
+       public SparseBlockCSR(SparseBlock sblock)
+       {
+               long size = sblock.size();
+               if( size > Integer.MAX_VALUE )
+                       throw new RuntimeException("SparseBlockCSR supports 
nnz<=Integer.MAX_VALUE but got "+size);
+               
+               //special case SparseBlockCSR
+               if( sblock instanceof SparseBlockCSR ) { 
+                       SparseBlockCSR ocsr = (SparseBlockCSR)sblock;
+                       _ptr = Arrays.copyOf(ocsr._ptr, ocsr.numRows());
+                       _indexes = Arrays.copyOf(ocsr._indexes, ocsr._size);
+                       _values = Arrays.copyOf(ocsr._values, ocsr._size);
+                       _size = ocsr._size;
+               }
+               //general case SparseBlock
+               else {
+                       int rlen = sblock.numRows();
+                       
+                       _ptr = new int[rlen+1];
+                       _indexes = new int[(int)size];
+                       _values = new double[(int)size];
+                       _size = (int)size;
+
+                       for( int i=0, pos=0; i<rlen; i++ ) {
+                               int apos = sblock.pos(i);
+                               int alen = sblock.size(i);
+                               int[] aix = sblock.indexes(i);
+                               double[] avals = sblock.values(i);
+                               for( int j=apos; j<apos+alen; j++ ) {
+                                       _indexes[pos] = aix[j];
+                                       _values[pos] = avals[j];
+                                       pos++;
+                               }
+                               _ptr[i+1]=pos;
+                       }                       
+               }
+       }
+       
+       /**
         * Copy constructor old sparse row representation. 
         */
        public SparseBlockCSR(SparseRow[] rows, int nnz)

http://git-wip-us.apache.org/repos/asf/incubator-systemml/blob/47742f2e/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 9fb007e..ce0b42c 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
@@ -36,6 +36,32 @@ public class SparseBlockMCSR extends SparseBlock
        private SparseRow[] _rows = null;
        
        /**
+        * Copy constructor sparse block abstraction. 
+        */
+       public SparseBlockMCSR(SparseBlock sblock)
+       {
+               //special case SparseBlockMCSR
+               if( sblock instanceof SparseBlockMCSR ) { 
+                       SparseRow[] orows = ((SparseBlockMCSR)sblock)._rows;
+                       _rows = new SparseRow[orows.length];
+                       for( int i=0; i<_rows.length; i++ )
+                               _rows[i] = new SparseRow(orows[i]);             
+               }
+               //general case SparseBlock
+               else { 
+                       _rows = new SparseRow[sblock.numRows()];
+                       for( int i=0; i<_rows.length; i++ ) {
+                               int apos = sblock.pos(i);
+                               int alen = sblock.size(i);
+                               _rows[i] = new SparseRow(alen);
+                               _rows[i].setSize(alen);
+                               System.arraycopy(sblock.indexes(i), apos, 
_rows[i].indexes(), 0, alen);
+                               System.arraycopy(sblock.values(i), apos, 
_rows[i].values(), 0, alen);
+                       }
+               }
+       }
+       
+       /**
         * Copy constructor old sparse row representation. 
         */
        public SparseBlockMCSR(SparseRow[] rows, boolean deep) {

Reply via email to