Repository: systemml
Updated Branches:
  refs/heads/master a671883fc -> c3601d419


[SYSTEMML-2068] Codegen support for xor operations

Closes #718.


Project: http://git-wip-us.apache.org/repos/asf/systemml/repo
Commit: http://git-wip-us.apache.org/repos/asf/systemml/commit/c3601d41
Tree: http://git-wip-us.apache.org/repos/asf/systemml/tree/c3601d41
Diff: http://git-wip-us.apache.org/repos/asf/systemml/diff/c3601d41

Branch: refs/heads/master
Commit: c3601d419a47f218af1517eaee66383d820ada86
Parents: a671883
Author: Janardhan Pulivarthi <j...@protonmail.com>
Authored: Sun Feb 4 13:53:00 2018 -0800
Committer: Matthias Boehm <mboe...@gmail.com>
Committed: Sun Feb 4 13:55:19 2018 -0800

----------------------------------------------------------------------
 .../sysml/hops/codegen/cplan/CNodeBinary.java   | 28 ++++--
 .../hops/codegen/template/TemplateRow.java      |  2 +-
 .../runtime/codegen/LibSpoofPrimitives.java     | 95 +++++++++++++++++++-
 .../codegen/CPlanVectorPrimitivesTest.java      | 32 ++++++-
 .../functions/codegen/CellwiseTmplTest.java     | 22 ++++-
 .../functions/codegen/RowAggTmplTest.java       | 21 ++++-
 .../scripts/functions/codegen/cellwisetmpl17.R  | 33 +++++++
 .../functions/codegen/cellwisetmpl17.dml        | 29 ++++++
 .../scripts/functions/codegen/rowAggPattern36.R | 33 +++++++
 .../functions/codegen/rowAggPattern36.dml       | 29 ++++++
 10 files changed, 309 insertions(+), 15 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/systemml/blob/c3601d41/src/main/java/org/apache/sysml/hops/codegen/cplan/CNodeBinary.java
----------------------------------------------------------------------
diff --git a/src/main/java/org/apache/sysml/hops/codegen/cplan/CNodeBinary.java 
b/src/main/java/org/apache/sysml/hops/codegen/cplan/CNodeBinary.java
index d771a84..2f7feb0 100644
--- a/src/main/java/org/apache/sysml/hops/codegen/cplan/CNodeBinary.java
+++ b/src/main/java/org/apache/sysml/hops/codegen/cplan/CNodeBinary.java
@@ -35,22 +35,24 @@ public class CNodeBinary extends CNode
                VECT_POW_ADD, VECT_MIN_ADD, VECT_MAX_ADD,
                VECT_EQUAL_ADD, VECT_NOTEQUAL_ADD, VECT_LESS_ADD, 
                VECT_LESSEQUAL_ADD, VECT_GREATER_ADD, VECT_GREATEREQUAL_ADD,
-               VECT_CBIND_ADD,
+               VECT_CBIND_ADD, VECT_XOR_ADD,
                //vector-scalar operations
                VECT_MULT_SCALAR, VECT_DIV_SCALAR, VECT_MINUS_SCALAR, 
VECT_PLUS_SCALAR,
                VECT_POW_SCALAR, VECT_MIN_SCALAR, VECT_MAX_SCALAR,
                VECT_EQUAL_SCALAR, VECT_NOTEQUAL_SCALAR, VECT_LESS_SCALAR, 
                VECT_LESSEQUAL_SCALAR, VECT_GREATER_SCALAR, 
VECT_GREATEREQUAL_SCALAR,
                VECT_CBIND,
+               VECT_XOR_SCALAR,
                //vector-vector operations
                VECT_MULT, VECT_DIV, VECT_MINUS, VECT_PLUS, VECT_MIN, VECT_MAX, 
VECT_EQUAL, 
                VECT_NOTEQUAL, VECT_LESS, VECT_LESSEQUAL, VECT_GREATER, 
