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 <[email protected]>
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

Reply via email to