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
The following commit(s) were added to refs/heads/main by this push:
new b751389358 [SYSTEMDS-3827] CLA MultiCBind
b751389358 is described below
commit b751389358a65e7c4820c74706c6a04b85d7c8dd
Author: Sebastian Baunsgaard <[email protected]>
AuthorDate: Mon Feb 3 13:44:04 2025 +0100
[SYSTEMDS-3827] CLA MultiCBind
This commit adds specialized support for n way cbind in compressed space.
Closes #2208
---
.../runtime/compress/CompressedMatrixBlock.java | 6 +-
.../runtime/compress/colgroup/ColGroupConst.java | 9 +-
.../runtime/compress/colgroup/ColGroupSDCFOR.java | 22 +---
.../lib/{CLALibAppend.java => CLALibCBind.java} | 144 ++++++++++++++++++---
.../instructions/cp/MatrixAppendCPInstruction.java | 7 +-
.../sysds/runtime/matrix/data/MatrixBlock.java | 25 +++-
.../component/compress/CompressedCustomTests.java | 7 +
.../component/compress/CompressedTestBase.java | 93 ++++++++++++-
8 files changed, 263 insertions(+), 50 deletions(-)
diff --git
a/src/main/java/org/apache/sysds/runtime/compress/CompressedMatrixBlock.java
b/src/main/java/org/apache/sysds/runtime/compress/CompressedMatrixBlock.java
index 75eadc0033..a05c076b36 100644
--- a/src/main/java/org/apache/sysds/runtime/compress/CompressedMatrixBlock.java
+++ b/src/main/java/org/apache/sysds/runtime/compress/CompressedMatrixBlock.java
@@ -50,8 +50,8 @@ import
org.apache.sysds.runtime.compress.colgroup.ColGroupEmpty;
import org.apache.sysds.runtime.compress.colgroup.ColGroupIO;
import org.apache.sysds.runtime.compress.colgroup.ColGroupUncompressed;
import org.apache.sysds.runtime.compress.colgroup.dictionary.IDictionary;
-import org.apache.sysds.runtime.compress.lib.CLALibAppend;
import org.apache.sysds.runtime.compress.lib.CLALibBinaryCellOp;
+import org.apache.sysds.runtime.compress.lib.CLALibCBind;
import org.apache.sysds.runtime.compress.lib.CLALibCMOps;
import org.apache.sysds.runtime.compress.lib.CLALibCompAgg;
import org.apache.sysds.runtime.compress.lib.CLALibDecompress;
@@ -556,8 +556,8 @@ public class CompressedMatrixBlock extends MatrixBlock {
@Override
public MatrixBlock append(MatrixBlock[] that, MatrixBlock ret, boolean
cbind) {
- if(cbind && that.length == 1)
- return CLALibAppend.append(this, that[0],
InfrastructureAnalyzer.getLocalParallelism());
+ if(cbind)
+ return CLALibCBind.cbind(this, that,
InfrastructureAnalyzer.getLocalParallelism());
else {
MatrixBlock left = getUncompressed("append list or
r-bind not supported in compressed");
MatrixBlock[] thatUC = new MatrixBlock[that.length];
diff --git
a/src/main/java/org/apache/sysds/runtime/compress/colgroup/ColGroupConst.java
b/src/main/java/org/apache/sysds/runtime/compress/colgroup/ColGroupConst.java
index d3ca10445c..a493b14f04 100644
---
a/src/main/java/org/apache/sysds/runtime/compress/colgroup/ColGroupConst.java
+++
b/src/main/java/org/apache/sysds/runtime/compress/colgroup/ColGroupConst.java
@@ -655,7 +655,7 @@ public class ColGroupConst extends ADictBasedColGroup
implements IContainDefault
public double getSparsity() {
return 1.0;
}
-
+
@Override
protected void sparseSelection(MatrixBlock selection, P[] points,
MatrixBlock ret, int rl, int ru) {
throw new NotImplementedException();
@@ -710,12 +710,10 @@ public class ColGroupConst extends ADictBasedColGroup
implements IContainDefault
public AColGroup combineWithSameIndex(int nRow, int nCol, AColGroup
right) {
if(!(right instanceof ColGroupConst))
return super.combineWithSameIndex(nRow, nCol, right);
-
final IColIndex combIndex =
_colIndexes.combine(right.getColIndices().shift(nCol));
final IDictionary b = ((ColGroupConst) right).getDictionary();
final IDictionary combined =
DictionaryFactory.cBindDictionaries(_dict, b, this.getNumCols(),
right.getNumCols());
return create(combIndex, combined);
-
}
@Override
@@ -737,10 +735,11 @@ public class ColGroupConst extends ADictBasedColGroup
implements IContainDefault
for(int i = 0; i < right.size(); i++) {
AColGroup g = right.get(i);
- if(!(g instanceof ColGroupConst) || !(g instanceof
ColGroupEmpty)) {
+ if(!(g instanceof ColGroupConst) && !(g instanceof
ColGroupEmpty)) {
return super.combineWithSameIndex(nRow, nCol,
right);
}
}
+
IColIndex combinedIndex = _colIndexes;
int i = 0;
for(AColGroup g : right) {
@@ -751,7 +750,7 @@ public class ColGroupConst extends ADictBasedColGroup
implements IContainDefault
return create(combinedIndex, combined);
}
-
+
@Override
protected boolean allowShallowIdentityRightMult() {
return true;
diff --git
a/src/main/java/org/apache/sysds/runtime/compress/colgroup/ColGroupSDCFOR.java
b/src/main/java/org/apache/sysds/runtime/compress/colgroup/ColGroupSDCFOR.java
index de14c293df..4c4b2e20a5 100644
---
a/src/main/java/org/apache/sysds/runtime/compress/colgroup/ColGroupSDCFOR.java
+++
b/src/main/java/org/apache/sysds/runtime/compress/colgroup/ColGroupSDCFOR.java
@@ -549,25 +549,12 @@ public class ColGroupSDCFOR extends ASDC implements
IMapToDataGroup, IFrameOfRef
final IColIndex combinedColIndex = combineColIndexes(nCol,
right);
final double[] combinedDefaultTuple =
IContainDefaultTuple.combineDefaultTuples(_reference, right);
- // return new ColGroupDDC(combinedColIndex, combined, _data,
getCachedCounts());
- return new ColGroupSDC(combinedColIndex, this.getNumRows(),
combined, combinedDefaultTuple, _indexes, _data,
- getCachedCounts());
+ return new ColGroupSDCFOR(combinedColIndex, this.getNumRows(),
combined, _indexes, _data, getCachedCounts(),
+ combinedDefaultTuple);
}
@Override
public AColGroupCompressed combineWithSameIndex(int nRow, int nCol,
AColGroup right) {
- // if(right instanceof ColGroupSDCZeros){
- // ColGroupSDCZeros rightSDC = ((ColGroupSDCZeros) right);
- // IDictionary b = rightSDC.getDictionary();
- // IDictionary combined =
DictionaryFactory.cBindDictionaries(_dict, b, this.getNumCols(),
right.getNumCols());
- // IColIndex combinedColIndex =
_colIndexes.combine(right.getColIndices().shift(nCol));
- // double[] combinedDefaultTuple = new double[_reference.length
+ right.getNumCols()];
- // System.arraycopy(_reference, 0, combinedDefaultTuple, 0,
_reference.length);
-
- // return new ColGroupSDC(combinedColIndex, this.getNumRows(),
combined, combinedDefaultTuple, _indexes, _data,
- // getCachedCounts());
- // }
- // else{
ColGroupSDCFOR rightSDC = ((ColGroupSDCFOR) right);
IDictionary b = rightSDC.getDictionary();
IDictionary combined =
DictionaryFactory.cBindDictionaries(_dict, b, this.getNumCols(),
right.getNumCols());
@@ -576,9 +563,8 @@ public class ColGroupSDCFOR extends ASDC implements
IMapToDataGroup, IFrameOfRef
System.arraycopy(_reference, 0, combinedDefaultTuple, 0,
_reference.length);
System.arraycopy(rightSDC._reference, 0, combinedDefaultTuple,
_reference.length, rightSDC._reference.length);
- return new ColGroupSDC(combinedColIndex, this.getNumRows(),
combined, combinedDefaultTuple, _indexes, _data,
- getCachedCounts());
- // }
+ return new ColGroupSDCFOR(combinedColIndex, this.getNumRows(),
combined, _indexes, _data, getCachedCounts(),
+ combinedDefaultTuple);
}
@Override
diff --git
a/src/main/java/org/apache/sysds/runtime/compress/lib/CLALibAppend.java
b/src/main/java/org/apache/sysds/runtime/compress/lib/CLALibCBind.java
similarity index 56%
rename from
src/main/java/org/apache/sysds/runtime/compress/lib/CLALibAppend.java
rename to src/main/java/org/apache/sysds/runtime/compress/lib/CLALibCBind.java
index cedf98494c..49533e4bcc 100644
--- a/src/main/java/org/apache/sysds/runtime/compress/lib/CLALibAppend.java
+++ b/src/main/java/org/apache/sysds/runtime/compress/lib/CLALibCBind.java
@@ -21,27 +21,60 @@ package org.apache.sysds.runtime.compress.lib;
import java.util.ArrayList;
import java.util.List;
+import java.util.concurrent.ExecutionException;
+import java.util.concurrent.ExecutorService;
+import java.util.concurrent.Future;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.apache.sysds.runtime.compress.CompressedMatrixBlock;
import org.apache.sysds.runtime.compress.CompressedMatrixBlockFactory;
+import org.apache.sysds.runtime.compress.DMLCompressionException;
import org.apache.sysds.runtime.compress.colgroup.AColGroup;
import org.apache.sysds.runtime.compress.colgroup.ColGroupEmpty;
import org.apache.sysds.runtime.compress.colgroup.ColGroupUncompressed;
import org.apache.sysds.runtime.compress.colgroup.indexes.ColIndexFactory;
import org.apache.sysds.runtime.compress.colgroup.indexes.IColIndex;
import org.apache.sysds.runtime.matrix.data.MatrixBlock;
+import org.apache.sysds.runtime.util.CommonThreadPool;
-public final class CLALibAppend {
+public final class CLALibCBind {
- private CLALibAppend(){
+ private CLALibCBind() {
// private constructor.
}
- private static final Log LOG =
LogFactory.getLog(CLALibAppend.class.getName());
+ private static final Log LOG =
LogFactory.getLog(CLALibCBind.class.getName());
- public static MatrixBlock append(MatrixBlock left, MatrixBlock right,
int k) {
+ public static MatrixBlock cbind(MatrixBlock left, MatrixBlock[] right,
int k) {
+ try {
+
+ if(right.length == 1) {
+ return cbind(left, right[0], k);
+ }
+ else {
+ boolean allCompressed = true;
+ for(int i = 0; i < right.length &&
allCompressed; i++)
+ allCompressed = right[i] instanceof
CompressedMatrixBlock;
+ if(allCompressed)
+ return
cbindAllCompressed((CompressedMatrixBlock) left, right, k);
+ else
+ return cbindAllNormalCompressed(left,
right, k);
+ }
+ }
+ catch(Exception e) {
+ throw new DMLCompressionException("Failed to Cbind with
compressed input", e);
+ }
+ }
+
+ private static MatrixBlock cbindAllNormalCompressed(MatrixBlock left,
MatrixBlock[] right, int k) {
+ for(int i = 0; i < right.length; i++) {
+ left = cbind(left, right[i], k);
+ }
+ return left;
+ }
+
+ public static MatrixBlock cbind(MatrixBlock left, MatrixBlock right,
int k) {
final int m = left.getNumRows();
final int n = left.getNumColumns() + right.getNumColumns();
@@ -66,6 +99,9 @@ public final class CLALibAppend {
final double spar = (left.getNonZeros() +
right.getNonZeros()) / ((double) m * n);
final double estSizeUncompressed =
MatrixBlock.estimateSizeInMemory(m, n, spar);
final double estSizeCompressed = left.getInMemorySize()
+ right.getInMemorySize();
+ // if(isAligned((CompressedMatrixBlock) left,
(CompressedMatrixBlock) right))
+ // return combineCompressed((CompressedMatrixBlock)
left, (CompressedMatrixBlock) right);
+ // else
if(estSizeUncompressed < estSizeCompressed)
return uc(left).append(uc(right), null);
else if(left instanceof CompressedMatrixBlock)
@@ -73,8 +109,86 @@ public final class CLALibAppend {
else
return appendLeftUncompressed(left,
(CompressedMatrixBlock) right, m, n);
}
+ if(isAligned((CompressedMatrixBlock) left,
(CompressedMatrixBlock) right))
+ return combineCompressed((CompressedMatrixBlock) left,
(CompressedMatrixBlock) right);
+ else
+ return append((CompressedMatrixBlock) left,
(CompressedMatrixBlock) right, m, n);
+ }
+
+ private static MatrixBlock cbindAllCompressed(CompressedMatrixBlock
left, MatrixBlock[] right, int k)
+ throws InterruptedException, ExecutionException {
+
+ final int nCol = left.getNumColumns();
+ for(int i = 0; i < right.length; i++) {
+ CompressedMatrixBlock rightCM =
((CompressedMatrixBlock) right[i]);
+ if(nCol != right[i].getNumColumns() || !isAligned(left,
rightCM))
+ return cbindAllNormalCompressed(left, right, k);
+ }
+ return cbindAllCompressedAligned(left, right, k);
+
+ }
+
+ private static boolean isAligned(CompressedMatrixBlock left,
CompressedMatrixBlock right) {
+ final List<AColGroup> gl = left.getColGroups();
+ for(int j = 0; j < gl.size(); j++) {
+ final AColGroup glj = gl.get(j);
+ final int aColumnInGroup = glj.getColIndices().get(0);
+ final AColGroup grj =
right.getColGroupForColumn(aColumnInGroup);
+
+ if(!glj.sameIndexStructure(grj) || glj.getNumCols() !=
grj.getNumCols())
+ return false;
+
+ }
+ return true;
+ }
+
+ private static CompressedMatrixBlock
combineCompressed(CompressedMatrixBlock left, CompressedMatrixBlock right) {
+ final List<AColGroup> gl = left.getColGroups();
+ final List<AColGroup> retCG = new ArrayList<>(gl.size());
+ for(int j = 0; j < gl.size(); j++) {
+ AColGroup glj = gl.get(j);
+ int aColumnInGroup = glj.getColIndices().get(0);
+ AColGroup grj =
right.getColGroupForColumn(aColumnInGroup);
+ // parallel combine...
+ retCG.add(glj.combineWithSameIndex(left.getNumRows(),
left.getNumColumns(), grj));
+ }
+ return new CompressedMatrixBlock(left.getNumRows(),
left.getNumColumns() + right.getNumColumns(),
+ left.getNonZeros() + right.getNonZeros(), false, retCG);
+ }
+
+ private static CompressedMatrixBlock
cbindAllCompressedAligned(CompressedMatrixBlock left, MatrixBlock[] right,
+ final int k) throws InterruptedException, ExecutionException {
+
+ final ExecutorService pool = CommonThreadPool.get(k);
+ try {
+ final List<AColGroup> gl = left.getColGroups();
+ final List<Future<AColGroup>> tasks = new ArrayList<>();
+ final int nCol = left.getNumColumns();
+ final int nRow = left.getNumRows();
+ for(int i = 0; i < gl.size(); i++) {
+ final AColGroup gli = gl.get(i);
+ tasks.add(pool.submit(() -> {
+ List<AColGroup> combines = new
ArrayList<>();
+ final int cId =
gli.getColIndices().get(0);
+ for(int j = 0; j < right.length; j++) {
+
combines.add(((CompressedMatrixBlock) right[j]).getColGroupForColumn(cId));
+ }
+ return gli.combineWithSameIndex(nRow,
nCol, combines);
+ }));
+ }
+
+ final List<AColGroup> retCG = new
ArrayList<>(gl.size());
+ for(Future<AColGroup> t : tasks)
+ retCG.add(t.get());
+
+ int totalCol = nCol + right.length * nCol;
+
+ return new CompressedMatrixBlock(left.getNumRows(),
totalCol, -1, false, retCG);
+ }
+ finally {
+ pool.shutdown();
+ }
- return append((CompressedMatrixBlock) left,
(CompressedMatrixBlock) right, m, n);
}
private static MatrixBlock appendLeftUncompressed(MatrixBlock left,
CompressedMatrixBlock right, final int m,
@@ -123,17 +237,17 @@ public final class CLALibAppend {
ret.setNonZeros(left.getNonZeros() + right.getNonZeros());
ret.setOverlapping(left.isOverlapping() ||
right.isOverlapping());
- final double compressedSize = ret.getInMemorySize();
- final double uncompressedSize =
MatrixBlock.estimateSizeInMemory(m, n, ret.getSparsity());
+ // final double compressedSize = ret.getInMemorySize();
+ // final double uncompressedSize =
MatrixBlock.estimateSizeInMemory(m, n, ret.getSparsity());
- if(compressedSize < uncompressedSize)
- return ret;
- else {
- final double ratio = uncompressedSize / compressedSize;
- String message = String.format("Decompressing c bind
matrix because it had to small compression ratio: %2.3f",
- ratio);
- return ret.getUncompressed(message);
- }
+ // if(compressedSize < uncompressedSize)
+ return ret;
+ // else {
+ // final double ratio = uncompressedSize / compressedSize;
+ // String message = String.format("Decompressing c bind matrix
because it had to small compression ratio: %2.3f",
+ // ratio);
+ // return ret.getUncompressed(message);
+ // }
}
private static MatrixBlock appendRightEmpty(CompressedMatrixBlock left,
MatrixBlock right, int m, int n) {
diff --git
a/src/main/java/org/apache/sysds/runtime/instructions/cp/MatrixAppendCPInstruction.java
b/src/main/java/org/apache/sysds/runtime/instructions/cp/MatrixAppendCPInstruction.java
index 9027d4514a..1b151e0832 100644
---
a/src/main/java/org/apache/sysds/runtime/instructions/cp/MatrixAppendCPInstruction.java
+++
b/src/main/java/org/apache/sysds/runtime/instructions/cp/MatrixAppendCPInstruction.java
@@ -22,7 +22,7 @@ package org.apache.sysds.runtime.instructions.cp;
import org.apache.commons.lang3.tuple.Pair;
import org.apache.sysds.runtime.DMLRuntimeException;
import org.apache.sysds.runtime.compress.CompressedMatrixBlock;
-import org.apache.sysds.runtime.compress.lib.CLALibAppend;
+import org.apache.sysds.runtime.compress.lib.CLALibCBind;
import org.apache.sysds.runtime.controlprogram.context.ExecutionContext;
import org.apache.sysds.runtime.lineage.LineageItem;
import org.apache.sysds.runtime.lineage.LineageItemUtils;
@@ -46,8 +46,9 @@ public final class MatrixAppendCPInstruction extends
AppendCPInstruction {
validateInput(matBlock1, matBlock2);
MatrixBlock ret;
- if(matBlock1 instanceof CompressedMatrixBlock || matBlock2
instanceof CompressedMatrixBlock)
- ret = CLALibAppend.append(matBlock1, matBlock2,
InfrastructureAnalyzer.getLocalParallelism());
+ if(_type == AppendType.CBIND &&
+ (matBlock1 instanceof CompressedMatrixBlock ||
matBlock2 instanceof CompressedMatrixBlock))
+ ret = CLALibCBind.cbind(matBlock1, matBlock2,
InfrastructureAnalyzer.getLocalParallelism());
else
ret = matBlock1.append(matBlock2, new MatrixBlock(),
_type == AppendType.CBIND);
diff --git
a/src/main/java/org/apache/sysds/runtime/matrix/data/MatrixBlock.java
b/src/main/java/org/apache/sysds/runtime/matrix/data/MatrixBlock.java
index 43610820fa..c9086778f0 100644
--- a/src/main/java/org/apache/sysds/runtime/matrix/data/MatrixBlock.java
+++ b/src/main/java/org/apache/sysds/runtime/matrix/data/MatrixBlock.java
@@ -56,6 +56,7 @@ import org.apache.sysds.runtime.DMLRuntimeException;
import org.apache.sysds.runtime.compress.CompressedMatrixBlock;
import org.apache.sysds.runtime.compress.DMLCompressionException;
import org.apache.sysds.runtime.compress.lib.CLALibAggTernaryOp;
+import org.apache.sysds.runtime.compress.lib.CLALibCBind;
import org.apache.sysds.runtime.compress.lib.CLALibMerge;
import org.apache.sysds.runtime.compress.lib.CLALibTernaryOp;
import org.apache.sysds.runtime.controlprogram.caching.CacheBlock;
@@ -3654,10 +3655,19 @@ public class MatrixBlock extends MatrixValue implements
CacheBlock<MatrixBlock>,
return append(that, ret, true); //default cbind
}
- public static MatrixBlock append(List<MatrixBlock> that,MatrixBlock
ret, boolean cbind, int k ){
- MatrixBlock[] th = new MatrixBlock[that.size() -1];
- for(int i = 0; i < that.size() -1; i++)
- th[i] = that.get(i+1);
+ /**
+ * Append that list of matrixblocks to this.
+ *
+ * @param that That list.
+ * @param ret The output block
+ * @param cbind If the blocks a appended cbind
+ * @param k the parallelization degree
+ * @return the appended matrix.
+ */
+ public static MatrixBlock append(List<MatrixBlock> that, MatrixBlock
ret, boolean cbind, int k) {
+ MatrixBlock[] th = new MatrixBlock[that.size() - 1];
+ for(int i = 0; i < that.size() - 1; i++)
+ th[i] = that.get(i + 1);
return that.get(0).append(th, ret, cbind);
}
@@ -3716,6 +3726,13 @@ public class MatrixBlock extends MatrixValue implements
CacheBlock<MatrixBlock>,
public MatrixBlock append(MatrixBlock[] that, MatrixBlock result,
boolean cbind) {
checkDimensionsForAppend(that, cbind);
+ for(int k = 0; k < that.length; k++)
+ if( that[k] instanceof CompressedMatrixBlock){
+ if(that.length == 1 && cbind)
+ return CLALibCBind.cbind(this, that[0],
1);
+ that[k] =
CompressedMatrixBlock.getUncompressed(that[k], "Append N");
+ }
+
final int m = cbind ? rlen : combinedRows(that);
final int n = cbind ? combinedCols(that) : clen;
final long nnz = calculateCombinedNNz(that);
diff --git
a/src/test/java/org/apache/sysds/test/component/compress/CompressedCustomTests.java
b/src/test/java/org/apache/sysds/test/component/compress/CompressedCustomTests.java
index 13ccb8924c..32d62fb16c 100644
---
a/src/test/java/org/apache/sysds/test/component/compress/CompressedCustomTests.java
+++
b/src/test/java/org/apache/sysds/test/component/compress/CompressedCustomTests.java
@@ -37,6 +37,7 @@ import org.apache.sysds.runtime.compress.cost.ACostEstimate;
import org.apache.sysds.runtime.compress.cost.CostEstimatorBuilder;
import org.apache.sysds.runtime.compress.cost.CostEstimatorFactory;
import org.apache.sysds.runtime.compress.cost.InstructionTypeCounter;
+import org.apache.sysds.runtime.compress.lib.CLALibCBind;
import org.apache.sysds.runtime.compress.workload.WTreeRoot;
import org.apache.sysds.runtime.matrix.data.MatrixBlock;
import org.apache.sysds.test.TestUtils;
@@ -395,4 +396,10 @@ public class CompressedCustomTests {
MatrixBlock m2 =
CompressedMatrixBlockFactory.compress(m1).getLeft();
TestUtils.compareMatricesBitAvgDistance(m1, m2, 0, 0, "no");
}
+
+
+ @Test(expected = Exception.class)
+ public void cbindWithError(){
+ CLALibCBind.cbind(null, new MatrixBlock[]{null}, 0);
+ }
}
diff --git
a/src/test/java/org/apache/sysds/test/component/compress/CompressedTestBase.java
b/src/test/java/org/apache/sysds/test/component/compress/CompressedTestBase.java
index de968a483f..507a2fc663 100644
---
a/src/test/java/org/apache/sysds/test/component/compress/CompressedTestBase.java
+++
b/src/test/java/org/apache/sysds/test/component/compress/CompressedTestBase.java
@@ -19,6 +19,7 @@
package org.apache.sysds.test.component.compress;
+import static org.junit.Assert.assertTrue;
import static org.junit.Assert.fail;
import java.util.ArrayList;
@@ -58,7 +59,7 @@ import
org.apache.sysds.runtime.compress.cost.InstructionTypeCounter;
import org.apache.sysds.runtime.compress.estim.ComEstFactory;
import org.apache.sysds.runtime.compress.estim.CompressedSizeInfo;
import org.apache.sysds.runtime.compress.estim.CompressedSizeInfoColGroup;
-import org.apache.sysds.runtime.compress.lib.CLALibAppend;
+import org.apache.sysds.runtime.compress.lib.CLALibCBind;
import org.apache.sysds.runtime.functionobjects.Builtin;
import org.apache.sysds.runtime.functionobjects.Builtin.BuiltinCode;
import org.apache.sysds.runtime.functionobjects.Divide;
@@ -255,7 +256,7 @@ public abstract class CompressedTestBase extends TestBase {
case C_BIND_SELF:
if(cmb instanceof
CompressedMatrixBlock) {
CompressedMatrixBlock cmbc =
(CompressedMatrixBlock) cmb;
- cmb = CLALibAppend.append(cmbc,
cmbc, _k);
+ cmb = CLALibCBind.cbind(cmbc,
cmbc, _k);
mb = mb.append(mb, new
MatrixBlock());
cols *= 2;
}
@@ -1078,6 +1079,45 @@ public abstract class CompressedTestBase extends
TestBase {
compareResultMatrices(ret1, ret2, 1);
}
+ @Test
+ public void appendMultiple() {
+ try {
+
+ if(!(cmb instanceof CompressedMatrixBlock))
+ return;
+ if(vectorRows == null)
+ vectorRows =
CompressibleInputGenerator.getInput(rows, 1, CompressionType.OLE, 5, 5, -5,
1.0, 3);
+ MatrixBlock ap =
CompressedMatrixBlockFactory.compress(vectorRows).getLeft();
+ MatrixBlock ret1 = mb.append(new MatrixBlock[] {ap,
ap}, new MatrixBlock(), true);
+ MatrixBlock ret2 = cmb.append(new MatrixBlock[] {ap,
ap}, new MatrixBlock(), true);
+ compareResultMatrices(ret1, ret2, 1);
+ }
+ catch(Exception e) {
+ e.printStackTrace();
+ fail(e.getMessage());
+ }
+ }
+
+ @Test
+ public void appendMultipleNotAllCompressed() {
+ try {
+
+ if(!(cmb instanceof CompressedMatrixBlock))
+ return;
+ if(vectorRows == null)
+ vectorRows =
CompressibleInputGenerator.getInput(rows, 1, CompressionType.OLE, 5, 5, -5,
1.0, 3);
+ MatrixBlock ap = vectorRows;
+ MatrixBlock apc =
CompressedMatrixBlockFactory.compress(vectorRows).getLeft();
+ MatrixBlock ret1 = mb.append(new MatrixBlock[] {ap,
apc}, new MatrixBlock(), true);
+ MatrixBlock ret2 = cmb.append(new MatrixBlock[] {ap,
apc}, new MatrixBlock(), true);
+ compareResultMatrices(ret1, ret2, 1);
+ }
+ catch(Exception e) {
+ e.printStackTrace();
+ fail(e.getMessage());
+ }
+ }
+
@Test
public void appendCBindTrue() {
if(!(cmb instanceof CompressedMatrixBlock) || rows * cols >
10000)
@@ -1088,6 +1128,55 @@ public abstract class CompressedTestBase extends
TestBase {
compareResultMatrices(ret1, ret2, 1);
}
+ @Test
+ public void appendCBindTrueEmpty() {
+ if(!(cmb instanceof CompressedMatrixBlock) || rows * cols >
10000)
+ return;
+ MatrixBlock ap = new MatrixBlock(mb.getNumRows(), 1, 0.0);
+ assertTrue(ap.isEmpty());
+ MatrixBlock ret1 = mb.append(ap, new MatrixBlock(), true);
+ MatrixBlock ret2 = cmb.append(ap, new MatrixBlock(), true);
+ compareResultMatrices(ret1, ret2, 1);
+ }
+
+ @Test
+ public void appendCBindTrueEmptyInverse() {
+ if(!(cmb instanceof CompressedMatrixBlock) || rows * cols >
10000)
+ return;
+ MatrixBlock ap = new MatrixBlock(mb.getNumRows(), 1, 0.0);
+ assertTrue(ap.isEmpty());
+ MatrixBlock ret1 = ap.append(mb, new MatrixBlock(), true);
+ MatrixBlock ret2 = ap.append(cmb, new MatrixBlock(), true);
+ compareResultMatrices(ret1, ret2, 1);
+ }
+
+ @Test
+ public void appendCBindTrueConstInverse() {
+ if(!(cmb instanceof CompressedMatrixBlock) || rows * cols >
10000)
+ return;
+ MatrixBlock ap = new MatrixBlock(mb.getNumRows(), 1, 2.0);
+ assertTrue(!ap.isEmpty());
+ MatrixBlock ret1 = ap.append(mb, new MatrixBlock(), true);
+ MatrixBlock ret2 = ap.append(cmb, new MatrixBlock(), true);
+ compareResultMatrices(ret1, ret2, 1);
+ }
+
+ @Test
+ public void appendCBindAlignedSelfMultiple() {
+ try {
+
+ if(!(cmb instanceof CompressedMatrixBlock) || rows *
cols > 10000)
+ return;
+ MatrixBlock ret1 = mb.append(new MatrixBlock[] {mb,
mb}, new MatrixBlock(), true);
+ MatrixBlock ret2 = cmb.append(new MatrixBlock[] {cmb,
cmb}, new MatrixBlock(), true);
+ compareResultMatrices(ret1, ret2, 1);
+ }
+ catch(AssertionError e) {
+ e.printStackTrace();
+ fail("failed Cbind: " + cmb.toString() );
+ }
+ }
+
@Test
public void appendCBindFalse() {
if(!(cmb instanceof CompressedMatrixBlock) || rows * cols >
10000)