VECT_GREATEREQUAL,
+               VECT_XOR,
                //scalar-scalar operations
                MULT, DIV, PLUS, MINUS, MODULUS, INTDIV, 
                LESS, LESSEQUAL, GREATER, GREATEREQUAL, EQUAL,NOTEQUAL,
-               MIN, MAX, AND, OR, LOG, LOG_NZ, POW,
+               MIN, MAX, AND, OR, XOR, LOG, LOG_NZ, POW,
                MINUS1_MULT, MINUS_NZ;
-               
+
                public static boolean contains(String value) {
                        for( BinType bt : values()  )
                                if( bt.name().equals(value) )
@@ -88,6 +90,7 @@ public class CNodeBinary extends CNode
                                case VECT_MINUS_ADD:
                                case VECT_PLUS_ADD:
                                case VECT_POW_ADD:
+                               case VECT_XOR_ADD:
                                case VECT_MIN_ADD:
                                case VECT_MAX_ADD:      
                                case VECT_EQUAL_ADD:
@@ -112,6 +115,7 @@ public class CNodeBinary extends CNode
                                case VECT_MINUS_SCALAR:
                                case VECT_PLUS_SCALAR:
                                case VECT_POW_SCALAR:
+                               case VECT_XOR_SCALAR:
                                case VECT_MIN_SCALAR:
                                case VECT_MAX_SCALAR:
                                case VECT_EQUAL_SCALAR:
@@ -142,6 +146,7 @@ public class CNodeBinary extends CNode
                                case VECT_DIV:
                                case VECT_MINUS:
                                case VECT_PLUS:
+                               case VECT_XOR:
                                case VECT_MIN:
                                case VECT_MAX:
                                case VECT_EQUAL:
@@ -199,6 +204,8 @@ public class CNodeBinary extends CNode
                                        return "    double %TMP% = 1 - %IN1% * 
%IN2%;\n";
                                case MINUS_NZ:
                                        return "    double %TMP% = (%IN1% != 0) 
? %IN1% - %IN2% : 0;\n";
+                               case XOR:
+                                       return "    double %TMP% = ( (%IN1% != 
0) != (%IN2% != 0) ) ? 1 : 0;\n";
                                        
                                default: 
                                        throw new RuntimeException("Invalid 
binary type: "+this.toString());
@@ -217,7 +224,8 @@ public class CNodeBinary extends CNode
                                || this == VECT_EQUAL_SCALAR || this == 
VECT_NOTEQUAL_SCALAR
                                || this == VECT_LESS_SCALAR || this == 
VECT_LESSEQUAL_SCALAR
                                || this == VECT_GREATER_SCALAR || this == 
VECT_GREATEREQUAL_SCALAR
-                               || this == VECT_CBIND;
+                               || this == VECT_CBIND
+                               || this == VECT_XOR_SCALAR;
                }
                public boolean isVectorVectorPrimitive() {
                        return this == VECT_DIV || this == VECT_MULT 
@@ -225,7 +233,8 @@ public class CNodeBinary extends CNode
                                || this == VECT_MIN || this == VECT_MAX
                                || this == VECT_EQUAL || this == VECT_NOTEQUAL
                                || this == VECT_LESS || this == VECT_LESSEQUAL
-                               || this == VECT_GREATER || this == 
VECT_GREATEREQUAL;
+                               || this == VECT_GREATER || this == 
VECT_GREATEREQUAL
+                               || this == VECT_XOR;
                }
                public boolean isVectorMatrixPrimitive() {
                        return this == VECT_MATRIXMULT
@@ -351,6 +360,7 @@ public class CNodeBinary extends CNode
                        case VECT_DIV_SCALAR:          return "b(vd)";
                        case VECT_MINUS_SCALAR:        return "b(vmi)";
                        case VECT_PLUS_SCALAR:         return "b(vp)";
+                       case VECT_XOR_SCALAR:          return "v(vxor)";
                        case VECT_POW_SCALAR:          return "b(vpow)";
                        case VECT_MIN_SCALAR:          return "b(vmin)";
                        case VECT_MAX_SCALAR:          return "b(vmax)";
@@ -364,6 +374,7 @@ public class CNodeBinary extends CNode
                        case VECT_DIV:                 return "b(v2d)";
                        case VECT_MINUS:               return "b(v2mi)";
                        case VECT_PLUS:                return "b(v2p)";
+                       case VECT_XOR:                 return "b(v2xor)";
                        case VECT_MIN:                 return "b(v2min)";
                        case VECT_MAX:                 return "b(v2max)";
                        case VECT_EQUAL:               return "b(v2eq)";
@@ -388,6 +399,7 @@ public class CNodeBinary extends CNode
                        case NOTEQUAL:                 return "b(!=)";
                        case OR:                       return "b(|)";
                        case AND:                      return "b(&)";
+                       case XOR:                      return "b(xor)";
                        case MINUS1_MULT:              return "b(1-*)";
                        case MINUS_NZ:                 return "b(-nz)";
                        default: return "b("+_type.name().toLowerCase()+")";
@@ -413,6 +425,7 @@ public class CNodeBinary extends CNode
                        case VECT_GREATER_ADD: 
                        case VECT_GREATEREQUAL_ADD:
                        case VECT_CBIND_ADD:
+                       case VECT_XOR_ADD:
                                boolean vectorScalar = 
_inputs.get(1).getDataType()==DataType.SCALAR;
                                _rows = _inputs.get(vectorScalar ? 0 : 1)._rows;
                                _cols = _inputs.get(vectorScalar ? 0 : 1)._cols;
@@ -435,6 +448,7 @@ public class CNodeBinary extends CNode
                        case VECT_MULT_SCALAR:
                        case VECT_MINUS_SCALAR:
                        case VECT_PLUS_SCALAR:
+                       case VECT_XOR_SCALAR:
                        case VECT_POW_SCALAR:
                        case VECT_MIN_SCALAR:
                        case VECT_MAX_SCALAR:
@@ -449,6 +463,7 @@ public class CNodeBinary extends CNode
                        case VECT_MULT:
                        case VECT_MINUS:
                        case VECT_PLUS:
+                       case VECT_XOR:
                        case VECT_MIN:
                        case VECT_MAX:
                        case VECT_EQUAL: 
@@ -491,7 +506,8 @@ public class CNodeBinary extends CNode
                        case MIN: 
                        case MAX: 
                        case AND: 
-                       case OR: 
+                       case OR:
+                       case XOR:
                        case LOG: 
                        case LOG_NZ:
                        case POW: 

http://git-wip-us.apache.org/repos/asf/systemml/blob/c3601d41/src/main/java/org/apache/sysml/hops/codegen/template/TemplateRow.java
----------------------------------------------------------------------
diff --git 
a/src/main/java/org/apache/sysml/hops/codegen/template/TemplateRow.java 
b/src/main/java/org/apache/sysml/hops/codegen/template/TemplateRow.java
index 5bc8f4f..74d7b78 100644
--- a/src/main/java/org/apache/sysml/hops/codegen/template/TemplateRow.java
+++ b/src/main/java/org/apache/sysml/hops/codegen/template/TemplateRow.java
@@ -65,7 +65,7 @@ public class TemplateRow extends TemplateBase
                        OpOp1.SIN, OpOp1.COS, OpOp1.TAN, OpOp1.ASIN, 
OpOp1.ACOS, OpOp1.ATAN, OpOp1.SINH, OpOp1.COSH, OpOp1.TANH,
                        OpOp1.CUMSUM, OpOp1.CUMMIN, OpOp1.CUMMAX};
        private static final Hop.OpOp2[] SUPPORTED_VECT_BINARY = new OpOp2[]{
-                       OpOp2.MULT, OpOp2.DIV, OpOp2.MINUS, OpOp2.PLUS, 
OpOp2.POW, OpOp2.MIN, OpOp2.MAX,
+                       OpOp2.MULT, OpOp2.DIV, OpOp2.MINUS, OpOp2.PLUS, 
OpOp2.POW, OpOp2.MIN, OpOp2.MAX, OpOp2.XOR,
                        OpOp2.EQUAL, OpOp2.NOTEQUAL, OpOp2.LESS, 
OpOp2.LESSEQUAL, OpOp2.GREATER, OpOp2.GREATEREQUAL};
        
        public TemplateRow() {

http://git-wip-us.apache.org/repos/asf/systemml/blob/c3601d41/src/main/java/org/apache/sysml/runtime/codegen/LibSpoofPrimitives.java
----------------------------------------------------------------------
diff --git 
a/src/main/java/org/apache/sysml/runtime/codegen/LibSpoofPrimitives.java 
b/src/main/java/org/apache/sysml/runtime/codegen/LibSpoofPrimitives.java
index 8edb25e..33b18b9 100644
--- a/src/main/java/org/apache/sysml/runtime/codegen/LibSpoofPrimitives.java
+++ b/src/main/java/org/apache/sysml/runtime/codegen/LibSpoofPrimitives.java
@@ -560,9 +560,98 @@ public class LibSpoofPrimitives
                //invariant to the ordering of inputs
                return vectPlusWrite(b, a, bix, bi, ai, blen, len);
        }
