You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@systemds.apache.org by ba...@apache.org on 2021/12/13 16:30:48 UTC
[systemds] 01/03: [SYSTEMDS-3247] BinaryCell colVector and rowVector extensions
This is an automated email from the ASF dual-hosted git repository.
baunsgaard pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/systemds.git
commit f30dc391ef76aae7455d24d1f5f78732a58f7fee
Author: baunsgaard <ba...@tugraz.at>
AuthorDate: Mon Dec 13 17:15:27 2021 +0100
[SYSTEMDS-3247] BinaryCell colVector and rowVector extensions
This commit adds the primitives for colVector and rowVector binary
cell operations. This is added to support:
y = v / m
currently we support:
y = m / v
---
.../runtime/matrix/data/LibMatrixBincell.java | 55 +++++++++++++++++++++-
1 file changed, 53 insertions(+), 2 deletions(-)
diff --git a/src/main/java/org/apache/sysds/runtime/matrix/data/LibMatrixBincell.java b/src/main/java/org/apache/sysds/runtime/matrix/data/LibMatrixBincell.java
index f949c6c..4651165 100644
--- a/src/main/java/org/apache/sysds/runtime/matrix/data/LibMatrixBincell.java
+++ b/src/main/java/org/apache/sysds/runtime/matrix/data/LibMatrixBincell.java
@@ -78,11 +78,15 @@ public class LibMatrixBincell {
MATRIX_MATRIX,
MATRIX_COL_VECTOR,
MATRIX_ROW_VECTOR,
+ COL_VECTOR_MATRIX,
+ ROW_VECTOR_MATRIX,
OUTER_VECTOR_VECTOR,
INVALID;
public boolean isMatrixVector() {
return this == MATRIX_COL_VECTOR
- || this == MATRIX_ROW_VECTOR;
+ || this == MATRIX_ROW_VECTOR
+ || this == COL_VECTOR_MATRIX
+ || this == ROW_VECTOR_MATRIX;
}
}
@@ -357,6 +361,32 @@ public class LibMatrixBincell {
return BinaryAccessType.INVALID;
}
+ public static BinaryAccessType getBinaryAccessTypeExtended(MatrixBlock m1, MatrixBlock m2) {
+ final int rlen1 = m1.rlen;
+ final int rlen2 = m2.rlen;
+ final int clen1 = m1.clen;
+ final int clen2 = m2.clen;
+
+ if(rlen1 == rlen2) {
+ if(clen1 == clen2)
+ return BinaryAccessType.MATRIX_MATRIX;
+ else if(clen1 < clen2)
+ return BinaryAccessType.COL_VECTOR_MATRIX;
+ else
+ return BinaryAccessType.MATRIX_COL_VECTOR;
+ }
+ else if(clen1 == clen2) {
+ if(rlen1 < rlen2)
+ return BinaryAccessType.ROW_VECTOR_MATRIX;
+ else
+ return BinaryAccessType.MATRIX_ROW_VECTOR;
+ }
+ else if(clen1 == 1 && rlen2 == 1)
+ return BinaryAccessType.OUTER_VECTOR_VECTOR;
+ else
+ return BinaryAccessType.INVALID;
+ }
+
public static void isValidDimensionsBinary(MatrixBlock m1, MatrixBlock m2)
{
final int rlen1 = m1.rlen;
@@ -369,7 +399,7 @@ public class LibMatrixBincell {
//2) MV operations w/ V either being a right-hand-side column or row vector
// (where one dimension needs to match and the other dimension is 1)
//3) VV outer vector operations w/ a common dimension of 1
- boolean isValid = ( (rlen1 == rlen2 && clen1==clen2) //MM
+ boolean isValid = ( (rlen1 == rlen2 && clen1==clen2) //MM
|| (rlen1 == rlen2 && clen1 > 1 && clen2 == 1) //MVc
|| (clen1 == clen2 && rlen1 > 1 && rlen2 == 1) //MVr
|| (clen1 == 1 && rlen2 == 1 ) ); //VV
@@ -380,6 +410,27 @@ public class LibMatrixBincell {
}
}
+ public static void isValidDimensionsBinaryExtended(MatrixBlock m1, MatrixBlock m2) {
+ final int rlen1 = m1.rlen;
+ final int clen1 = m1.clen;
+ final int rlen2 = m2.rlen;
+ final int clen2 = m2.clen;
+
+ // Added extra 2 options
+ // 2a) VM operations with V either being a left-hand-side column or row vector.
+ boolean isValid = ((rlen1 == rlen2 && clen1 == clen2) // MM
+ || (rlen1 == rlen2 && clen1 > 1 && clen2 == 1) // MVc
+ || (rlen1 == rlen2 && clen1 == 1 && clen2 > 1) // VMc
+ || (clen1 == clen2 && rlen1 > 1 && rlen2 == 1) // MVr
+ || (clen1 == clen2 && rlen1 == 1 && rlen2 > 1) // VMr
+ || (clen1 == 1 && rlen2 == 1)); // VV
+
+ if(!isValid) {
+ throw new RuntimeException("Block sizes are not matched for binary " + "cell operations: " + rlen1 + "x"
+ + clen1 + " vs " + rlen2 + "x" + clen2);
+ }
+ }
+
public static boolean isSparseSafeDivide(BinaryOperator op, MatrixBlock rhs)
{
//if rhs is fully dense, there cannot be a /0 and hence DIV becomes sparse safe