You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@systemml.apache.org by mb...@apache.org on 2016/01/20 23:59:18 UTC
[3/5] incubator-systemml git commit: [SYSTEMML-382] Initial runtime
integration sparse matrix blocks
http://git-wip-us.apache.org/repos/asf/incubator-systemml/blob/8ba0fdcc/src/main/java/org/apache/sysml/runtime/matrix/data/MatrixBlock.java
----------------------------------------------------------------------
diff --git a/src/main/java/org/apache/sysml/runtime/matrix/data/MatrixBlock.java b/src/main/java/org/apache/sysml/runtime/matrix/data/MatrixBlock.java
index fe691b7..4cd00ca 100644
--- a/src/main/java/org/apache/sysml/runtime/matrix/data/MatrixBlock.java
+++ b/src/main/java/org/apache/sysml/runtime/matrix/data/MatrixBlock.java
@@ -94,6 +94,8 @@ public class MatrixBlock extends MatrixValue implements Externalizable
public static final double SPARSITY_TURN_POINT = 0.4;
//sparsity threshold for ultra-sparse matrix operations (40nnz in a 1kx1k block)
public static final double ULTRA_SPARSITY_TURN_POINT = 0.00004;
+ //default sparse block type: modified compressed sparse rows
+ public static final SparseBlock.Type DEFAULT_SPARSEBLOCK = SparseBlock.Type.MCSR;
//basic header (int rlen, int clen, byte type)
public static final int HEADER_SIZE = 9;
@@ -112,7 +114,7 @@ public class MatrixBlock extends MatrixValue implements Externalizable
//matrix data (sparse or dense)
protected double[] denseBlock = null;
- protected SparseRow[] sparseBlock = null;
+ protected SparseBlock sparseBlock = null;
//sparse-block-specific attributes (allocation only)
protected int estimatedNNzsPerRow = -1;
@@ -221,25 +223,19 @@ public class MatrixBlock extends MatrixValue implements Externalizable
reset(estnnzs);
}
- public void reset(int rl, int cl, boolean sp)
- {
+ public void reset(int rl, int cl, boolean sp) {
sparse=sp;
reset(rl, cl);
}
- public void reset(int rl, int cl, boolean sp, long estnnzs)
- {
+ public void reset(int rl, int cl, boolean sp, long estnnzs) {
sparse=sp;
reset(rl, cl, estnnzs);
}
- public void resetSparse()
- {
- if(sparseBlock!=null)
- {
- for(int i=0; i<Math.min(rlen, sparseBlock.length); i++)
- if(sparseBlock[i]!=null)
- sparseBlock[i].reset(estimatedNNzsPerRow, clen);
+ public void resetSparse() {
+ if(sparseBlock != null) {
+ sparseBlock.reset(estimatedNNzsPerRow, clen);
}
}
@@ -386,8 +382,7 @@ public class MatrixBlock extends MatrixValue implements Externalizable
/**
*
*/
- public void allocateDenseOrSparseBlock()
- {
+ public void allocateDenseOrSparseBlock() {
if( sparse )
allocateSparseRowsBlock();
else
@@ -424,8 +419,7 @@ public class MatrixBlock extends MatrixValue implements Externalizable
/**
*
*/
- public void allocateSparseRowsBlock()
- {
+ public void allocateSparseRowsBlock() {
allocateSparseRowsBlock(true);
}
@@ -435,16 +429,9 @@ public class MatrixBlock extends MatrixValue implements Externalizable
*/
public void allocateSparseRowsBlock(boolean clearNNZ)
{
- //allocate block if non-existing or too small (guaranteed to be 0-initialized),
- if( sparseBlock == null ) {
- sparseBlock=new SparseRow[rlen];
- }
- else if( sparseBlock.length < rlen ) {
- SparseRow[] oldSparseRows=sparseBlock;
- sparseBlock = new SparseRow[rlen];
- for(int i=0; i<Math.min(oldSparseRows.length, rlen); i++) {
- sparseBlock[i]=oldSparseRows[i];
- }
+ //allocate block if non-existing or too small (guaranteed to be 0-initialized)
+ if( sparseBlock == null || sparseBlock.numRows()<rlen ) {
+ sparseBlock = SparseBlockFactory.createSparseBlock(DEFAULT_SPARSEBLOCK, rlen);
}
//clear nnz if necessary
@@ -481,8 +468,7 @@ public class MatrixBlock extends MatrixValue implements Externalizable
* from non-empty blocks would significantly increase the total memory consumption.
*
*/
- public void cleanupBlock( boolean dense, boolean sparse )
- {
+ public void cleanupBlock( boolean dense, boolean sparse ) {
if(dense)
denseBlock = null;
if(sparse)
@@ -492,8 +478,7 @@ public class MatrixBlock extends MatrixValue implements Externalizable
////////
// Metadata information
- public int getNumRows()
- {
+ public int getNumRows() {
return rlen;
}
@@ -503,23 +488,19 @@ public class MatrixBlock extends MatrixValue implements Externalizable
*
* @param _r
*/
- public void setNumRows(int r)
- {
+ public void setNumRows(int r) {
rlen = r;
}
- public int getNumColumns()
- {
+ public int getNumColumns() {
return clen;
}
- public void setNumColumns(int c)
- {
+ public void setNumColumns(int c) {
clen = c;
}
- public long getNonZeros()
- {
+ public long getNonZeros() {
return nonZeros;
}
@@ -527,8 +508,7 @@ public class MatrixBlock extends MatrixValue implements Externalizable
nonZeros = nnz;
}
- public boolean isVector()
- {
+ public boolean isVector() {
return (rlen == 1 || clen == 1);
}
@@ -537,16 +517,14 @@ public class MatrixBlock extends MatrixValue implements Externalizable
* Return the maximum row encountered WITHIN the current block
*
*/
- public int getMaxRow()
- {
+ public int getMaxRow() {
if (!sparse)
return getNumRows();
else
return maxrow;
}
- public void setMaxRow(int r)
- {
+ public void setMaxRow(int r) {
maxrow = r;
}
@@ -555,27 +533,23 @@ public class MatrixBlock extends MatrixValue implements Externalizable
* Return the maximum column encountered WITHIN the current block
*
*/
- public int getMaxColumn()
- {
+ public int getMaxColumn() {
if (!sparse)
return getNumColumns();
else
return maxcolumn;
}
- public void setMaxColumn(int c)
- {
+ public void setMaxColumn(int c) {
maxcolumn = c;
}
@Override
- public boolean isEmpty()
- {
+ public boolean isEmpty() {
return isEmptyBlock(false);
}
- public boolean isEmptyBlock()
- {
+ public boolean isEmptyBlock() {
return isEmptyBlock(true);
}
@@ -597,49 +571,66 @@ public class MatrixBlock extends MatrixValue implements Externalizable
return ret;
}
- public void setDiag()
- {
+ public void setDiag() {
diag = true;
}
- public boolean isDiag()
- {
+ public boolean isDiag() {
return diag;
}
////////
// Data handling
- public double[] getDenseBlock()
- {
- if(sparse)
+ public double[] getDenseBlock() {
+ if( sparse )
return null;
return denseBlock;
}
- public SparseRow[] getSparseBlock()
- {
- if(!sparse)
+ public SparseBlock getSparseBlock() {
+ if( !sparse )
return null;
return sparseBlock;
}
- public Iterator<IJV> getSparseBlockIterator()
- {
+ /**
+ *
+ * @return
+ */
+ public Iterator<IJV> getSparseBlockIterator() {
//check for valid format, should have been checked from outside
if( !sparse )
- throw new RuntimeException("getSparseCellInterator should not be called for dense format");
+ throw new RuntimeException("getSparseBlockInterator should not be called for dense format");
- return new SparseRowsIterator(rlen, sparseBlock);
+ //check for existing sparse block: return empty list
+ if( sparseBlock==null )
+ return new ArrayList<IJV>().iterator();
+
+ //get iterator over sparse block
+ if( rlen == sparseBlock.numRows() )
+ return sparseBlock.getIterator();
+ else
+ return sparseBlock.getIterator(rlen);
}
- public SparseRowsIterator getSparseBlockIterator(int rl, int ru)
- {
+ /**
+ *
+ * @param rl
+ * @param ru
+ * @return
+ */
+ public Iterator<IJV> getSparseBlockIterator(int rl, int ru) {
//check for valid format, should have been checked from outside
if( !sparse )
- throw new RuntimeException("getSparseCellInterator should not be called for dense format");
+ throw new RuntimeException("getSparseBlockInterator should not be called for dense format");
- return new SparseRowsIterator(rl, ru, sparseBlock);
+ //check for existing sparse block: return empty list
+ if( sparseBlock==null )
+ return new ArrayList<IJV>().iterator();
+
+ //get iterator over sparse block
+ return sparseBlock.getIterator(rl, ru);
}
@Override
@@ -672,9 +663,9 @@ public class MatrixBlock extends MatrixValue implements Externalizable
{
if(sparse)
{
- if( sparseBlock==null || sparseBlock.length<=r || sparseBlock[r]==null )
+ if( sparseBlock==null )
return 0;
- return sparseBlock[r].get(c);
+ return sparseBlock.get(r, c);
}
else
{
@@ -695,16 +686,15 @@ public class MatrixBlock extends MatrixValue implements Externalizable
if(sparse)
{
//early abort
- if( (sparseBlock==null || sparseBlock.length<=r || sparseBlock[r]==null) && v==0 )
+ if( (sparseBlock==null || sparseBlock.isEmpty(r)) && v==0 )
return;
//allocation on demand
allocateSparseRowsBlock(false);
- if( sparseBlock[r]==null )
- sparseBlock[r] = new SparseRow(estimatedNNzsPerRow, clen);
+ sparseBlock.allocate(r, estimatedNNzsPerRow, clen);
//set value and maintain nnz
- if( sparseBlock[r].set(c, v) )
+ if( sparseBlock.set(r, c, v) )
nonZeros += (v!=0) ? 1 : -1;
}
else
@@ -746,9 +736,9 @@ public class MatrixBlock extends MatrixValue implements Externalizable
public double getValueSparseUnsafe(int r, int c)
{
- if(sparseBlock==null || sparseBlock.length<=r || sparseBlock[r]==null)
+ if(sparseBlock==null || sparseBlock.isEmpty(r))
return 0;
- return sparseBlock[r].get(c);
+ return sparseBlock.get(r, c);
}
/**
@@ -778,11 +768,10 @@ public class MatrixBlock extends MatrixValue implements Externalizable
{
//allocation on demand (w/o overwriting nnz)
allocateSparseRowsBlock(false);
- if(sparseBlock[r]==null)
- sparseBlock[r]=new SparseRow(estimatedNNzsPerRow, clen);
+ sparseBlock.allocate(r, estimatedNNzsPerRow, clen);
//set value and maintain nnz
- sparseBlock[r].append(c, v);
+ sparseBlock.append(r, c, v);
nonZeros++;
}
}
@@ -795,17 +784,21 @@ public class MatrixBlock extends MatrixValue implements Externalizable
{
//allocation on demand
allocateSparseRowsBlock(false);
- if(sparseBlock[r]==null)
- sparseBlock[r]=new SparseRow(values);
- else
- sparseBlock[r].copy(values);
+ sparseBlock.allocate(r, values.size(), -1);
+
+ //TODO perf sparse block
+ int[] cols=values.indexes();
+ double[] vals=values.values();
+ for(int i=0; i<values.size(); i++)
+ sparseBlock.append(r, cols[i], vals[i]);
+
nonZeros+=values.size();
}
else
{
- int[] cols=values.getIndexContainer();
- double[] vals=values.getValueContainer();
+ int[] cols=values.indexes();
+ double[] vals=values.values();
for(int i=0; i<values.size(); i++)
quickSetValue(r, cols[i], vals[i]);
}
@@ -829,19 +822,17 @@ public class MatrixBlock extends MatrixValue implements Externalizable
{
for( int i=0; i<that.rlen; i++ )
{
- SparseRow brow = that.sparseBlock[i];
- if( brow!=null && !brow.isEmpty() )
- {
+ SparseBlock b = that.sparseBlock;
+ if( !b.isEmpty(i) ) {
int aix = rowoffset+i;
- int len = brow.size();
- int[] ix = brow.getIndexContainer();
- double[] val = brow.getValueContainer();
-
- if( sparseBlock[aix]==null )
- sparseBlock[aix] = new SparseRow(estimatedNNzsPerRow,clen);
+ int pos = b.pos(i);
+ int len = b.size(i);
+ int[] ix = b.indexes(i);
+ double[] val = b.values(i);
- for( int j=0; j<len; j++ )
- sparseBlock[aix].append(coloffset+ix[j], val[j]);
+ sparseBlock.allocate(aix, estimatedNNzsPerRow,clen);
+ for( int j=pos; j<pos+len; j++ )
+ sparseBlock.append(aix, coloffset+ix[j], val[j]);
}
}
}
@@ -853,11 +844,10 @@ public class MatrixBlock extends MatrixValue implements Externalizable
for( int j=0, bix=i*that.clen; j<that.clen; j++ )
{
double val = that.denseBlock[bix+j];
- if( val != 0 )
- {
- if( sparseBlock[aix]==null )//create sparserow only if required
- sparseBlock[aix] = new SparseRow(estimatedNNzsPerRow,clen);
- sparseBlock[aix].append(coloffset+j, val);
+ if( val != 0 ) {
+ //create sparserow only if required
+ sparseBlock.allocate(aix, estimatedNNzsPerRow,clen);
+ sparseBlock.append(aix, coloffset+j, val);
}
}
}
@@ -867,14 +857,10 @@ public class MatrixBlock extends MatrixValue implements Externalizable
/**
*
*/
- public void sortSparseRows()
- {
+ public void sortSparseRows() {
if( !sparse || sparseBlock==null )
- return;
-
- for( SparseRow arow : sparseBlock )
- if( arow!=null && arow.size()>1 )
- arow.sort();
+ return;
+ sparseBlock.sort();
}
/**
@@ -1174,14 +1160,14 @@ public class MatrixBlock extends MatrixValue implements Externalizable
//copy dense to sparse
double[] a = denseBlock;
- SparseRow[] c = sparseBlock;
+ SparseBlock c = sparseBlock;
for( int i=0, aix=0; i<rlen; i++ )
for(int j=0; j<clen; j++, aix++)
if( a[aix] != 0 ) {
- if( c[i]==null ) //create sparse row only if required
- c[i]=new SparseRow(estimatedNNzsPerRow, clen);
- c[i].append(j, a[aix]);
+ //create sparse row only if required
+ c.allocate(i, estimatedNNzsPerRow, clen);
+ c.append(i, j, a[aix]);
nonZeros++;
}
@@ -1213,15 +1199,16 @@ public class MatrixBlock extends MatrixValue implements Externalizable
Arrays.fill(denseBlock, 0, limit, 0);
//copy sparse to dense
- SparseRow[] a = sparseBlock;
+ SparseBlock a = sparseBlock;
double[] c = denseBlock;
for( int i=0, cix=0; i<rlen; i++, cix+=clen)
- if( a[i] != null && !a[i].isEmpty() ) {
- int alen = a[i].size();
- int[] aix = a[i].getIndexContainer();
- double[] avals = a[i].getValueContainer();
- for(int j=0; j<alen; j++)
+ if( !a.isEmpty(i) ) {
+ int apos = a.pos(i);
+ int alen = a.size(i);
+ int[] aix = a.indexes(i);
+ double[] avals = a.values(i);
+ for(int j=apos; j<apos+alen; j++)
if( avals[j] != 0 )
c[ cix+aix[j] ] = avals[j];
}
@@ -1235,16 +1222,13 @@ public class MatrixBlock extends MatrixValue implements Externalizable
nonZeros=0;
if( sparse && sparseBlock!=null )
{
- int limit = Math.min(rlen, sparseBlock.length);
- for(int i=0; i<limit; i++)
- if(sparseBlock[i]!=null)
- nonZeros += sparseBlock[i].size();
+ //note: rlen might be <= sparseBlock.numRows()
+ nonZeros = sparseBlock.size(0, rlen);
}
else if( !sparse && denseBlock!=null )
{
int limit=rlen*clen;
- for(int i=0; i<limit; i++)
- {
+ for(int i=0; i<limit; i++) {
//HotSpot JVM bug causes crash in presence of NaNs
//nonZeros += (denseBlock[i]!=0) ? 1 : 0;
if( denseBlock[i]!=0 )
@@ -1260,30 +1244,20 @@ public class MatrixBlock extends MatrixValue implements Externalizable
{
if(sparseBlock!=null)
{
- int rlimit = Math.min( ru+1, Math.min(rlen, sparseBlock.length) );
+ int rlimit = Math.min( ru+1, rlen);
if( cl==0 && cu==clen-1 ) //specific case: all cols
{
- for(int i=rl; i<rlimit; i++)
- if(sparseBlock[i]!=null && !sparseBlock[i].isEmpty())
- nnz+=sparseBlock[i].size();
+ nnz = sparseBlock.size(rl, ru+1);
}
else if( cl==cu ) //specific case: one column
{
for(int i=rl; i<rlimit; i++)
- if(sparseBlock[i]!=null && !sparseBlock[i].isEmpty())
- nnz += (sparseBlock[i].get(cl)!=0) ? 1 : 0;
+ if(!sparseBlock.isEmpty(i))
+ nnz += (sparseBlock.get(i, cl)!=0) ? 1 : 0;
}
else //general case
{
- int astart,aend;
- for(int i=rl; i<rlimit; i++)
- if(sparseBlock[i]!=null && !sparseBlock[i].isEmpty())
- {
- SparseRow arow = sparseBlock[i];
- astart = arow.searchIndexesFirstGTE(cl);
- aend = arow.searchIndexesFirstGTE(cu);
- nnz += (astart!=-1) ? (aend-astart+1) : 0;
- }
+ nnz = sparseBlock.size(rl, ru+1, cl, cu+1);
}
}
}
@@ -1365,16 +1339,14 @@ public class MatrixBlock extends MatrixValue implements Externalizable
}
allocateSparseRowsBlock(false);
- for(int i=0; i<Math.min(that.sparseBlock.length, rlen); i++)
+ for(int i=0; i<Math.min(that.sparseBlock.numRows(), rlen); i++)
{
- if(that.sparseBlock[i]!=null)
- {
- if(sparseBlock[i]==null)
- sparseBlock[i]=new SparseRow(that.sparseBlock[i]);
- else
- sparseBlock[i].copy(that.sparseBlock[i]);
- }else if(this.sparseBlock[i]!=null)
- this.sparseBlock[i].reset(estimatedNNzsPerRow, clen);
+ if(!that.sparseBlock.isEmpty(i)) {
+ sparseBlock.set(i, new SparseRow(that.sparseBlock.get(i)));
+ }
+ else if(!this.sparseBlock.isEmpty(i)) {
+ this.sparseBlock.reset(i,estimatedNNzsPerRow, clen);
+ }
}
}
@@ -1412,15 +1384,17 @@ public class MatrixBlock extends MatrixValue implements Externalizable
allocateDenseBlock(false);
int start=0;
- for(int r=0; r<Math.min(that.sparseBlock.length, rlen); r++, start+=clen)
+ for(int r=0; r<Math.min(that.sparseBlock.numRows(), rlen); r++, start+=clen)
{
- if(that.sparseBlock[r]==null)
+ if(that.sparseBlock.isEmpty(r))
continue;
- double[] values=that.sparseBlock[r].getValueContainer();
- int[] cols=that.sparseBlock[r].getIndexContainer();
- for(int i=0; i<that.sparseBlock[r].size(); i++)
- {
- denseBlock[start+cols[i]]=values[i];
+ int pos = that.sparseBlock.pos(r);
+ int len = that.sparseBlock.size(r);
+ int[] aix = that.sparseBlock.indexes(r);
+ double[] avals = that.sparseBlock.values(r);
+
+ for(int i=pos; i<pos+len; i++) {
+ denseBlock[start+aix[i]]=avals[i];
}
}
}
@@ -1437,18 +1411,16 @@ public class MatrixBlock extends MatrixValue implements Externalizable
allocateSparseRowsBlock(false);
for(int i=0, ix=0; i<rlen; i++)
- {
- if( sparseBlock[i]!=null )
- sparseBlock[i].reset(estimatedNNzsPerRow, clen);
+ {
+ sparseBlock.reset(i, estimatedNNzsPerRow, clen);
for(int j=0; j<clen; j++)
{
double val = that.denseBlock[ix++];
- if( val != 0 )
- {
- if(sparseBlock[i]==null) //create sparse row only if required
- sparseBlock[i]=new SparseRow(estimatedNNzsPerRow, clen);
- sparseBlock[i].append(j, val);
+ if( val != 0 ) {
+ //create sparse row only if required
+ sparseBlock.allocate(1, estimatedNNzsPerRow, clen);
+ sparseBlock.append(i, j, val);
}
}
}
@@ -1494,65 +1466,56 @@ public class MatrixBlock extends MatrixValue implements Externalizable
copyEmptyToSparse(rl, ru, cl, cu, true);
return;
}
+
if(sparseBlock==null)
- sparseBlock=new SparseRow[rlen];
- else if( awareDestNZ )
- {
+ allocateSparseRowsBlock(false);
+ else if( awareDestNZ ) {
copyEmptyToSparse(rl, ru, cl, cu, true);
//explicit clear if awareDestNZ because more efficient since
//src will have multiple columns and only few overwriting values
}
- //copy values
- int alen;
- int[] aix;
- double[] avals;
+ SparseBlock a = src.sparseBlock;
+ SparseBlock b = sparseBlock;
+ //copy values
for( int i=0; i<src.rlen; i++ )
{
- SparseRow arow = src.sparseBlock[i];
- if( arow != null && !arow.isEmpty() )
+ if( !a.isEmpty(i) )
{
- alen = arow.size();
- aix = arow.getIndexContainer();
- avals = arow.getValueContainer();
+ int apos = a.pos(i);
+ int alen = a.size(i);
+ int[] aix = a.indexes(i);
+ double[] avals = a.values(i);
- if( sparseBlock[rl+i] == null || sparseBlock[rl+i].isEmpty() )
+ if( b.isEmpty(rl+i) )
{
- sparseBlock[rl+i] = new SparseRow(estimatedNNzsPerRow, clen);
- SparseRow brow = sparseBlock[rl+i];
- for( int j=0; j<alen; j++ )
- brow.append(cl+aix[j], avals[j]);
+ b.allocate(rl+i, estimatedNNzsPerRow, clen);
+ for( int j=apos; j<apos+alen; j++ )
+ b.append(rl+i, cl+aix[j], avals[j]);
if( awareDestNZ )
- nonZeros += brow.size();
+ nonZeros += b.size(rl+i);
}
else if( awareDestNZ ) //general case (w/ awareness NNZ)
{
- SparseRow brow = sparseBlock[rl+i];
- int lnnz = brow.size();
- if( cl==cu && cl==aix[0] )
- {
- if (avals[0]==0)
- brow.delete(cl);
- else
- brow.set(cl, avals[0] );
+ int lnnz = b.size(rl+i);
+ if( cl==cu && cl==aix[apos] ) {
+ b.set(rl+i, cl, avals[apos] );
}
- else
- {
- brow.deleteIndexRange(cl, cu);
- for( int j=0; j<alen; j++ )
- brow.set(cl+aix[j], avals[j]);
+ else {
+ //TODO perf sparse row
+ b.deleteIndexRange(rl+i, cl, cu+1);
+ for( int j=apos; j<apos+alen; j++ )
+ b.set(rl+i, cl+aix[j], avals[j]);
}
- nonZeros += (brow.size() - lnnz);
+ nonZeros += (b.size(rl+i) - lnnz);
}
else //general case (w/o awareness NNZ)
{
- SparseRow brow = sparseBlock[rl+i];
-
- //brow.set(cl, arow);
- for( int j=0; j<alen; j++ )
- brow.set(cl+aix[j], avals[j]);
+ //TODO perf sparse row
+ for( int j=apos; j<apos+alen; j++ )
+ b.set(rl+i, cl+aix[j], avals[j]);
}
}
}
@@ -1579,20 +1542,17 @@ public class MatrixBlock extends MatrixValue implements Externalizable
}
//copy values
- int alen;
- int[] aix;
- double[] avals;
-
+ SparseBlock a = src.sparseBlock;
for( int i=0, ix=rl*clen; i<src.rlen; i++, ix+=clen )
{
- SparseRow arow = src.sparseBlock[i];
- if( arow != null && !arow.isEmpty() )
+ if( !a.isEmpty(i) )
{
- alen = arow.size();
- aix = arow.getIndexContainer();
- avals = arow.getValueContainer();
+ int apos = a.pos(i);
+ int alen = a.size(i);
+ int[] aix = a.indexes(i);
+ double[] avals = a.values(i);
- for( int j=0; j<alen; j++ )
+ for( int j=apos; j<apos+alen; j++ )
denseBlock[ix+cl+aix[j]] = avals[j];
if(awareDestNZ)
@@ -1610,51 +1570,49 @@ public class MatrixBlock extends MatrixValue implements Externalizable
copyEmptyToSparse(rl, ru, cl, cu, true);
return;
}
- if(sparseBlock==null)
- sparseBlock=new SparseRow[rlen];
+ if(sparseBlock==null) {
+ sparseBlock=SparseBlockFactory
+ .createSparseBlock(DEFAULT_SPARSEBLOCK, rlen);
+ }
//no need to clear for awareDestNZ since overwritten
//copy values
- double val;
+ SparseBlock a = sparseBlock;
for( int i=0, ix=0; i<src.rlen; i++, ix+=src.clen )
{
int rix = rl + i;
- if( sparseBlock[rix]==null || sparseBlock[rix].isEmpty() )
+ if( a.isEmpty(rix) )
{
- for( int j=0; j<src.clen; j++ )
- if( (val = src.denseBlock[ix+j]) != 0 )
- {
- if( sparseBlock[rix]==null )
- sparseBlock[rix] = new SparseRow(estimatedNNzsPerRow, clen);
- sparseBlock[rix].append(cl+j, val);
+ for( int j=0; j<src.clen; j++ ) {
+ double val = src.denseBlock[ix+j];
+ if( val != 0 ) {
+ a.allocate(rix, estimatedNNzsPerRow, clen);
+ sparseBlock.append(rix, cl+j, val);
}
-
- if( awareDestNZ && sparseBlock[rix]!=null )
- nonZeros += sparseBlock[rix].size();
+ }
+
+ if( awareDestNZ && !a.isEmpty(rix) )
+ nonZeros += a.size(rix);
}
else if( awareDestNZ ) //general case (w/ awareness NNZ)
{
- SparseRow brow = sparseBlock[rix];
- int lnnz = brow.size();
- if( cl==cu )
- {
- if ((val = src.denseBlock[ix])==0)
- brow.delete(cl);
- else
- brow.set(cl, val);
+ int lnnz = a.size(rix);
+ if( cl==cu ) {
+ double val = src.denseBlock[ix];
+ a.set(rix, cl, val);
}
- else
- {
- brow.setIndexRange(cl, cu, src.denseBlock, ix, src.clen);
+ else {
+ a.setIndexRange(rix, cl, cu+1, src.denseBlock, ix, src.clen);
}
- nonZeros += (brow.size() - lnnz);
+ nonZeros += (a.size(rix) - lnnz);
}
else //general case (w/o awareness NNZ)
{
- SparseRow brow = sparseBlock[rix];
- for( int j=0; j<src.clen; j++ )
- if( (val = src.denseBlock[ix+j]) != 0 )
- brow.set(cl+j, val);
+ for( int j=0; j<src.clen; j++ ) {
+ double val = src.denseBlock[ix+j];
+ if( val != 0 )
+ a.set(rix, cl+j, val);
+ }
}
}
}
@@ -1690,43 +1648,26 @@ public class MatrixBlock extends MatrixValue implements Externalizable
private void copyEmptyToSparse(int rl, int ru, int cl, int cu, boolean updateNNZ )
{
+ SparseBlock a = sparseBlock;
+
if( cl==cu ) //specific case: column vector
{
- if( updateNNZ )
- {
- for( int i=rl; i<=ru; i++ )
- if( sparseBlock[i] != null && !sparseBlock[i].isEmpty() )
- {
- int lnnz = sparseBlock[i].size();
- sparseBlock[i].delete(cl);
- nonZeros += (sparseBlock[i].size()-lnnz);
- }
- }
- else
- {
- for( int i=rl; i<=ru; i++ )
- if( sparseBlock[i] != null && !sparseBlock[i].isEmpty() )
- sparseBlock[i].delete(cl);
- }
+ for( int i=rl; i<=ru; i++ )
+ if( !a.isEmpty(i) ) {
+ boolean update = a.set(i, cl, 0);
+ if( updateNNZ )
+ nonZeros -= update ? 1 : 0;
+ }
}
else
{
- if( updateNNZ )
- {
- for( int i=rl; i<=ru; i++ )
- if( sparseBlock[i] != null && !sparseBlock[i].isEmpty() )
- {
- int lnnz = sparseBlock[i].size();
- sparseBlock[i].deleteIndexRange(cl, cu);
- nonZeros += (sparseBlock[i].size()-lnnz);
- }
- }
- else
- {
- for( int i=rl; i<=ru; i++ )
- if( sparseBlock[i] != null && !sparseBlock[i].isEmpty() )
- sparseBlock[i].deleteIndexRange(cl, cu);
- }
+ for( int i=rl; i<=ru; i++ )
+ if( !a.isEmpty(i) ) {
+ int lnnz = a.size(i);
+ a.deleteIndexRange(i, cl, cu+1);
+ if( updateNNZ )
+ nonZeros += (a.size(i)-lnnz);
+ }
}
}
@@ -1794,18 +1735,18 @@ public class MatrixBlock extends MatrixValue implements Externalizable
if( that.sparse ) //DENSE <- SPARSE
{
double[] a = denseBlock;
- SparseRow[] b = that.sparseBlock;
+ SparseBlock b = that.sparseBlock;
int m = rlen;
int n = clen;
for( int i=0, aix=0; i<m; i++, aix+=n )
- if( b[i] != null && !b[i].isEmpty() )
+ if( !b.isEmpty(i) )
{
- SparseRow brow = b[i];
- int blen = brow.size();
- int[] bix = brow.getIndexContainer();
- double[] bval = brow.getValueContainer();
- for( int j=0; j<blen; j++ )
+ int bpos = b.pos(i);
+ int blen = b.size(i);
+ int[] bix = b.indexes(i);
+ double[] bval = b.values(i);
+ for( int j=bpos; j<bpos+blen; j++ )
if( bval[j] != 0 )
a[ aix + bix[j] ] = bval[j];
}
@@ -1830,42 +1771,41 @@ public class MatrixBlock extends MatrixValue implements Externalizable
{
if( that.sparse ) //SPARSE <- SPARSE
{
- SparseRow[] a = sparseBlock;
- SparseRow[] b = that.sparseBlock;
+ SparseBlock a = sparseBlock;
+ SparseBlock b = that.sparseBlock;
int m = rlen;
for( int i=0; i<m; i++ )
{
- if( b[i] != null && !b[i].isEmpty() )
+ if( !b.isEmpty(i) )
{
- if( a[i] == null || a[i].isEmpty() ) {
+ if( a.isEmpty(i) ) {
//copy entire sparse row (no sort required)
- a[i] = new SparseRow(b[i]);
+ a.set(i, new SparseRow(b.get(i)));
}
else
{
boolean appended = false;
- SparseRow arow = a[i];
- SparseRow brow = b[i];
- int blen = brow.size();
- int[] bix = brow.getIndexContainer();
- double[] bval = brow.getValueContainer();
- for( int j=0; j<blen; j++ ) {
+ int bpos = b.pos(i);
+ int blen = b.size(i);
+ int[] bix = b.indexes(i);
+ double[] bval = b.values(i);
+ for( int j=bpos; j<bpos+blen; j++ ) {
if( bval[j] != 0 ) {
- arow.append(bix[j], bval[j]);
+ a.append(i, bix[j], bval[j]);
appended = true;
}
}
//only sort if value appended
if( !appendOnly && appended )
- arow.sort();
+ a.sort(i);
}
}
}
}
else //SPARSE <- DENSE
{
- SparseRow[] a = sparseBlock;
+ SparseBlock a = sparseBlock;
double[] b = that.denseBlock;
int m = rlen;
int n = clen;
@@ -1881,7 +1821,7 @@ public class MatrixBlock extends MatrixValue implements Externalizable
}
//only sort if value appended
if( !appendOnly && appended )
- a[i].sort();
+ a.sort(i);
}
}
}
@@ -2006,21 +1946,21 @@ public class MatrixBlock extends MatrixValue implements Externalizable
}
else //default deserialize
{
+ //TODO perf sparse block
+
for(int r=0; r<rlen; r++)
{
int nr=in.readInt();
if(nr==0)
{
- if(sparseBlock[r]!=null)
- sparseBlock[r].reset(estimatedNNzsPerRow, clen);
+ if(!sparseBlock.isEmpty(r))
+ sparseBlock.reset(r, estimatedNNzsPerRow, clen);
continue;
}
- if(sparseBlock[r]==null)
- sparseBlock[r]=new SparseRow(nr);
- else
- sparseBlock[r].reset(nr, clen);
+
+ sparseBlock.reset(r, nr, clen);
for(int j=0; j<nr; j++)
- sparseBlock[r].append(in.readInt(), in.readDouble());
+ sparseBlock.append(r, in.readInt(), in.readDouble());
}
}
}
@@ -2066,10 +2006,9 @@ public class MatrixBlock extends MatrixValue implements Externalizable
for(long i=0; i<nonZeros; i++) {
int r = in.readInt();
int c = in.readInt();
- double val = in.readDouble();
- if(sparseBlock[r]==null)
- sparseBlock[r]=new SparseRow(1,clen);
- sparseBlock[r].append(c, val);
+ double val = in.readDouble();
+ sparseBlock.allocate(r, 1,clen);
+ sparseBlock.append(r, c, val);
}
}
else //ULTRA-SPARSE COL
@@ -2077,10 +2016,9 @@ public class MatrixBlock extends MatrixValue implements Externalizable
//col: read iv-pairs (should never happen since always dense)
for(long i=0; i<nonZeros; i++) {
int r = in.readInt();
- double val = in.readDouble();
- if(sparseBlock[r]==null)
- sparseBlock[r]=new SparseRow(1,1);
- sparseBlock[r].append(0, val);
+ double val = in.readDouble();
+ sparseBlock.allocate(r, 1, 1);
+ sparseBlock.append(r, 0, val);
}
}
}
@@ -2202,22 +2140,22 @@ public class MatrixBlock extends MatrixValue implements Externalizable
else //general case (if fast serialize not supported)
{
int r=0;
- for(;r<Math.min(rlen, sparseBlock.length); r++)
+ for(;r<Math.min(rlen, sparseBlock.numRows()); r++)
{
- if(sparseBlock[r]==null)
+ if( sparseBlock.isEmpty(r) )
out.writeInt(0);
else
{
- int nr=sparseBlock[r].size();
+ int pos = sparseBlock.pos(r);
+ int nr = sparseBlock.size(r);
+ int[] cols = sparseBlock.indexes(r);
+ double[] values=sparseBlock.values(r);
+
out.writeInt(nr);
- int[] cols=sparseBlock[r].getIndexContainer();
- double[] values=sparseBlock[r].getValueContainer();
- for(int j=0; j<nr; j++)
- {
+ for(int j=pos; j<pos+nr; j++) {
out.writeInt(cols[j]);
out.writeDouble(values[j]);
- }
-
+ }
}
}
for(;r<rlen; r++)
@@ -2240,13 +2178,15 @@ public class MatrixBlock extends MatrixValue implements Externalizable
if( clen > 1 ) //ULTRA-SPARSE BLOCK
{
//block: write ijv-triples
- for(int r=0;r<Math.min(rlen, sparseBlock.length); r++)
- if(sparseBlock[r]!=null && !sparseBlock[r].isEmpty() )
+ for(int r=0;r<Math.min(rlen, sparseBlock.numRows()); r++)
+ if( !sparseBlock.isEmpty(r) )
{
- int alen = sparseBlock[r].size();
- int[] aix = sparseBlock[r].getIndexContainer();
- double[] avals = sparseBlock[r].getValueContainer();
- for(int j=0; j<alen; j++) {
+ int apos = sparseBlock.pos(r);
+ int alen = sparseBlock.size(r);
+ int[] aix = sparseBlock.indexes(r);
+ double[] avals = sparseBlock.values(r);
+
+ for(int j=apos; j<apos+alen; j++) {
//ultra-sparse block: write ijv-triples
out.writeInt(r);
out.writeInt(aix[j]);
@@ -2258,10 +2198,11 @@ public class MatrixBlock extends MatrixValue implements Externalizable
else //ULTRA-SPARSE COL
{
//block: write iv-pairs (should never happen since always dense)
- for(int r=0;r<Math.min(rlen, sparseBlock.length); r++)
- if(sparseBlock[r]!=null && !sparseBlock[r].isEmpty() ) {
+ for(int r=0;r<Math.min(rlen, sparseBlock.numRows()); r++)
+ if(!sparseBlock.isEmpty(r) ) {
+ int pos = sparseBlock.pos(r);
out.writeInt(r);
- out.writeDouble(sparseBlock[r].getValueContainer()[0]);
+ out.writeDouble(sparseBlock.values(r)[pos]);
wnnz++;
}
}
@@ -2289,22 +2230,23 @@ public class MatrixBlock extends MatrixValue implements Externalizable
out.writeDouble(0);
else //existing sparse block
{
+ SparseBlock a = sparseBlock;
for( int i=0; i<rlen; i++ )
{
- if( i<sparseBlock.length && sparseBlock[i]!=null && !sparseBlock[i].isEmpty() )
+ if( i<a.numRows() && !a.isEmpty(i) )
{
- SparseRow arow = sparseBlock[i];
- int alen = arow.size();
- int[] aix = arow.getIndexContainer();
- double[] avals = arow.getValueContainer();
+ int apos = a.pos(i);
+ int alen = a.size(i);
+ int[] aix = a.indexes(i);
+ double[] avals = a.values(i);
//foreach non-zero value, fill with 0s if required
for( int j=0, j2=0; j2<alen; j++, j2++ ) {
- for( ; j<aix[j2]; j++ )
+ for( ; j<aix[apos+j2]; j++ )
out.writeDouble( 0 );
- out.writeDouble( avals[j2] );
+ out.writeDouble( avals[apos+j2] );
}
//remaining 0 values in row
- for( int j=aix[alen-1]+1; j<clen; j++)
+ for( int j=aix[apos+alen-1]+1; j<clen; j++)
out.writeDouble( 0 );
}
else //empty row
@@ -2898,16 +2840,17 @@ public class MatrixBlock extends MatrixValue implements Externalizable
if( sparse ) //SPARSE <- SPARSE
{
- SparseRow[] a = sparseBlock;
+ SparseBlock a = sparseBlock;
for(int i=0; i<m; i++) {
- if( a[i]!=null && !a[i].isEmpty() )
+ if( !a.isEmpty(i) )
{
- int alen = a[i].size();
- int[] aix = a[i].getIndexContainer();
- double[] avals = a[i].getValueContainer();
+ int apos = a.pos(i);
+ int alen = a.size(i);
+ int[] aix = a.indexes(i);
+ double[] avals = a.values(i);
- for( int j=0; j<alen; j++ ) {
+ for( int j=apos; j<apos+alen; j++ ) {
double val = op.fn.execute(avals[j]);
ret.appendValue(i, aix[j], val);
}
@@ -2993,25 +2936,29 @@ public class MatrixBlock extends MatrixValue implements Externalizable
if(sparse)
{
nonZeros=0;
- for(int r=0; r<Math.min(rlen, sparseBlock.length); r++)
+ for(int r=0; r<Math.min(rlen, sparseBlock.numRows()); r++)
{
- if(sparseBlock[r]==null)
+ if(sparseBlock.isEmpty(r))
continue;
- double[] values=sparseBlock[r].getValueContainer();
- int[] cols=sparseBlock[r].getIndexContainer();
+
+ int apos = sparseBlock.pos(r);
+ int alen = sparseBlock.size(r);
+ int[] aix = sparseBlock.indexes(r);
+ double[] avals = sparseBlock.values(r);
+
int pos=0;
- for(int i=0; i<sparseBlock[r].size(); i++)
+ for(int i=apos; i<apos+alen; i++)
{
- double v=op.fn.execute(values[i]);
- if(v!=0)
- {
- values[pos]=v;
- cols[pos]=cols[i];
+ double v=op.fn.execute(avals[i]);
+ if(v!=0) {
+ avals[pos]=v;
+ aix[pos]=aix[i];
pos++;
nonZeros++;
}
}
- sparseBlock[r].truncate(pos);
+ //TODO perf sparse block: truncate replaced by deleteIndexrange
+ sparseBlock.deleteIndexRange(r, pos, clen);
}
}
@@ -3209,18 +3156,18 @@ public class MatrixBlock extends MatrixValue implements Externalizable
{
if( newWithCor.isInSparseFormat() && aggOp.sparseSafe ) //SPARSE
{
- SparseRow[] bRows = newWithCor.getSparseBlock();
- if( bRows==null ) //early abort on empty block
+ SparseBlock b = newWithCor.getSparseBlock();
+ if( b==null ) //early abort on empty block
return;
- for( int r=0; r<Math.min(rlen, bRows.length); r++ )
+ for( int r=0; r<Math.min(rlen, b.numRows()); r++ )
{
- SparseRow brow = bRows[r];
- if( brow != null && !brow.isEmpty() )
+ if( !b.isEmpty(r) )
{
- int blen = brow.size();
- int[] bix = brow.getIndexContainer();
- double[] bvals = brow.getValueContainer();
- for( int j=0; j<blen; j++)
+ int bpos = b.pos(r);
+ int blen = b.size(r);
+ int[] bix = b.indexes(r);
+ double[] bvals = b.values(r);
+ for( int j=bpos; j<bpos+blen; j++)
{
int c = bix[j];
buffer._sum = this.quickGetValue(r, c);
@@ -3607,19 +3554,22 @@ public class MatrixBlock extends MatrixValue implements Externalizable
CellIndex temp = new CellIndex(0, 0);
if(sparse)
{
- if(sparseBlock!=null)
+ if(sparseBlock != null)
{
- for(int r=0; r<Math.min(rlen, sparseBlock.length); r++)
+ for(int r=0; r<Math.min(rlen, sparseBlock.numRows()); r++)
{
- if(sparseBlock[r]==null)
+ if(sparseBlock.isEmpty(r))
continue;
- int[] cols=sparseBlock[r].getIndexContainer();
- double[] values=sparseBlock[r].getValueContainer();
- for(int i=0; i<sparseBlock[r].size(); i++)
- {
- tempCellIndex.set(r, cols[i]);
+
+ int apos = sparseBlock.pos(r);
+ int alen = sparseBlock.size(r);
+ int[] aix = sparseBlock.indexes(r);
+ double[] avals = sparseBlock.values(r);
+
+ for(int i=apos; i<apos+alen; i++) {
+ tempCellIndex.set(r, aix[i]);
op.fn.execute(tempCellIndex, temp);
- result.appendValue(temp.row, temp.column, values[i]);
+ result.appendValue(temp.row, temp.column, avals[i]);
}
}
}
@@ -4061,9 +4011,8 @@ public class MatrixBlock extends MatrixValue implements Externalizable
//note: always dense dest
dest.allocateDenseBlock();
for( int i=rl; i<=ru; i++ ) {
- SparseRow arow = sparseBlock[i];
- if( arow != null && !arow.isEmpty() ) {
- double val = arow.get(cl);
+ if( !sparseBlock.isEmpty(i) ) {
+ double val = sparseBlock.get(i, cl);
if( val != 0 ) {
dest.denseBlock[i-rl] = val;
dest.nonZeros++;
@@ -4074,20 +4023,20 @@ public class MatrixBlock extends MatrixValue implements Externalizable
else if( rl==ru && cl==0 && cu==clen-1 ) //ROW VECTOR
{
//note: always sparse dest, but also works for dense
- dest.appendRow(0, sparseBlock[rl]);
+ dest.appendRow(0, sparseBlock.get(rl));
}
else //general case (sparse/dense dest)
{
for(int i=rl; i <= ru; i++)
- if(sparseBlock[i] != null && !sparseBlock[i].isEmpty())
+ if( !sparseBlock.isEmpty(i))
{
- SparseRow arow = sparseBlock[i];
- int alen = arow.size();
- int[] aix = arow.getIndexContainer();
- double[] avals = arow.getValueContainer();
- int astart = (cl>0)?arow.searchIndexesFirstGTE(cl):0;
+ int apos = sparseBlock.pos(i);
+ int alen = sparseBlock.size(i);
+ int[] aix = sparseBlock.indexes(i);
+ double[] avals = sparseBlock.values(i);
+ int astart = (cl>0)?sparseBlock.posFIndexGTE(i, cl) : apos;
if( astart != -1 )
- for( int j=astart; j<alen && aix[j] <= cu; j++ )
+ for( int j=astart; j<apos+alen && aix[j] <= cu; j++ )
dest.appendValue(i-rl, aix[j]-cl, avals[j]);
}
}
@@ -4191,10 +4140,10 @@ public class MatrixBlock extends MatrixValue implements Externalizable
if(sparseBlock!=null)
{
int r=(int)range.rowStart;
- for(; r<Math.min(Math.min(rowCut, sparseBlock.length), range.rowEnd+1); r++)
+ for(; r<Math.min(Math.min(rowCut, sparseBlock.numRows()), range.rowEnd+1); r++)
sliceHelp(r, range, colCut, topleft, topright, normalBlockRowFactor-rowCut, normalBlockRowFactor, normalBlockColFactor);
- for(; r<=Math.min(range.rowEnd, sparseBlock.length-1); r++)
+ for(; r<=Math.min(range.rowEnd, sparseBlock.numRows()-1); r++)
sliceHelp(r, range, colCut, bottomleft, bottomright, -rowCut, normalBlockRowFactor, normalBlockColFactor);
//System.out.println("in: \n"+this);
//System.out.println("outlist: \n"+outlist);
@@ -4230,15 +4179,15 @@ public class MatrixBlock extends MatrixValue implements Externalizable
private void sliceHelp(int r, IndexRange range, int colCut, MatrixBlock left, MatrixBlock right, int rowOffset, int normalBlockRowFactor, int normalBlockColFactor)
{
- if(sparseBlock[r]==null)
+ if(sparseBlock.isEmpty(r))
return;
- int[] cols=sparseBlock[r].getIndexContainer();
- double[] values=sparseBlock[r].getValueContainer();
- int start=sparseBlock[r].searchIndexesFirstGTE((int)range.colStart);
+ int[] cols=sparseBlock.indexes(r);
+ double[] values=sparseBlock.values(r);
+ int start=sparseBlock.posFIndexGTE(r, (int)range.colStart);
if(start<0)
return;
- int end=sparseBlock[r].searchIndexesFirstLTE((int)range.colEnd);
+ int end=sparseBlock.posFIndexLTE(r, (int)range.colEnd);
if(end<0 || start>end)
return;
@@ -4324,23 +4273,23 @@ public class MatrixBlock extends MatrixValue implements Externalizable
{
if(!complementary)//if zero out
{
- for(int r=0; r<Math.min((int)range.rowStart, sparseBlock.length); r++)
- ((MatrixBlock) result).appendRow(r, sparseBlock[r]);
- for(int r=Math.min((int)range.rowEnd+1, sparseBlock.length); r<Math.min(rlen, sparseBlock.length); r++)
- ((MatrixBlock) result).appendRow(r, sparseBlock[r]);
+ for(int r=0; r<Math.min((int)range.rowStart, sparseBlock.numRows()); r++)
+ ((MatrixBlock) result).appendRow(r, sparseBlock.get(r));
+ for(int r=Math.min((int)range.rowEnd+1, sparseBlock.numRows()); r<Math.min(rlen, sparseBlock.numRows()); r++)
+ ((MatrixBlock) result).appendRow(r, sparseBlock.get(r));
}
- for(int r=(int)range.rowStart; r<=Math.min(range.rowEnd, sparseBlock.length-1); r++)
+ for(int r=(int)range.rowStart; r<=Math.min(range.rowEnd, sparseBlock.numRows()-1); r++)
{
- if(sparseBlock[r]==null)
+ if(sparseBlock.isEmpty(r))
continue;
- int[] cols=sparseBlock[r].getIndexContainer();
- double[] values=sparseBlock[r].getValueContainer();
+ int[] cols=sparseBlock.indexes(r);
+ double[] values=sparseBlock.values(r);
if(complementary)//if selection
{
- int start=sparseBlock[r].searchIndexesFirstGTE((int)range.colStart);
+ int start=sparseBlock.posFIndexGTE(r,(int)range.colStart);
if(start<0) continue;
- int end=sparseBlock[r].searchIndexesFirstGT((int)range.colEnd);
+ int end=sparseBlock.posFIndexGT(r,(int)range.colEnd);
if(end<0 || start>end)
continue;
@@ -4350,16 +4299,18 @@ public class MatrixBlock extends MatrixValue implements Externalizable
}
}else
{
- int start=sparseBlock[r].searchIndexesFirstGTE((int)range.colStart);
- if(start<0) start=sparseBlock[r].size();
- int end=sparseBlock[r].searchIndexesFirstGT((int)range.colEnd);
- if(end<0) end=sparseBlock[r].size();
+ int pos = sparseBlock.pos(r);
+ int len = sparseBlock.size(r);
+ int start=sparseBlock.posFIndexGTE(r,(int)range.colStart);
+ if(start<0) start=pos+len;
+ int end=sparseBlock.posFIndexGT(r,(int)range.colEnd);
+ if(end<0) end=pos+len;
- for(int i=0; i<start; i++)
+ for(int i=pos; i<start; i++)
{
((MatrixBlock) result).appendValue(r, cols[i], values[i]);
}
- for(int i=end; i<sparseBlock[r].size(); i++)
+ for(int i=end; i<pos+len; i++)
{
((MatrixBlock) result).appendValue(r, cols[i], values[i]);
}
@@ -4486,18 +4437,22 @@ public class MatrixBlock extends MatrixValue implements Externalizable
{
if(sparseBlock!=null)
{
- for(r=0; r<Math.min(rlen, sparseBlock.length); r++)
+ SparseBlock a = sparseBlock;
+
+ for(r=0; r<Math.min(rlen, a.numRows()); r++)
{
- if(sparseBlock[r]==null)
+ if(a.isEmpty(r))
continue;
- int[] cols=sparseBlock[r].getIndexContainer();
- double[] values=sparseBlock[r].getValueContainer();
- for(int i=0; i<sparseBlock[r].size(); i++)
- {
- tempCellIndex.set(r, cols[i]);
+ int apos = a.pos(r);
+ int alen = a.size(r);
+ int[] aix = a.indexes(r);
+ double[] aval = a.values(r);
+
+ for(int i=apos; i<apos+alen; i++) {
+ tempCellIndex.set(r, aix[i]);
op.indexFn.execute(tempCellIndex, tempCellIndex);
- incrementalAggregateUnaryHelp(op.aggOp, result, tempCellIndex.row, tempCellIndex.column, values[i], buffer);
-
+ incrementalAggregateUnaryHelp(op.aggOp, result,
+ tempCellIndex.row, tempCellIndex.column, aval[i], buffer);
}
}
}
@@ -4654,8 +4609,8 @@ public class MatrixBlock extends MatrixValue implements Externalizable
{
if(sparseBlock!=null)
for(int i=1; i<=step; i++)
- if(sparseBlock[rlen-i]!=null)
- this.nonZeros-=sparseBlock[rlen-i].size();
+ if(!sparseBlock.isEmpty(rlen-i))
+ this.nonZeros-=sparseBlock.size(rlen-i);
}
else //DENSE
{
@@ -4678,14 +4633,17 @@ public class MatrixBlock extends MatrixValue implements Externalizable
{
if(sparseBlock!=null)
{
- for(int r=0; r<Math.min(rlen, sparseBlock.length); r++)
- if(sparseBlock[r]!=null)
+ for(int r=0; r<Math.min(rlen, sparseBlock.numRows()); r++)
+ if(!sparseBlock.isEmpty(r))
{
- int newSize=sparseBlock[r].searchIndexesFirstGTE(clen-step);
- if(newSize>=0)
+ int newSize=sparseBlock.posFIndexGTE(r, clen-step);
+ if(newSize >= 0)
{
- this.nonZeros-=sparseBlock[r].size()-newSize;
- sparseBlock[r].truncate(newSize);
+ this.nonZeros-=sparseBlock.size(r)-newSize;
+ int pos = sparseBlock.pos(r);
+ int cl = sparseBlock.indexes(r)[pos+newSize-1];
+ sparseBlock.deleteIndexRange(r, cl+1, clen);
+ //TODO perf sparse block: truncate replaced by deleteIndexRange
}
}
}
@@ -4747,13 +4705,15 @@ public class MatrixBlock extends MatrixValue implements Externalizable
int nzcount = 0;
if(sparse && sparseBlock!=null) //SPARSE
{
- for(int r=0; r<Math.min(rlen, sparseBlock.length); r++)
+ for(int r=0; r<Math.min(rlen, sparseBlock.numRows()); r++)
{
- if(sparseBlock[r]==null)
+ if(sparseBlock.isEmpty(r))
continue;
- double[] values=sparseBlock[r].getValueContainer();
- for(int i=0; i<sparseBlock[r].size(); i++) {
- op.fn.execute(cmobj, values[i]);
+ int apos = sparseBlock.pos(r);
+ int alen = sparseBlock.size(r);
+ double[] avals = sparseBlock.values(r);
+ for(int i=apos; i<apos+alen; i++) {
+ op.fn.execute(cmobj, avals[i]);
nzcount++;
}
}
@@ -5426,27 +5386,25 @@ public class MatrixBlock extends MatrixValue implements Externalizable
if( pattern != 0d ) //SPARSE <- SPARSE (sparse-safe)
{
ret.allocateSparseRowsBlock();
- SparseRow[] a = sparseBlock;
- SparseRow[] c = ret.sparseBlock;
+ SparseBlock a = sparseBlock;
+ SparseBlock c = ret.sparseBlock;
- for( int i=0; i<rlen; i++ )
- {
- SparseRow arow = a[ i ];
- if( arow!=null && !arow.isEmpty() )
+ for( int i=0; i<rlen; i++ ) {
+ if( !a.isEmpty(i) )
{
- SparseRow crow = new SparseRow(arow.size());
- int alen = arow.size();
- int[] aix = arow.getIndexContainer();
- double[] avals = arow.getValueContainer();
- for( int j=0; j<alen; j++ )
+ c.allocate(i);
+ int apos = a.pos(i);
+ int alen = a.size(i);
+ int[] aix = a.indexes(i);
+ double[] avals = a.values(i);
+ for( int j=apos; j<apos+alen; j++ )
{
double val = avals[j];
if( val== pattern || (NaNpattern && Double.isNaN(val)) )
- crow.append(aix[j], replacement);
+ c.append(i, aix[j], replacement);
else
- crow.append(aix[j], val);
+ c.append(i, aix[j], val);
}
- c[ i ] = crow;
}
}
}
@@ -5454,7 +5412,7 @@ public class MatrixBlock extends MatrixValue implements Externalizable
{
ret.sparse = false;
ret.allocateDenseBlock();
- SparseRow[] a = sparseBlock;
+ SparseBlock a = sparseBlock;
double[] c = ret.denseBlock;
//initialize with replacement (since all 0 values, see SPARSITY_TURN_POINT)
@@ -5464,13 +5422,13 @@ public class MatrixBlock extends MatrixValue implements Externalizable
if( a != null ) //check for empty matrix
for( int i=0, cix=0; i<rlen; i++, cix+=clen )
{
- SparseRow arow = a[ i ];
- if( arow!=null && !arow.isEmpty() )
+ if( !a.isEmpty(i) )
{
- int alen = arow.size();
- int[] aix = arow.getIndexContainer();
- double[] avals = arow.getValueContainer();
- for( int j=0; j<alen; j++ )
+ int apos = a.pos(i);
+ int alen = a.size(i);
+ int[] aix = a.indexes(i);
+ double[] avals = a.values(i);
+ for( int j=apos; j<apos+alen; j++ )
if( avals[ j ] != 0 )
c[ cix+aix[j] ] = avals[ j ];
}
@@ -5654,25 +5612,25 @@ public class MatrixBlock extends MatrixValue implements Externalizable
if( this.isEmptyBlock(false) && that.isEmptyBlock(false) )
return;
- SparseRow[] a = this.sparseBlock;
- SparseRow[] b = that.sparseBlock;
+ SparseBlock a = this.sparseBlock;
+ SparseBlock b = that.sparseBlock;
for( int i=0; i<rlen; i++ )
{
- SparseRow arow = a[i];
- SparseRow brow = b[i];
- if( arow != null && !arow.isEmpty() )
+ if( !a.isEmpty(i) )
{
- int alen = arow.size();
- double[] avals = arow.getValueContainer();
- double[] bvals = brow.getValueContainer();
+ int alen = a.size(i);
+ int apos = a.pos(i);
+ double[] avals = a.values(i);
+ int bpos = b.pos(i);
+ double[] bvals = b.values(i);
if( resultBlock == null ) {
for( int j=0; j<alen; j++ )
- ctable.execute(avals[j], bvals[j], w, ignoreZeros, resultMap);
+ ctable.execute(avals[apos+j], bvals[bpos+j], w, ignoreZeros, resultMap);
}
else {
for( int j=0; j<alen; j++ )
- ctable.execute(avals[j], bvals[j], w, ignoreZeros, resultBlock);
+ ctable.execute(avals[apos+j], bvals[bpos+j], w, ignoreZeros, resultBlock);
}
}
}
@@ -6142,29 +6100,14 @@ public class MatrixBlock extends MatrixValue implements Externalizable
if(sparse)
{
- int len=0;
- if(sparseBlock!=null)
- len = Math.min(rlen, sparseBlock.length);
- int i=0;
- for(; i<len; i++)
- {
- sb.append("row +");
- sb.append(i);
- sb.append(": ");
- sb.append(sparseBlock[i]);
- sb.append("\n");
- }
- for(; i<rlen; i++)
- {
- sb.append("row +");
- sb.append(i);
- sb.append(": null\n");
+ if( sparseBlock != null ) {
+ //overloaded implementation in sparse blocks
+ sb.append(sparseBlock.toString());
}
}
else
{
- if(denseBlock!=null)
- {
+ if(denseBlock!=null) {
for(int i=0, ix=0; i<rlen; i++, ix+=clen) {
for(int j=0; j<clen; j++) {
sb.append(this.denseBlock[ix+j]);
http://git-wip-us.apache.org/repos/asf/incubator-systemml/blob/8ba0fdcc/src/main/java/org/apache/sysml/runtime/matrix/data/MatrixBlockDataInput.java
----------------------------------------------------------------------
diff --git a/src/main/java/org/apache/sysml/runtime/matrix/data/MatrixBlockDataInput.java b/src/main/java/org/apache/sysml/runtime/matrix/data/MatrixBlockDataInput.java
index e78b766..84cfa0c 100644
--- a/src/main/java/org/apache/sysml/runtime/matrix/data/MatrixBlockDataInput.java
+++ b/src/main/java/org/apache/sysml/runtime/matrix/data/MatrixBlockDataInput.java
@@ -54,6 +54,6 @@ public interface MatrixBlockDataInput
* @param rows
* @throws IOException
*/
- public long readSparseRows(int rlen, SparseRow[] rows)
+ public long readSparseRows(int rlen, SparseBlock rows)
throws IOException;
}
http://git-wip-us.apache.org/repos/asf/incubator-systemml/blob/8ba0fdcc/src/main/java/org/apache/sysml/runtime/matrix/data/MatrixBlockDataOutput.java
----------------------------------------------------------------------
diff --git a/src/main/java/org/apache/sysml/runtime/matrix/data/MatrixBlockDataOutput.java b/src/main/java/org/apache/sysml/runtime/matrix/data/MatrixBlockDataOutput.java
index b89e0dd..fd8fca9 100644
--- a/src/main/java/org/apache/sysml/runtime/matrix/data/MatrixBlockDataOutput.java
+++ b/src/main/java/org/apache/sysml/runtime/matrix/data/MatrixBlockDataOutput.java
@@ -52,6 +52,6 @@ public interface MatrixBlockDataOutput
* @param rows
* @throws IOException
*/
- public void writeSparseRows(int rlen, SparseRow[] rows)
+ public void writeSparseRows(int rlen, SparseBlock rows)
throws IOException;
}
http://git-wip-us.apache.org/repos/asf/incubator-systemml/blob/8ba0fdcc/src/main/java/org/apache/sysml/runtime/matrix/data/SparseRowsIterator.java
----------------------------------------------------------------------
diff --git a/src/main/java/org/apache/sysml/runtime/matrix/data/SparseRowsIterator.java b/src/main/java/org/apache/sysml/runtime/matrix/data/SparseRowsIterator.java
deleted file mode 100644
index 75ca433..0000000
--- a/src/main/java/org/apache/sysml/runtime/matrix/data/SparseRowsIterator.java
+++ /dev/null
@@ -1,110 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package org.apache.sysml.runtime.matrix.data;
-
-import java.util.Iterator;
-
-/**
- * Iterator for external use of matrix blocks in sparse representation.
- * It allows to linearly iterate only over non-zero values which is
- * important for sparse safe operations.
- *
- */
-public class SparseRowsIterator implements Iterator<IJV>
-{
-
- private int rlen = 0;
- private SparseRow[] sparseRows = null;
- private int curRow = -1;
- private int curColIndex = -1;
- private int[] colIndexes = null;
- private double[] values = null;
- private boolean nothingLeft = false;
- private IJV retijv = new IJV();
-
- //allow initialization from package or subclasses
- protected SparseRowsIterator(int nrows, SparseRow[] mtx)
- {
- rlen=nrows;
- sparseRows=mtx;
- curRow=0;
-
- if(sparseRows==null)
- nothingLeft=true;
- else
- findNextNonZeroRow();
- }
-
- //allow initialization from package or subclasses
- protected SparseRowsIterator(int currow, int nrows, SparseRow[] mtx)
- {
- rlen=nrows;
- sparseRows=mtx;
- curRow=currow;
-
- if(sparseRows==null)
- nothingLeft=true;
- else
- findNextNonZeroRow();
- }
-
- @Override
- public boolean hasNext() {
- if(nothingLeft)
- return false;
- else
- return true;
- }
-
- @Override
- public IJV next( ) {
- retijv.set(curRow, colIndexes[curColIndex], values[curColIndex]);
- curColIndex++;
- if(curColIndex>=sparseRows[curRow].size())
- {
- curRow++;
- findNextNonZeroRow();
- }
- return retijv;
- }
-
- @Override
- public void remove() {
- throw new RuntimeException("SparseCellIterator.remove should not be called!");
-
- }
-
- /**
- *
- */
- private void findNextNonZeroRow()
- {
- while(curRow<Math.min(rlen, sparseRows.length) && (sparseRows[curRow]==null || sparseRows[curRow].isEmpty()))
- curRow++;
- if(curRow>=Math.min(rlen, sparseRows.length))
- nothingLeft=true;
- else
- {
- curColIndex=0;
- colIndexes=sparseRows[curRow].getIndexContainer();
- values=sparseRows[curRow].getValueContainer();
- }
- }
-}
http://git-wip-us.apache.org/repos/asf/incubator-systemml/blob/8ba0fdcc/src/main/java/org/apache/sysml/runtime/util/FastBufferedDataInputStream.java
----------------------------------------------------------------------
diff --git a/src/main/java/org/apache/sysml/runtime/util/FastBufferedDataInputStream.java b/src/main/java/org/apache/sysml/runtime/util/FastBufferedDataInputStream.java
index 67f8194..74641bd 100644
--- a/src/main/java/org/apache/sysml/runtime/util/FastBufferedDataInputStream.java
+++ b/src/main/java/org/apache/sysml/runtime/util/FastBufferedDataInputStream.java
@@ -26,7 +26,7 @@ import java.io.IOException;
import java.io.InputStream;
import org.apache.sysml.runtime.matrix.data.MatrixBlockDataInput;
-import org.apache.sysml.runtime.matrix.data.SparseRow;
+import org.apache.sysml.runtime.matrix.data.SparseBlock;
/**
*
@@ -202,7 +202,7 @@ public class FastBufferedDataInputStream extends FilterInputStream implements Da
}
@Override
- public long readSparseRows(int rlen, SparseRow[] rows)
+ public long readSparseRows(int rlen, SparseBlock rows)
throws IOException
{
//counter for non-zero elements
@@ -216,9 +216,7 @@ public class FastBufferedDataInputStream extends FilterInputStream implements Da
if( lnnz > 0 ) //non-zero row
{
//get handle to sparse (allocate if necessary)
- if( rows[i] == null )
- rows[i] = new SparseRow(lnnz);
- SparseRow arow = rows[i];
+ rows.allocate(i, lnnz);
//read single sparse row
//note: cast to long to prevent overflows w/ lnnz*12
@@ -232,7 +230,7 @@ public class FastBufferedDataInputStream extends FilterInputStream implements Da
int aix = baToInt(_buff, j);
long tmp = baToLong(_buff, j+4);
double aval = Double.longBitsToDouble( tmp );
- arow.append(aix, aval);
+ rows.append(i, aix, aval);
}
}
else
@@ -243,7 +241,7 @@ public class FastBufferedDataInputStream extends FilterInputStream implements Da
int aix = baToInt(_buff, 0);
long tmp = baToLong(_buff, 4);
double aval = Double.longBitsToDouble(tmp);
- arow.append(aix, aval);
+ rows.append(i, aix, aval);
}
}
http://git-wip-us.apache.org/repos/asf/incubator-systemml/blob/8ba0fdcc/src/main/java/org/apache/sysml/runtime/util/FastBufferedDataOutputStream.java
----------------------------------------------------------------------
diff --git a/src/main/java/org/apache/sysml/runtime/util/FastBufferedDataOutputStream.java b/src/main/java/org/apache/sysml/runtime/util/FastBufferedDataOutputStream.java
index f65c588..e7aebb4 100644
--- a/src/main/java/org/apache/sysml/runtime/util/FastBufferedDataOutputStream.java
+++ b/src/main/java/org/apache/sysml/runtime/util/FastBufferedDataOutputStream.java
@@ -25,7 +25,7 @@ import java.io.IOException;
import java.io.OutputStream;
import org.apache.sysml.runtime.matrix.data.MatrixBlockDataOutput;
-import org.apache.sysml.runtime.matrix.data.SparseRow;
+import org.apache.sysml.runtime.matrix.data.SparseBlock;
/**
* This buffered output stream is essentially a merged version of
@@ -236,21 +236,21 @@ public class FastBufferedDataOutputStream extends FilterOutputStream implements
}
@Override
- public void writeSparseRows(int rlen, SparseRow[] rows)
+ public void writeSparseRows(int rlen, SparseBlock rows)
throws IOException
{
- int lrlen = Math.min(rows.length, rlen);
+ int lrlen = Math.min(rows.numRows(), rlen);
//process existing rows
for( int i=0; i<lrlen; i++ )
{
- SparseRow arow = rows[i];
- if( arow!=null && !arow.isEmpty() )
+ if( !rows.isEmpty(i) )
{
- int alen = arow.size();
+ int apos = rows.pos(i);
+ int alen = rows.size(i);
int alen2 = alen*12;
- int[] aix = arow.getIndexContainer();
- double[] avals = arow.getValueContainer();
+ int[] aix = rows.indexes(i);
+ double[] avals = rows.values(i);
writeInt( alen );
@@ -259,7 +259,7 @@ public class FastBufferedDataOutputStream extends FilterOutputStream implements
if (_count+alen2 > _bufflen)
flushBuffer();
- for( int j=0; j<alen; j++ )
+ for( int j=apos; j<apos+alen; j++ )
{
long tmp2 = Double.doubleToRawLongBits(avals[j]);
intToBa(aix[j], _buff, _count);
@@ -270,7 +270,7 @@ public class FastBufferedDataOutputStream extends FilterOutputStream implements
else
{
//row does not fit in buffer
- for( int j=0; j<alen; j++ )
+ for( int j=apos; j<apos+alen; j++ )
{
if (_count+12 > _bufflen)
flushBuffer();
http://git-wip-us.apache.org/repos/asf/incubator-systemml/blob/8ba0fdcc/src/test/java/org/apache/sysml/test/integration/functions/sparse/SparseBlockDelete.java
----------------------------------------------------------------------
diff --git a/src/test/java/org/apache/sysml/test/integration/functions/sparse/SparseBlockDelete.java b/src/test/java/org/apache/sysml/test/integration/functions/sparse/SparseBlockDelete.java
index c719bcb..392194b 100644
--- a/src/test/java/org/apache/sysml/test/integration/functions/sparse/SparseBlockDelete.java
+++ b/src/test/java/org/apache/sysml/test/integration/functions/sparse/SparseBlockDelete.java
@@ -29,7 +29,6 @@ import org.apache.sysml.runtime.matrix.data.SparseBlock;
import org.apache.sysml.runtime.matrix.data.SparseBlockCOO;
import org.apache.sysml.runtime.matrix.data.SparseBlockCSR;
import org.apache.sysml.runtime.matrix.data.SparseBlockMCSR;
-import org.apache.sysml.runtime.matrix.data.SparseRow;
import org.apache.sysml.runtime.util.DataConverter;
import org.apache.sysml.test.integration.AutomatedTestBase;
import org.apache.sysml.test.utils.TestUtils;
@@ -115,11 +114,11 @@ public class SparseBlockDelete extends AutomatedTestBase
//init sparse block
SparseBlock sblock = null;
MatrixBlock mbtmp = DataConverter.convertToMatrixBlock(A);
- SparseRow[] srtmp = mbtmp.getSparseBlock();
+ SparseBlock srtmp = mbtmp.getSparseBlock();
switch( btype ) {
- case MCSR: sblock = new SparseBlockMCSR(srtmp,true); break;
- case CSR: sblock = new SparseBlockCSR(srtmp, (int)mbtmp.getNonZeros()); break;
- case COO: sblock = new SparseBlockCOO(srtmp, (int)mbtmp.getNonZeros()); break;
+ case MCSR: sblock = new SparseBlockMCSR(srtmp); break;
+ case CSR: sblock = new SparseBlockCSR(srtmp); break;
+ case COO: sblock = new SparseBlockCOO(srtmp); break;
}
//delete range per row via set
http://git-wip-us.apache.org/repos/asf/incubator-systemml/blob/8ba0fdcc/src/test/java/org/apache/sysml/test/integration/functions/sparse/SparseBlockGetFirstIndex.java
----------------------------------------------------------------------
diff --git a/src/test/java/org/apache/sysml/test/integration/functions/sparse/SparseBlockGetFirstIndex.java b/src/test/java/org/apache/sysml/test/integration/functions/sparse/SparseBlockGetFirstIndex.java
index 7e23dd0..e2800eb 100644
--- a/src/test/java/org/apache/sysml/test/integration/functions/sparse/SparseBlockGetFirstIndex.java
+++ b/src/test/java/org/apache/sysml/test/integration/functions/sparse/SparseBlockGetFirstIndex.java
@@ -26,7 +26,6 @@ import org.apache.sysml.runtime.matrix.data.SparseBlock;
import org.apache.sysml.runtime.matrix.data.SparseBlockCOO;
import org.apache.sysml.runtime.matrix.data.SparseBlockCSR;
import org.apache.sysml.runtime.matrix.data.SparseBlockMCSR;
-import org.apache.sysml.runtime.matrix.data.SparseRow;
import org.apache.sysml.runtime.util.DataConverter;
import org.apache.sysml.test.integration.AutomatedTestBase;
import org.apache.sysml.test.utils.TestUtils;
@@ -207,11 +206,11 @@ public class SparseBlockGetFirstIndex extends AutomatedTestBase
//init sparse block
SparseBlock sblock = null;
MatrixBlock mbtmp = DataConverter.convertToMatrixBlock(A);
- SparseRow[] srtmp = mbtmp.getSparseBlock();
+ SparseBlock srtmp = mbtmp.getSparseBlock();
switch( btype ) {
- case MCSR: sblock = new SparseBlockMCSR(srtmp,true); break;
- case CSR: sblock = new SparseBlockCSR(srtmp, (int)mbtmp.getNonZeros()); break;
- case COO: sblock = new SparseBlockCOO(srtmp, (int)mbtmp.getNonZeros()); break;
+ case MCSR: sblock = new SparseBlockMCSR(srtmp); break;
+ case CSR: sblock = new SparseBlockCSR(srtmp); break;
+ case COO: sblock = new SparseBlockCOO(srtmp); break;
}
//check for correct number of non-zeros
http://git-wip-us.apache.org/repos/asf/incubator-systemml/blob/8ba0fdcc/src/test/java/org/apache/sysml/test/integration/functions/sparse/SparseBlockGetSet.java
----------------------------------------------------------------------
diff --git a/src/test/java/org/apache/sysml/test/integration/functions/sparse/SparseBlockGetSet.java b/src/test/java/org/apache/sysml/test/integration/functions/sparse/SparseBlockGetSet.java
index 9c9856e..be160c9 100644
--- a/src/test/java/org/apache/sysml/test/integration/functions/sparse/SparseBlockGetSet.java
+++ b/src/test/java/org/apache/sysml/test/integration/functions/sparse/SparseBlockGetSet.java
@@ -26,7 +26,6 @@ import org.apache.sysml.runtime.matrix.data.SparseBlock;
import org.apache.sysml.runtime.matrix.data.SparseBlockCOO;
import org.apache.sysml.runtime.matrix.data.SparseBlockCSR;
import org.apache.sysml.runtime.matrix.data.SparseBlockMCSR;
-import org.apache.sysml.runtime.matrix.data.SparseRow;
import org.apache.sysml.runtime.util.DataConverter;
import org.apache.sysml.runtime.util.LongLongDoubleHashMap;
import org.apache.sysml.runtime.util.LongLongDoubleHashMap.LLDoubleEntry;
@@ -210,11 +209,11 @@ public class SparseBlockGetSet extends AutomatedTestBase
SparseBlock sblock = null;
if( itype == InitType.BULK ) {
MatrixBlock mbtmp = DataConverter.convertToMatrixBlock(A);
- SparseRow[] srtmp = mbtmp.getSparseBlock();
+ SparseBlock srtmp = mbtmp.getSparseBlock();
switch( btype ) {
- case MCSR: sblock = new SparseBlockMCSR(srtmp,true); break;
- case CSR: sblock = new SparseBlockCSR(srtmp, (int)mbtmp.getNonZeros()); break;
- case COO: sblock = new SparseBlockCOO(srtmp, (int)mbtmp.getNonZeros()); break;
+ case MCSR: sblock = new SparseBlockMCSR(srtmp); break;
+ case CSR: sblock = new SparseBlockCSR(srtmp); break;
+ case COO: sblock = new SparseBlockCOO(srtmp); break;
}
}
else if( itype == InitType.SEQ_SET || itype == InitType.RAND_SET ) {
http://git-wip-us.apache.org/repos/asf/incubator-systemml/blob/8ba0fdcc/src/test/java/org/apache/sysml/test/integration/functions/sparse/SparseBlockIndexRange.java
----------------------------------------------------------------------
diff --git a/src/test/java/org/apache/sysml/test/integration/functions/sparse/SparseBlockIndexRange.java b/src/test/java/org/apache/sysml/test/integration/functions/sparse/SparseBlockIndexRange.java
index 5a4ea4a..a483ab3 100644
--- a/src/test/java/org/apache/sysml/test/integration/functions/sparse/SparseBlockIndexRange.java
+++ b/src/test/java/org/apache/sysml/test/integration/functions/sparse/SparseBlockIndexRange.java
@@ -30,7 +30,6 @@ import org.apache.sysml.runtime.matrix.data.SparseBlock;
import org.apache.sysml.runtime.matrix.data.SparseBlockCOO;
import org.apache.sysml.runtime.matrix.data.SparseBlockCSR;
import org.apache.sysml.runtime.matrix.data.SparseBlockMCSR;
-import org.apache.sysml.runtime.matrix.data.SparseRow;
import org.apache.sysml.runtime.util.DataConverter;
import org.apache.sysml.test.integration.AutomatedTestBase;
import org.apache.sysml.test.utils.TestUtils;
@@ -166,11 +165,11 @@ public class SparseBlockIndexRange extends AutomatedTestBase
//init sparse block
SparseBlock sblock = null;
MatrixBlock mbtmp = DataConverter.convertToMatrixBlock(A);
- SparseRow[] srtmp = mbtmp.getSparseBlock();
+ SparseBlock srtmp = mbtmp.getSparseBlock();
switch( btype ) {
- case MCSR: sblock = new SparseBlockMCSR(srtmp,true); break;
- case CSR: sblock = new SparseBlockCSR(srtmp, (int)mbtmp.getNonZeros()); break;
- case COO: sblock = new SparseBlockCOO(srtmp, (int)mbtmp.getNonZeros()); break;
+ case MCSR: sblock = new SparseBlockMCSR(srtmp); break;
+ case CSR: sblock = new SparseBlockCSR(srtmp); break;
+ case COO: sblock = new SparseBlockCOO(srtmp); break;
}
//delete range per row via set
http://git-wip-us.apache.org/repos/asf/incubator-systemml/blob/8ba0fdcc/src/test/java/org/apache/sysml/test/integration/functions/sparse/SparseBlockIterator.java
----------------------------------------------------------------------
diff --git a/src/test/java/org/apache/sysml/test/integration/functions/sparse/SparseBlockIterator.java b/src/test/java/org/apache/sysml/test/integration/functions/sparse/SparseBlockIterator.java
index db388c2..85e8e71 100644
--- a/src/test/java/org/apache/sysml/test/integration/functions/sparse/SparseBlockIterator.java
+++ b/src/test/java/org/apache/sysml/test/integration/functions/sparse/SparseBlockIterator.java
@@ -29,7 +29,6 @@ import org.apache.sysml.runtime.matrix.data.SparseBlock;
import org.apache.sysml.runtime.matrix.data.SparseBlockCOO;
import org.apache.sysml.runtime.matrix.data.SparseBlockCSR;
import org.apache.sysml.runtime.matrix.data.SparseBlockMCSR;
-import org.apache.sysml.runtime.matrix.data.SparseRow;
import org.apache.sysml.runtime.util.DataConverter;
import org.apache.sysml.test.integration.AutomatedTestBase;
import org.apache.sysml.test.utils.TestUtils;
@@ -161,11 +160,11 @@ public class SparseBlockIterator extends AutomatedTestBase
//init sparse block
SparseBlock sblock = null;
MatrixBlock mbtmp = DataConverter.convertToMatrixBlock(A);
- SparseRow[] srtmp = mbtmp.getSparseBlock();
+ SparseBlock srtmp = mbtmp.getSparseBlock();
switch( btype ) {
- case MCSR: sblock = new SparseBlockMCSR(srtmp,true); break;
- case CSR: sblock = new SparseBlockCSR(srtmp, (int)mbtmp.getNonZeros()); break;
- case COO: sblock = new SparseBlockCOO(srtmp, (int)mbtmp.getNonZeros()); break;
+ case MCSR: sblock = new SparseBlockMCSR(srtmp); break;
+ case CSR: sblock = new SparseBlockCSR(srtmp); break;
+ case COO: sblock = new SparseBlockCOO(srtmp); break;
}
//check for correct number of non-zeros
http://git-wip-us.apache.org/repos/asf/incubator-systemml/blob/8ba0fdcc/src/test/java/org/apache/sysml/test/integration/functions/sparse/SparseBlockScan.java
----------------------------------------------------------------------
diff --git a/src/test/java/org/apache/sysml/test/integration/functions/sparse/SparseBlockScan.java b/src/test/java/org/apache/sysml/test/integration/functions/sparse/SparseBlockScan.java
index 4f89a17..53d2b6d 100644
--- a/src/test/java/org/apache/sysml/test/integration/functions/sparse/SparseBlockScan.java
+++ b/src/test/java/org/apache/sysml/test/integration/functions/sparse/SparseBlockScan.java
@@ -26,7 +26,6 @@ import org.apache.sysml.runtime.matrix.data.SparseBlock;
import org.apache.sysml.runtime.matrix.data.SparseBlockCOO;
import org.apache.sysml.runtime.matrix.data.SparseBlockCSR;
import org.apache.sysml.runtime.matrix.data.SparseBlockMCSR;
-import org.apache.sysml.runtime.matrix.data.SparseRow;
import org.apache.sysml.runtime.util.DataConverter;
import org.apache.sysml.test.integration.AutomatedTestBase;
import org.apache.sysml.test.utils.TestUtils;
@@ -111,11 +110,11 @@ public class SparseBlockScan extends AutomatedTestBase
//init sparse block
SparseBlock sblock = null;
MatrixBlock mbtmp = DataConverter.convertToMatrixBlock(A);
- SparseRow[] srtmp = mbtmp.getSparseBlock();
+ SparseBlock srtmp = mbtmp.getSparseBlock();
switch( btype ) {
- case MCSR: sblock = new SparseBlockMCSR(srtmp,true); break;
- case CSR: sblock = new SparseBlockCSR(srtmp, (int)mbtmp.getNonZeros()); break;
- case COO: sblock = new SparseBlockCOO(srtmp, (int)mbtmp.getNonZeros()); break;
+ case MCSR: sblock = new SparseBlockMCSR(srtmp); break;
+ case CSR: sblock = new SparseBlockCSR(srtmp); break;
+ case COO: sblock = new SparseBlockCOO(srtmp); break;
}
//check for correct number of non-zeros
http://git-wip-us.apache.org/repos/asf/incubator-systemml/blob/8ba0fdcc/src/test/java/org/apache/sysml/test/integration/functions/sparse/SparseBlockSize.java
----------------------------------------------------------------------
diff --git a/src/test/java/org/apache/sysml/test/integration/functions/sparse/SparseBlockSize.java b/src/test/java/org/apache/sysml/test/integration/functions/sparse/SparseBlockSize.java
index aca66dc..afeb374 100644
--- a/src/test/java/org/apache/sysml/test/integration/functions/sparse/SparseBlockSize.java
+++ b/src/test/java/org/apache/sysml/test/integration/functions/sparse/SparseBlockSize.java
@@ -26,7 +26,6 @@ import org.apache.sysml.runtime.matrix.data.SparseBlock;
import org.apache.sysml.runtime.matrix.data.SparseBlockCOO;
import org.apache.sysml.runtime.matrix.data.SparseBlockCSR;
import org.apache.sysml.runtime.matrix.data.SparseBlockMCSR;
-import org.apache.sysml.runtime.matrix.data.SparseRow;
import org.apache.sysml.runtime.util.DataConverter;
import org.apache.sysml.test.integration.AutomatedTestBase;
import org.apache.sysml.test.utils.TestUtils;
@@ -115,11 +114,11 @@ public class SparseBlockSize extends AutomatedTestBase
//init sparse block
SparseBlock sblock = null;
MatrixBlock mbtmp = DataConverter.convertToMatrixBlock(A);
- SparseRow[] srtmp = mbtmp.getSparseBlock();
+ SparseBlock srtmp = mbtmp.getSparseBlock();
switch( btype ) {
- case MCSR: sblock = new SparseBlockMCSR(srtmp,true); break;
- case CSR: sblock = new SparseBlockCSR(srtmp, (int)mbtmp.getNonZeros()); break;
- case COO: sblock = new SparseBlockCOO(srtmp, (int)mbtmp.getNonZeros()); break;
+ case MCSR: sblock = new SparseBlockMCSR(srtmp); break;
+ case CSR: sblock = new SparseBlockCSR(srtmp); break;
+ case COO: sblock = new SparseBlockCOO(srtmp); break;
}
//prepare summary statistics nnz