-       
+
+       //custom vector xor
+       /**
+        * Computes c = xor(A,B)
+        *
+        * @param a dense input vector A
+        * @param ai start position in A
+        * @param bval scalar value
+        * @param c resultant vector
+        * @param ci index of c
+        * @param len number of processed elements
+        * @return resultant value
+        */
+       public static void vectXorAdd(double[] a, double bval, double[] c, int 
ai, int ci, int len) {
+               for( int j = ai; j < ai+len; j++, ci++)
+                       c[ci] +=  ( (a[j] != 0) != (bval != 0) ) ? 1 : 0;
+       }
+
+       public static void vectXorAdd(double bval, double[] a, double[] c, int 
ai, int ci, int len) {
+               for( int j = ai; j < ai+len; j++, ci++)
+                       c[ci] += ( (bval != 0) != (a[j] != 0) ) ? 1 : 0;
+       }
+
+       public static void vectXorAdd(double[] a, double bval, double[] c, 
int[] aix, int ai, int ci, int alen, int len) {
+               for( int j = ai; j < ai+alen; j++ )
+                       c[ci + aix[j]] += ( (a[j] != 0) != (bval != 0) ) ? 1 : 
0;
+       }
+
+       public static void vectXorAdd(double bval, double[] a, double[] c, 
int[] aix, int ai, int ci, int alen, int len) {
+               for( int j = ai; j < ai+alen; j++ )
+                       c[ci + aix[j]] += ( (bval != 0) != (a[j] != 0) ) ? 1 : 
0;
+       }
+
+       //1. scalar vs. dense vector
+       public static double[] vectXorWrite(double[] a, double bval, int ai, 
int len) {
+               double[] c = allocVector(len, false);
+               for( int j = 0; j < len; j++)
+                       c[j] = ( ( a[ai+j] != 0) != (bval != 0) ) ? 1 : 0;
+               return c;
+       }
+
+       //2. dense vector vs. scalar
+       public static double[] vectXorWrite(double bval, double[] a, int ai, 
int len) {
+               double[] c = allocVector(len, false);
+               for( int j = 0; j < len; j++)
+                       c[j] = ( (bval != 0) != (a[ai + j] != 0) ) ? 1 : 0;
+               return c;
+       }
+
+       //3. dense vector vs. dense vector
+       public static double[] vectXorWrite(double[] a, double[] b, int ai, int 
bi, int len) {
+               double[] c = allocVector(len, false);
+               for( int j = 0; j < len; j++)
+                       c[j] = ( (a[ai + j] != 0) != (b[bi + j] != 0) ) ? 1 : 0;
+               return c;
+       }
+
+       //4. sparse vector vs scalar
+       public static double[] vectXorWrite(double[] a, double bval, int[] aix, 
int ai, int alen, int len) {
+               double init = (bval != 0) ? 1 : 0;
+               double[] c = allocVector(len, true, init);
+               for( int j = ai; j < ai+alen; j++ )
+                       c[aix[j]] = (a[j] != 0) ? 0 : 1;
+               return c;
+       }
+
+       //5. scalar vs. sparse vector
+       public static double[] vectXorWrite(double bval, double[] a, int[] aix, 
int ai, int alen, int len) {
+               double init = (bval != 0) ? 1 : 0;
+               double[] c = allocVector(len, true, init);
+               for( int j = ai; j < ai+alen; j++ )
+                       c[aix[j]] = (a[j] != 0) ? 0 : 1;
+               return c;
+       }
+
+       //6. sparse vector vs. dense vector
+       public static double[] vectXorWrite(double[] a, double[] b, int[] aix, 
int ai, int bi, int alen, int len) {
+               double[] c = allocVector(len, false);
+               for( int j = 0; j < len; j++ )
+                       c[j] = (b[bi+j] != 0) ? 1 : 0;
+               for( int j = ai; j < ai+alen; j++ )
+                       c[aix[j]] = ( ( a[j] != 0) != (c[aix[j]] != 0) )? 1 : 0;
+               return c;
+       }
+
+       //6. sparse vector vs. dense vector
+       public static void vectXorWrite(double[] a, double[] b, int ai, int[] 
aix, int bi, int alen, int len) {
+               vectXorWrite(a, b, aix, ai, bi, alen, len);
+       }
+
        //custom vector pow
