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