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) {