-       
+
        public static void vectPowAdd(double[] a, double bval, double[] c, int 
ai, int ci, int len) {
                for( int j = ai; j < ai+len; j++, ci++)
                        c[ci] += Math.pow(a[j], bval);
@@ -1862,7 +1951,7 @@ public class LibSpoofPrimitives
        }
        
        protected static double[] allocVector(int len, boolean reset, double 
resetVal) {
-               VectorBuffer buff = memPool.get(); 
+               VectorBuffer buff = memPool.get();
                
                //find next matching vector in ring buffer or
                //allocate new vector if required

http://git-wip-us.apache.org/repos/asf/systemml/blob/c3601d41/src/test/java/org/apache/sysml/test/integration/functions/codegen/CPlanVectorPrimitivesTest.java
----------------------------------------------------------------------
diff --git 
a/src/test/java/org/apache/sysml/test/integration/functions/codegen/CPlanVectorPrimitivesTest.java
 
b/src/test/java/org/apache/sysml/test/integration/functions/codegen/CPlanVectorPrimitivesTest.java
index c2c4704..d43ffa5 100644
--- 
a/src/test/java/org/apache/sysml/test/integration/functions/codegen/CPlanVectorPrimitivesTest.java
+++ 
b/src/test/java/org/apache/sysml/test/integration/functions/codegen/CPlanVectorPrimitivesTest.java
@@ -644,7 +644,37 @@ public class CPlanVectorPrimitivesTest extends 
AutomatedTestBase
        public void testVectorVectorGreaterEqualSparseDense() {
                testVectorBinaryPrimitive(BinType.VECT_GREATEREQUAL, 
InputType.VECTOR_SPARSE, InputType.VECTOR_DENSE);
        }
-       
+
+       @Test
+       public void testScalarVectorXorDense() {
+               testVectorBinaryPrimitive(BinType.VECT_XOR_SCALAR, 
InputType.SCALAR, InputType.VECTOR_DENSE);
+       }
+
+       @Test
+       public void testVectorScalarXorDense() {
+               testVectorBinaryPrimitive(BinType.VECT_XOR_SCALAR, 
InputType.VECTOR_DENSE, InputType.VECTOR_DENSE);
+       }
+
+       @Test
+       public void testVectorVectorDenseDense() {
+               testVectorBinaryPrimitive(BinType.VECT_XOR, 
InputType.VECTOR_DENSE, InputType.VECTOR_DENSE);
+       }
+
+       @Test
+       public void testVectorScalarSparse() {
+               testVectorBinaryPrimitive(BinType.VECT_XOR_SCALAR, 
InputType.VECTOR_SPARSE, InputType.SCALAR);
+       }
+
+       @Test
+       public void testScalarVectorSparse() {
+               testVectorBinaryPrimitive(BinType.VECT_XOR_SCALAR, 
InputType.SCALAR, InputType.VECTOR_SPARSE);
+       }
+
+       @Test
+       public void testVectorVectorSparseDense() {
+               testVectorBinaryPrimitive(BinType.VECT_XOR, 
InputType.VECTOR_SPARSE, InputType.VECTOR_DENSE);
+       }
+
        @SuppressWarnings("incomplete-switch")
        private static void testVectorAggPrimitive(UnaryType aggtype, InputType 
type1)
        {

http://git-wip-us.apache.org/repos/asf/systemml/blob/c3601d41/src/test/java/org/apache/sysml/test/integration/functions/codegen/CellwiseTmplTest.java
----------------------------------------------------------------------
diff --git 
a/src/test/java/org/apache/sysml/test/integration/functions/codegen/CellwiseTmplTest.java
 
b/src/test/java/org/apache/sysml/test/integration/functions/codegen/CellwiseTmplTest.java
index 701a367..bd3b36a 100644
--- 
a/src/test/java/org/apache/sysml/test/integration/functions/codegen/CellwiseTmplTest.java
+++ 
b/src/test/java/org/apache/sysml/test/integration/functions/codegen/CellwiseTmplTest.java
@@ -51,7 +51,8 @@ public class CellwiseTmplTest extends AutomatedTestBase
        private static final String TEST_NAME13 = TEST_NAME+13; //min(X + 7 * 
Y) large
        private static final String TEST_NAME14 = TEST_NAME+14; //-2 * X + 
t(Y); t(Y) is rowvector
        private static final String TEST_NAME15 = TEST_NAME+15; 
//colMins(2*log(X))
-       private static final String TEST_NAME16 = TEST_NAME+16; 
//colSums(2*log(X)); 
+       private static final String TEST_NAME16 = TEST_NAME+16; 
//colSums(2*log(X));
+       private static final String TEST_NAME17 = TEST_NAME+17; //xor operation
        
        
        private static final String TEST_DIR = "functions/codegen/";
@@ -65,7 +66,7 @@ public class CellwiseTmplTest extends AutomatedTestBase
        @Override
        public void setUp() {
                TestUtils.clearAssertionInformation();
-               for( int i=1; i<=16; i++ ) {
+               for( int i=1; i<=17; i++ ) {
                        addTestConfiguration( TEST_NAME+i, new 
TestConfiguration(
                                        TEST_CLASS_DIR, TEST_NAME+i, new 
String[] {String.valueOf(i)}) );
                }
@@ -287,6 +288,21 @@ public class CellwiseTmplTest extends AutomatedTestBase
        public void testCodegenCellwiseRewrite16_sp() {
                testCodegenIntegration( TEST_NAME16, true, ExecType.SPARK );
        }
+
+       @Test
+       public void testCodegenCellwiseRewrite17() {
+               testCodegenIntegration( TEST_NAME17, true, ExecType.CP );
+       }
+
+       @Test
+       public void testCodegenCellwise17() {
+               testCodegenIntegration( TEST_NAME17, false, ExecType.CP );
+       }
+
+       @Test
+       public void testCodegenCellwiseRewrite17_sp() {
+               testCodegenIntegration( TEST_NAME17, true, ExecType.SPARK );
+       }
        
        
        private void testCodegenIntegration( String testname, boolean rewrites, 
ExecType instType )
@@ -352,6 +368,8 @@ public class CellwiseTmplTest extends AutomatedTestBase
                                
Assert.assertTrue(!heavyHittersContainsSubString("uacmin"));
                        else if( testname.equals(TEST_NAME16) )
                                
Assert.assertTrue(!heavyHittersContainsSubString("uack+"));
+                       else if( testname.equals(TEST_NAME17) )
+                               
Assert.assertTrue(!heavyHittersContainsSubString("xor"));
                }
                finally {
                        rtplatform = platformOld;

http://git-wip-us.apache.org/repos/asf/systemml/blob/c3601d41/src/test/java/org/apache/sysml/test/integration/functions/codegen/RowAggTmplTest.java
----------------------------------------------------------------------
diff --git 
a/src/test/java/org/apache/sysml/test/integration/functions/codegen/RowAggTmplTest.java
 
b/src/test/java/org/apache/sysml/test/integration/functions/codegen/RowAggTmplTest.java
index 6124c77..129178d 100644
--- 
a/src/test/java/org/apache/sysml/test/integration/functions/codegen/RowAggTmplTest.java
+++ 
b/src/test/java/org/apache/sysml/test/integration/functions/codegen/RowAggTmplTest.java
@@ -72,6 +72,7 @@ public class RowAggTmplTest extends AutomatedTestBase
        private static final String TEST_NAME33 = TEST_NAME+"33"; //Kmeans, 
inner loop
        private static final String TEST_NAME34 = TEST_NAME+"34"; //X / 
rowSums(X!=0)
        private static final String TEST_NAME35 = TEST_NAME+"35"; 
//cbind(X/rowSums(X), Y, Z)
+       private static final String TEST_NAME36 = TEST_NAME+"36"; //xor 
operation
        
        private static final String TEST_DIR = "functions/codegen/";
        private static final String TEST_CLASS_DIR = TEST_DIR + 
RowAggTmplTest.class.getSimpleName() + "/";
@@ -83,7 +84,7 @@ public class RowAggTmplTest extends AutomatedTestBase
        @Override
        public void setUp() {
                TestUtils.clearAssertionInformation();
-               for(int i=1; i<=35; i++)
+               for(int i=1; i<=36; i++)
                        addTestConfiguration( TEST_NAME+i, new 
TestConfiguration(TEST_CLASS_DIR, TEST_NAME+i, new String[] { String.valueOf(i) 
}) );
        }
        
@@ -611,7 +612,21 @@ public class RowAggTmplTest extends AutomatedTestBase
        public void testCodegenRowAgg35SP() {
                testCodegenIntegration( TEST_NAME35, false, ExecType.SPARK );
        }
-       
+
+       @Test
+       public void testCodegenRowAggRewrite36CP() {
+               testCodegenIntegration( TEST_NAME36, true, ExecType.CP );
+       }
+
+       @Test
+       public void testCodegenRowAgg36CP() {
+               testCodegenIntegration( TEST_NAME36, false, ExecType.CP );
+       }
+
+       @Test
+       public void testCodegenRowAgg36SP() {
+               testCodegenIntegration( TEST_NAME36, false, ExecType.SPARK );
+       }
        
        private void testCodegenIntegration( String testname, boolean rewrites, 
ExecType instType )
        {
@@ -667,6 +682,8 @@ public class RowAggTmplTest extends AutomatedTestBase
                        if( testname.equals(TEST_NAME35) )
                                
Assert.assertTrue(!heavyHittersContainsSubString("spoofRA", 2)
                                        && 
!heavyHittersContainsSubString("cbind"));
+                       if( testname.equals(TEST_NAME36) )
+                               
Assert.assertTrue(!heavyHittersContainsSubString("xor"));
                }
                finally {
                        rtplatform = platformOld;

http://git-wip-us.apache.org/repos/asf/systemml/blob/c3601d41/src/test/scripts/functions/codegen/cellwisetmpl17.R
----------------------------------------------------------------------
diff --git a/src/test/scripts/functions/codegen/cellwisetmpl17.R 
b/src/test/scripts/functions/codegen/cellwisetmpl17.R
new file mode 100644
index 0000000..a1ae201
--- /dev/null
+++ b/src/test/scripts/functions/codegen/cellwisetmpl17.R
@@ -0,0 +1,33 @@
+#-------------------------------------------------------------
+#
+# 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.
+#
+#-------------------------------------------------------------
+
+args<-commandArgs(TRUE)
+options(digits=22)
+library("Matrix")
+
+X = matrix(seq(7, 1100*200+6), 1100, 200, byrow=TRUE);
+
+R1 = (X/3) %% 0.6;
+R2 = (X/3) %/% 0.6;
+
+R = xor(R1, R2);
+
+writeMM(as(R,"CsparseMatrix"), paste(args[2], "S", sep=""));

http://git-wip-us.apache.org/repos/asf/systemml/blob/c3601d41/src/test/scripts/functions/codegen/cellwisetmpl17.dml
----------------------------------------------------------------------
diff --git a/src/test/scripts/functions/codegen/cellwisetmpl17.dml 
b/src/test/scripts/functions/codegen/cellwisetmpl17.dml
new file mode 100644
index 0000000..151b4f7
--- /dev/null
+++ b/src/test/scripts/functions/codegen/cellwisetmpl17.dml
@@ -0,0 +1,29 @@
+#-------------------------------------------------------------
+#
+# 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.
+#
+#-------------------------------------------------------------
+
+X = matrix(seq(7, 1100*200+6), 1100, 200);
+
+R1 = (X/3) %% 0.6;
+R2 = (X/3) %/% 0.6;
+
+S = xor(R1, R2);
+
+write(S, $1)

http://git-wip-us.apache.org/repos/asf/systemml/blob/c3601d41/src/test/scripts/functions/codegen/rowAggPattern36.R
----------------------------------------------------------------------
diff --git a/src/test/scripts/functions/codegen/rowAggPattern36.R 
b/src/test/scripts/functions/codegen/rowAggPattern36.R
new file mode 100644
index 0000000..349720e
--- /dev/null
+++ b/src/test/scripts/functions/codegen/rowAggPattern36.R
@@ -0,0 +1,33 @@
+#-------------------------------------------------------------
+#
+# 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.
+#
+#-------------------------------------------------------------
+
+args<-commandArgs(TRUE)
+options(digits=22)
+library("Matrix")
+library("matrixStats")
+
+X = matrix(seq(1, 6000)/600, 300, 20);
+
+Y = X/rowSums(X)
+
+R = xor(X,Y);
+
+writeMM(as(R, "CsparseMatrix"), paste(args[2], "S", sep=""));

http://git-wip-us.apache.org/repos/asf/systemml/blob/c3601d41/src/test/scripts/functions/codegen/rowAggPattern36.dml
----------------------------------------------------------------------
diff --git a/src/test/scripts/functions/codegen/rowAggPattern36.dml 
b/src/test/scripts/functions/codegen/rowAggPattern36.dml
new file mode 100644
index 0000000..cded6cc
--- /dev/null
+++ b/src/test/scripts/functions/codegen/rowAggPattern36.dml
@@ -0,0 +1,29 @@
+#-------------------------------------------------------------
+#
+# 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.
+#
+#-------------------------------------------------------------
+
+X = matrix(seq(1, 6000)/600, 300, 20);
+
+Y = X/rowSums(X)
+
+S = xor(X, Y);
+
+write(S, $1);
+

Reply via email to