Repository: systemml
Updated Branches:
  refs/heads/master 5fcda00a9 -> f627d07e4


[SYSTEMML-2068] Codegen support for bitwise AND operations

Closes #728.


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

Branch: refs/heads/master
Commit: f627d07e45b52b9e268c097181b75cc58c0db6cb
Parents: 5fcda00
Author: Janardhan Pulivarthi <[email protected]>
Authored: Sun Feb 11 14:31:18 2018 -0800
Committer: Matthias Boehm <[email protected]>
Committed: Sun Feb 11 14:31:18 2018 -0800

----------------------------------------------------------------------
 .../java/org/apache/sysml/hops/BinaryOp.java    |  4 +-
 src/main/java/org/apache/sysml/hops/Hop.java    | 52 ++++++++--------
 .../sysml/hops/codegen/cplan/CNodeBinary.java   | 19 ++++--
 .../hops/codegen/template/TemplateRow.java      |  4 +-
 .../sysml/parser/BuiltinFunctionExpression.java | 30 +++++-----
 .../org/apache/sysml/parser/DMLTranslator.java  | 20 +++----
 .../org/apache/sysml/parser/Expression.java     | 10 ++--
 .../runtime/codegen/LibSpoofPrimitives.java     | 62 ++++++++++++++++++--
 .../sysml/runtime/matrix/data/SparseBlock.java  |  5 +-
 .../runtime/matrix/data/SparseBlockCSR.java     | 11 +++-
 .../matrix/operators/BinaryOperator.java        | 10 ++--
 .../codegen/CPlanVectorPrimitivesTest.java      | 40 +++++++++++--
 .../functions/codegen/CellwiseTmplTest.java     | 19 +++++-
 .../functions/codegen/RowAggTmplTest.java       | 20 ++++++-
 .../scripts/functions/codegen/cellwisetmpl20.R  | 32 ++++++++++
 .../functions/codegen/cellwisetmpl20.dml        | 28 +++++++++
 .../scripts/functions/codegen/rowAggPattern39.R | 32 ++++++++++
 .../functions/codegen/rowAggPattern39.dml       | 27 +++++++++
 18 files changed, 338 insertions(+), 87 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/systemml/blob/f627d07e/src/main/java/org/apache/sysml/hops/BinaryOp.java
----------------------------------------------------------------------
diff --git a/src/main/java/org/apache/sysml/hops/BinaryOp.java 
b/src/main/java/org/apache/sysml/hops/BinaryOp.java
index d76cea9..279d14d 100644
--- a/src/main/java/org/apache/sysml/hops/BinaryOp.java
+++ b/src/main/java/org/apache/sysml/hops/BinaryOp.java
@@ -1606,8 +1606,8 @@ public class BinaryOp extends Hop
                                ||op==OpOp2.MIN ||op==OpOp2.MAX
                                ||op==OpOp2.LOG ||op==OpOp2.POW
                                ||op==OpOp2.AND ||op==OpOp2.OR ||op==OpOp2.XOR
-                               ||op==OpOp2.BW_AND ||op==OpOp2.BW_OR 
||op==OpOp2.BW_XOR
-                               ||op==OpOp2.BW_SHIFTL ||op==OpOp2.BW_SHIFTR);
+                               ||op==OpOp2.BITWAND ||op==OpOp2.BITWOR 
||op==OpOp2.BITWXOR
+                               ||op==OpOp2.BITWSHIFTL ||op==OpOp2.BITWSHIFTR);
        }
        
        public boolean isPPredOperation()

http://git-wip-us.apache.org/repos/asf/systemml/blob/f627d07e/src/main/java/org/apache/sysml/hops/Hop.java
----------------------------------------------------------------------
diff --git a/src/main/java/org/apache/sysml/hops/Hop.java 
b/src/main/java/org/apache/sysml/hops/Hop.java
index 8110838..23d29e4 100644
--- a/src/main/java/org/apache/sysml/hops/Hop.java
+++ b/src/main/java/org/apache/sysml/hops/Hop.java
@@ -1075,7 +1075,7 @@ public abstract class Hop implements ParseInfo
                MINUS_NZ, //sparse-safe minus: X-(mean*ppred(X,0,!=))
                LOG_NZ, //sparse-safe log; ppred(X,0,"!=")*log(X,0.5)
                MINUS1_MULT, //1-X*Y
-               BW_AND, BW_OR, BW_XOR, BW_SHIFTL, BW_SHIFTR, //bitwise 
operations
+               BITWAND, BITWOR, BITWXOR, BITWSHIFTL, BITWSHIFTR, //bitwise 
operations
        }
 
        // Operations that require 3 operands
@@ -1217,11 +1217,11 @@ public abstract class Hop implements ParseInfo
                HopsOpOp2LopsB.put(OpOp2.SOLVE, Binary.OperationTypes.SOLVE);
                HopsOpOp2LopsB.put(OpOp2.POW, Binary.OperationTypes.POW);
                HopsOpOp2LopsB.put(OpOp2.LOG, 
Binary.OperationTypes.NOTSUPPORTED);
-               HopsOpOp2LopsB.put(OpOp2.BW_AND, Binary.OperationTypes.BW_AND);
-               HopsOpOp2LopsB.put(OpOp2.BW_OR, Binary.OperationTypes.BW_OR);
-               HopsOpOp2LopsB.put(OpOp2.BW_XOR, Binary.OperationTypes.BW_XOR);
-               HopsOpOp2LopsB.put(OpOp2.BW_SHIFTL, 
Binary.OperationTypes.BW_SHIFTL);
-               HopsOpOp2LopsB.put(OpOp2.BW_SHIFTR, 
Binary.OperationTypes.BW_SHIFTR);
+               HopsOpOp2LopsB.put(OpOp2.BITWAND, Binary.OperationTypes.BW_AND);
+               HopsOpOp2LopsB.put(OpOp2.BITWOR, Binary.OperationTypes.BW_OR);
+               HopsOpOp2LopsB.put(OpOp2.BITWXOR, Binary.OperationTypes.BW_XOR);
+               HopsOpOp2LopsB.put(OpOp2.BITWSHIFTL, 
Binary.OperationTypes.BW_SHIFTL);
+               HopsOpOp2LopsB.put(OpOp2.BITWSHIFTR, 
Binary.OperationTypes.BW_SHIFTR);
        }
 
        protected static final HashMap<Hop.OpOp2, BinaryScalar.OperationTypes> 
HopsOpOp2LopsBS;
@@ -1247,11 +1247,11 @@ public abstract class Hop implements ParseInfo
                HopsOpOp2LopsBS.put(OpOp2.LOG, BinaryScalar.OperationTypes.LOG);
                HopsOpOp2LopsBS.put(OpOp2.POW, BinaryScalar.OperationTypes.POW);
                HopsOpOp2LopsBS.put(OpOp2.PRINT, 
BinaryScalar.OperationTypes.PRINT);
-               HopsOpOp2LopsBS.put(OpOp2.BW_AND, 
BinaryScalar.OperationTypes.BW_AND);
-               HopsOpOp2LopsBS.put(OpOp2.BW_OR, 
BinaryScalar.OperationTypes.BW_OR);
-               HopsOpOp2LopsBS.put(OpOp2.BW_XOR, 
BinaryScalar.OperationTypes.BW_XOR);
-               HopsOpOp2LopsBS.put(OpOp2.BW_SHIFTL, 
BinaryScalar.OperationTypes.BW_SHIFTL);
-               HopsOpOp2LopsBS.put(OpOp2.BW_SHIFTR, 
BinaryScalar.OperationTypes.BW_SHIFTR);
+               HopsOpOp2LopsBS.put(OpOp2.BITWAND, 
BinaryScalar.OperationTypes.BW_AND);
+               HopsOpOp2LopsBS.put(OpOp2.BITWOR, 
BinaryScalar.OperationTypes.BW_OR);
+               HopsOpOp2LopsBS.put(OpOp2.BITWXOR, 
BinaryScalar.OperationTypes.BW_XOR);
+               HopsOpOp2LopsBS.put(OpOp2.BITWSHIFTL, 
BinaryScalar.OperationTypes.BW_SHIFTL);
+               HopsOpOp2LopsBS.put(OpOp2.BITWSHIFTR, 
BinaryScalar.OperationTypes.BW_SHIFTR);
        }
 
        protected static final HashMap<Hop.OpOp2, 
org.apache.sysml.lops.Unary.OperationTypes> HopsOpOp2LopsU;
@@ -1279,11 +1279,11 @@ public abstract class Hop implements ParseInfo
                HopsOpOp2LopsU.put(OpOp2.POW, 
org.apache.sysml.lops.Unary.OperationTypes.POW);
                HopsOpOp2LopsU.put(OpOp2.MINUS_NZ, 
org.apache.sysml.lops.Unary.OperationTypes.SUBTRACT_NZ);
                HopsOpOp2LopsU.put(OpOp2.LOG_NZ, 
org.apache.sysml.lops.Unary.OperationTypes.LOG_NZ);
-               HopsOpOp2LopsU.put(OpOp2.BW_AND, Unary.OperationTypes.BW_AND);
-               HopsOpOp2LopsU.put(OpOp2.BW_OR, Unary.OperationTypes.BW_OR);
-               HopsOpOp2LopsU.put(OpOp2.BW_XOR, Unary.OperationTypes.BW_XOR);
-               HopsOpOp2LopsU.put(OpOp2.BW_SHIFTL, 
Unary.OperationTypes.BW_SHIFTL);
-               HopsOpOp2LopsU.put(OpOp2.BW_SHIFTR, 
Unary.OperationTypes.BW_SHIFTR);
+               HopsOpOp2LopsU.put(OpOp2.BITWAND, Unary.OperationTypes.BW_AND);
+               HopsOpOp2LopsU.put(OpOp2.BITWOR, Unary.OperationTypes.BW_OR);
+               HopsOpOp2LopsU.put(OpOp2.BITWXOR, Unary.OperationTypes.BW_XOR);
+               HopsOpOp2LopsU.put(OpOp2.BITWSHIFTL, 
Unary.OperationTypes.BW_SHIFTL);
+               HopsOpOp2LopsU.put(OpOp2.BITWSHIFTR, 
Unary.OperationTypes.BW_SHIFTR);
        }
 
        protected static final HashMap<Hop.OpOp1, 
org.apache.sysml.lops.Unary.OperationTypes> HopsOpOp1LopsU;
@@ -1463,11 +1463,11 @@ public abstract class Hop implements ParseInfo
                HopsOpOp2String.put(OpOp2.RBIND, "rbind");
                HopsOpOp2String.put(OpOp2.SOLVE, "solve");
                HopsOpOp2String.put(OpOp2.XOR, "xor");
-               HopsOpOp2String.put(OpOp2.BW_AND, "bitwAnd");
-               HopsOpOp2String.put(OpOp2.BW_OR,  "bitwOr");
-               HopsOpOp2String.put(OpOp2.BW_XOR, "bitwXor");
-               HopsOpOp2String.put(OpOp2.BW_SHIFTL, "bitwShiftL");
-               HopsOpOp2String.put(OpOp2.BW_SHIFTR, "bitwShiftR");
+               HopsOpOp2String.put(OpOp2.BITWAND, "bitwAnd");
+               HopsOpOp2String.put(OpOp2.BITWOR,  "bitwOr");
+               HopsOpOp2String.put(OpOp2.BITWXOR, "bitwXor");
+               HopsOpOp2String.put(OpOp2.BITWSHIFTL, "bitwShiftL");
+               HopsOpOp2String.put(OpOp2.BITWSHIFTR, "bitwShiftR");
        }
        
        public static String getBinaryOpCode(OpOp2 op) {
@@ -1559,11 +1559,11 @@ public abstract class Hop implements ParseInfo
                else if( "&".equals(op) ) return OpOp2.AND;
                else if( "log".equals(op) ) return OpOp2.LOG;
                else if( "^".equals(op) ) return OpOp2.POW;
-               else if("bitwAnd".equals(op) ) return OpOp2.BW_AND;
-               else if("bitwOr".equals(op) ) return OpOp2.BW_OR;
-               else if("bitwXor".equals(op) ) return OpOp2.BW_XOR;
-               else if("bitwShiftL".equals(op) ) return OpOp2.BW_SHIFTL;
-               else if("bitwShiftR".equals(op) ) return OpOp2.BW_SHIFTR;
+               else if("bitwAnd".equals(op) ) return OpOp2.BITWAND;
+               else if("bitwOr".equals(op) ) return OpOp2.BITWOR;
+               else if("bitwXor".equals(op) ) return OpOp2.BITWXOR;
+               else if("bitwShiftL".equals(op) ) return OpOp2.BITWSHIFTL;
+               else if("bitwShiftR".equals(op) ) return OpOp2.BITWSHIFTR;
                
                return null;
        }

http://git-wip-us.apache.org/repos/asf/systemml/blob/f627d07e/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 2f7feb0..c6e0c36 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
@@ -42,15 +42,16 @@ public class CNodeBinary extends CNode
                VECT_EQUAL_SCALAR, VECT_NOTEQUAL_SCALAR, VECT_LESS_SCALAR, 
                VECT_LESSEQUAL_SCALAR, VECT_GREATER_SCALAR, 
VECT_GREATEREQUAL_SCALAR,
                VECT_CBIND,
-               VECT_XOR_SCALAR,
+               VECT_XOR_SCALAR, VECT_BITWAND_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,
+               VECT_XOR, VECT_BITWAND,
                //scalar-scalar operations
                MULT, DIV, PLUS, MINUS, MODULUS, INTDIV, 
                LESS, LESSEQUAL, GREATER, GREATEREQUAL, EQUAL,NOTEQUAL,
                MIN, MAX, AND, OR, XOR, LOG, LOG_NZ, POW,
+               BITWAND,
                MINUS1_MULT, MINUS_NZ;
 
                public static boolean contains(String value) {
@@ -116,6 +117,7 @@ public class CNodeBinary extends CNode
                                case VECT_PLUS_SCALAR:
                                case VECT_POW_SCALAR:
                                case VECT_XOR_SCALAR:
+                               case VECT_BITWAND_SCALAR:
                                case VECT_MIN_SCALAR:
                                case VECT_MAX_SCALAR:
                                case VECT_EQUAL_SCALAR:
@@ -147,6 +149,7 @@ public class CNodeBinary extends CNode
                                case VECT_MINUS:
                                case VECT_PLUS:
                                case VECT_XOR:
+                               case VECT_BITWAND:
                                case VECT_MIN:
                                case VECT_MAX:
                                case VECT_EQUAL:
@@ -206,7 +209,9 @@ public class CNodeBinary extends CNode
                                        return "    double %TMP% = (%IN1% != 0) 
? %IN1% - %IN2% : 0;\n";
                                case XOR:
                                        return "    double %TMP% = ( (%IN1% != 
0) != (%IN2% != 0) ) ? 1 : 0;\n";
-                                       
+                               case BITWAND:
+                                       return "    double %TMP% = 
LibSpoofPrimitives.intDiv(%IN1%, %IN2%);\n";
+
                                default: 
                                        throw new RuntimeException("Invalid 
binary type: "+this.toString());
                        }
@@ -225,7 +230,7 @@ public class CNodeBinary extends CNode
                                || this == VECT_LESS_SCALAR || this == 
VECT_LESSEQUAL_SCALAR
                                || this == VECT_GREATER_SCALAR || this == 
VECT_GREATEREQUAL_SCALAR
                                || this == VECT_CBIND
-                               || this == VECT_XOR_SCALAR;
+                               || this == VECT_XOR_SCALAR || this == 
VECT_BITWAND_SCALAR;
                }
                public boolean isVectorVectorPrimitive() {
                        return this == VECT_DIV || this == VECT_MULT 
@@ -234,7 +239,7 @@ public class CNodeBinary extends CNode
                                || this == VECT_EQUAL || this == VECT_NOTEQUAL
                                || this == VECT_LESS || this == VECT_LESSEQUAL
                                || this == VECT_GREATER || this == 
VECT_GREATEREQUAL
-                               || this == VECT_XOR;
+                               || this == VECT_XOR || this == VECT_BITWAND;
                }
                public boolean isVectorMatrixPrimitive() {
                        return this == VECT_MATRIXMULT
@@ -400,6 +405,7 @@ public class CNodeBinary extends CNode
                        case OR:                       return "b(|)";
                        case AND:                      return "b(&)";
                        case XOR:                      return "b(xor)";
+                       case BITWAND:                  return "b(bitwAnd)";
                        case MINUS1_MULT:              return "b(1-*)";
                        case MINUS_NZ:                 return "b(-nz)";
                        default: return "b("+_type.name().toLowerCase()+")";
@@ -449,6 +455,7 @@ public class CNodeBinary extends CNode
                        case VECT_MINUS_SCALAR:
                        case VECT_PLUS_SCALAR:
                        case VECT_XOR_SCALAR:
+                       case VECT_BITWAND_SCALAR:
                        case VECT_POW_SCALAR:
                        case VECT_MIN_SCALAR:
                        case VECT_MAX_SCALAR:
@@ -464,6 +471,7 @@ public class CNodeBinary extends CNode
                        case VECT_MINUS:
                        case VECT_PLUS:
                        case VECT_XOR:
+                       case VECT_BITWAND:
                        case VECT_MIN:
                        case VECT_MAX:
                        case VECT_EQUAL: 
@@ -508,6 +516,7 @@ public class CNodeBinary extends CNode
                        case AND: 
                        case OR:
                        case XOR:
+                       case BITWAND:
                        case LOG: 
                        case LOG_NZ:
                        case POW: 

http://git-wip-us.apache.org/repos/asf/systemml/blob/f627d07e/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 d133cc4..d54cf63 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
@@ -66,7 +66,9 @@ public class TemplateRow extends TemplateBase
                        OpOp1.CUMSUM, OpOp1.CUMMIN, OpOp1.CUMMAX, OpOp1.SPROP, 
OpOp1.SIGMOID};
        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.XOR,
-                       OpOp2.EQUAL, OpOp2.NOTEQUAL, OpOp2.LESS, 
OpOp2.LESSEQUAL, OpOp2.GREATER, OpOp2.GREATEREQUAL};
+                       OpOp2.EQUAL, OpOp2.NOTEQUAL, OpOp2.LESS, 
OpOp2.LESSEQUAL, OpOp2.GREATER, OpOp2.GREATEREQUAL,
+                       OpOp2.BITWAND,
+       };
        
        public TemplateRow() {
                super(TemplateType.ROW);

http://git-wip-us.apache.org/repos/asf/systemml/blob/f627d07e/src/main/java/org/apache/sysml/parser/BuiltinFunctionExpression.java
----------------------------------------------------------------------
diff --git 
a/src/main/java/org/apache/sysml/parser/BuiltinFunctionExpression.java 
b/src/main/java/org/apache/sysml/parser/BuiltinFunctionExpression.java
index 7cc1ed3..2ed02d2 100644
--- a/src/main/java/org/apache/sysml/parser/BuiltinFunctionExpression.java
+++ b/src/main/java/org/apache/sysml/parser/BuiltinFunctionExpression.java
@@ -447,11 +447,11 @@ public class BuiltinFunctionExpression extends 
DataIdentifier
                        break;
                
                case XOR:
-               case BITWISE_AND:
-               case BITWISE_OR:
-               case BITWISE_XOR:
-               case BITWISE_SHIFTL:
-               case BITWISE_SHIFTR:
+               case BITWAND:
+               case BITWOR:
+               case BITWXOR:
+               case BITWSHIFTL:
+               case BITWSHIFTR:
                case MIN:
                case MAX:
                        //min(X), min(X,s), min(s,X), min(s,r), min(X,Y)
@@ -1377,11 +1377,11 @@ public class BuiltinFunctionExpression extends 
DataIdentifier
                case FLOOR:
                case MEDIAN:
                case XOR:
-               case BITWISE_AND:
-               case BITWISE_OR:
-               case BITWISE_XOR:
-               case BITWISE_SHIFTL:
-               case BITWISE_SHIFTR:
+               case BITWAND:
+               case BITWOR:
+               case BITWXOR:
+               case BITWSHIFTL:
+               case BITWSHIFTR:
                        return true;
                default:
                        return false;
@@ -1778,15 +1778,15 @@ public class BuiltinFunctionExpression extends 
DataIdentifier
                else if ( functionName.equals("xor") )
                        bifop = Expression.BuiltinFunctionOp.XOR;
                else if ( functionName.equals("bitwAnd") )
-                       bifop = Expression.BuiltinFunctionOp.BITWISE_AND;
+                       bifop = Expression.BuiltinFunctionOp.BITWAND;
                else if ( functionName.equals("bitwOr") )
-                       bifop = Expression.BuiltinFunctionOp.BITWISE_OR;
+                       bifop = Expression.BuiltinFunctionOp.BITWOR;
                else if ( functionName.equals("bitwXor") )
-                       bifop = Expression.BuiltinFunctionOp.BITWISE_XOR;
+                       bifop = Expression.BuiltinFunctionOp.BITWXOR;
                else if ( functionName.equals("bitwShiftL") )
-                       bifop = Expression.BuiltinFunctionOp.BITWISE_SHIFTL;
+                       bifop = Expression.BuiltinFunctionOp.BITWSHIFTL;
                else if ( functionName.equals("bitwShiftR") )
-                       bifop = Expression.BuiltinFunctionOp.BITWISE_SHIFTR;
+                       bifop = Expression.BuiltinFunctionOp.BITWSHIFTR;
                else if ( functionName.equals("ifelse") )
                        bifop = Expression.BuiltinFunctionOp.IFELSE;
                else

http://git-wip-us.apache.org/repos/asf/systemml/blob/f627d07e/src/main/java/org/apache/sysml/parser/DMLTranslator.java
----------------------------------------------------------------------
diff --git a/src/main/java/org/apache/sysml/parser/DMLTranslator.java 
b/src/main/java/org/apache/sysml/parser/DMLTranslator.java
index faee84b..8437974 100644
--- a/src/main/java/org/apache/sysml/parser/DMLTranslator.java
+++ b/src/main/java/org/apache/sysml/parser/DMLTranslator.java
@@ -2678,25 +2678,25 @@ public class DMLTranslator
                        currBuiltinOp = new BinaryOp(target.getName(), 
target.getDataType(),
                                target.getValueType(), Hop.OpOp2.XOR, expr, 
expr2);
                        break;
-               case BITWISE_AND:
+               case BITWAND:
                        currBuiltinOp = new BinaryOp(target.getName(), 
target.getDataType(),
-                                       target.getValueType(), OpOp2.BW_AND, 
expr, expr2);
+                                       target.getValueType(), OpOp2.BITWAND, 
expr, expr2);
                        break;
-               case BITWISE_OR:
+               case BITWOR:
                        currBuiltinOp = new BinaryOp(target.getName(), 
target.getDataType(),
-                                       target.getValueType(), OpOp2.BW_OR, 
expr, expr2);
+                                       target.getValueType(), OpOp2.BITWOR, 
expr, expr2);
                        break;
-               case BITWISE_XOR:
+               case BITWXOR:
                        currBuiltinOp = new BinaryOp(target.getName(), 
target.getDataType(),
-                                       target.getValueType(), OpOp2.BW_XOR, 
expr, expr2);
+                                       target.getValueType(), OpOp2.BITWXOR, 
expr, expr2);
                        break;
-               case BITWISE_SHIFTL:
+               case BITWSHIFTL:
                        currBuiltinOp = new BinaryOp(target.getName(), 
target.getDataType(),
-                                       target.getValueType(), OpOp2.BW_SHIFTL, 
expr, expr2);
+                                       target.getValueType(), 
OpOp2.BITWSHIFTL, expr, expr2);
                        break;
-               case BITWISE_SHIFTR:
+               case BITWSHIFTR:
                        currBuiltinOp = new BinaryOp(target.getName(), 
target.getDataType(),
-                                       target.getValueType(), OpOp2.BW_SHIFTR, 
expr, expr2);
+                                       target.getValueType(), 
OpOp2.BITWSHIFTR, expr, expr2);
                        break;
 
                case ABS:

http://git-wip-us.apache.org/repos/asf/systemml/blob/f627d07e/src/main/java/org/apache/sysml/parser/Expression.java
----------------------------------------------------------------------
diff --git a/src/main/java/org/apache/sysml/parser/Expression.java 
b/src/main/java/org/apache/sysml/parser/Expression.java
index 8263206..6fa9ac6 100644
--- a/src/main/java/org/apache/sysml/parser/Expression.java
+++ b/src/main/java/org/apache/sysml/parser/Expression.java
@@ -138,11 +138,11 @@ public abstract class Expression implements ParseInfo
                TRANS,
                VAR,
                XOR,
-               BITWISE_AND,
-               BITWISE_OR,
-               BITWISE_XOR,
-               BITWISE_SHIFTL,
-               BITWISE_SHIFTR,
+               BITWAND,
+               BITWOR,
+               BITWXOR,
+               BITWSHIFTL,
+               BITWSHIFTR,
        }
 
        /**

http://git-wip-us.apache.org/repos/asf/systemml/blob/f627d07e/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 2f1a4a3..30855ad 100644
--- a/src/main/java/org/apache/sysml/runtime/codegen/LibSpoofPrimitives.java
+++ b/src/main/java/org/apache/sysml/runtime/codegen/LibSpoofPrimitives.java
@@ -22,6 +22,7 @@ package org.apache.sysml.runtime.codegen;
 import java.util.Arrays;
 
 import org.apache.commons.math3.util.FastMath;
+import org.apache.sysml.runtime.functionobjects.BitwAnd;
 import org.apache.sysml.runtime.functionobjects.IntegerDivide;
 import org.apache.sysml.runtime.functionobjects.Modulus;
 import org.apache.sysml.runtime.matrix.data.LibMatrixMult;
@@ -37,6 +38,7 @@ public class LibSpoofPrimitives
 {
        private static IntegerDivide intDiv = IntegerDivide.getFnObject();
        private static Modulus mod = Modulus.getFnObject();
+       private static BitwAnd bwAnd = BitwAnd.getBitwAndFnObject();
        
        //global pool of reusable vectors, individual operations set up their 
own thread-local
        //ring buffers of reusable vectors with specific number of vectors and 
vector sizes 
@@ -627,11 +629,7 @@ public class LibSpoofPrimitives
 
        //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;
+               return vectXorWrite(a, bval, aix, ai, alen, len);
        }
 
        //6. sparse vector vs. dense vector
@@ -1965,7 +1963,57 @@ public class LibSpoofPrimitives
                //invariant to the ordering of inputs
                return vectLessWrite(b, a, bix, bi, ai, blen, len);
        }
+
+       //bitwise and
        
+       //1. dense vector vs. scalar
+       public static double[] vectBitwandWrite(double[] a, double bval, int 
ai, int len) {
+               double[] c = allocVector(len, false);
+               for( int j = 0; j < len; j++ )
+                       c[j] = bwAnd(a[ai+j], bval);
+               return c;
+       }
+
+       //2. scalar vs. dense vector
+       public static double[] vectBitwandWrite(double bval, double[] a, int 
ai, int len) {
+               return vectBitwandWrite(a, bval, ai, len);
+       }
+
+       //3. dense vector vs. dense vector
+       public static double[] vectBitwandWrite(double[] a, double[] b, int ai, 
int bi, int len) {
+               double[] c= allocVector(len, false);
+               for( int j = 0; j < len; j++ )
+                       c[j] = bwAnd(a[ai+j], b[bi+j]);
+               return c;
+       }
+
+       //4. sparse vector vs. scalar.
+       public static double[] vectBitwandWrite(double[] a, double bval, int[] 
aix, int ai, int alen, int len) {
+               double[] c = allocVector(len, true);
+               int bval1 = (int)bval;
+               for( int j = ai; j < ai+alen; j++ )
+                       c[aix[j]] = bwAnd(a[j], bval1);
+               return c;
+       }
+
+       //5. scalar vs. sparse vector
+       public static double[] vectBitwandWrite(double bval, double[] a, int[] 
aix, int ai, int alen, int len) {
+               return vectBitwandWrite(a, bval, aix, ai, alen, len);
+       }
+
+       //6. sparse vector vs. dense vector
+       public static double[] vectBitwandWrite(double[] a, double[] b, int[] 
aix, int ai, int bi, int alen, int len) {
+               double[] c = allocVector(len, true);
+               for( int j = ai; j < ai+alen; j++ )
+                       c[aix[j]] = bwAnd(a[j], b[bi+aix[j]]);
+               return c;
+       }
+
+       //6. sparse vector vs. dense vector
+       public static double[] vectBitwandWrite(double[] a, double[] b, int ai, 
int[] aix, int bi, int alen, int len) {
+               return vectBitwandWrite(a, b, aix, ai, bi, alen, len);
+       }
+
        //complex builtin functions that are not directly generated
        //(included here in order to reduce the number of imports)
        
@@ -1977,6 +2025,10 @@ public class LibSpoofPrimitives
                return mod.execute(in1, in2);
        }
        
+       public static double bwAnd(double in1, double in2) {
+               return bwAnd.execute(in1, in2);
+       }
+       
        public static boolean isFlipOuter(int len1, int len2) {
                return (len1 > 64 * len2);
        }

http://git-wip-us.apache.org/repos/asf/systemml/blob/f627d07e/src/main/java/org/apache/sysml/runtime/matrix/data/SparseBlock.java
----------------------------------------------------------------------
diff --git 
a/src/main/java/org/apache/sysml/runtime/matrix/data/SparseBlock.java 
b/src/main/java/org/apache/sysml/runtime/matrix/data/SparseBlock.java
index a9d75b4..d4e8d3d 100644
--- a/src/main/java/org/apache/sysml/runtime/matrix/data/SparseBlock.java
+++ b/src/main/java/org/apache/sysml/runtime/matrix/data/SparseBlock.java
@@ -245,9 +245,8 @@ public abstract class SparseBlock implements Serializable
         * @param r  row index starting at 0
         * @return true if row does not contain non-zero values
         */
-       public abstract boolean isEmpty(int r); 
-       
-       
+       public abstract boolean isEmpty(int r);
+
        ////////////////////////
        //obtain indexes/values/positions
        

http://git-wip-us.apache.org/repos/asf/systemml/blob/f627d07e/src/main/java/org/apache/sysml/runtime/matrix/data/SparseBlockCSR.java
----------------------------------------------------------------------
diff --git 
a/src/main/java/org/apache/sysml/runtime/matrix/data/SparseBlockCSR.java 
b/src/main/java/org/apache/sysml/runtime/matrix/data/SparseBlockCSR.java
index 766ba8c..749eea4 100644
--- a/src/main/java/org/apache/sysml/runtime/matrix/data/SparseBlockCSR.java
+++ b/src/main/java/org/apache/sysml/runtime/matrix/data/SparseBlockCSR.java
@@ -51,6 +51,13 @@ public class SparseBlockCSR extends SparseBlock
        private int[] _indexes = null;   //column index array (size: >=nnz)
        private double[] _values = null; //value array (size: >=nnz)
        private int _size = 0;           //actual number of nnz
+
+       //matrix meta data
+       protected int rlen       = -1;
+       protected int clen       = -1;
+       protected boolean sparse = true;
+       protected long nonZeros  = 0;
+
        
        public SparseBlockCSR(int rlen) {
                this(rlen, INIT_CAPACITY);
@@ -69,7 +76,7 @@ public class SparseBlockCSR extends SparseBlock
                _values = values;
                _size = nnz;
        }
-       
+
        /**
         * Copy constructor sparse block abstraction. 
         * 
@@ -342,7 +349,7 @@ public class SparseBlockCSR extends SparseBlock
        public boolean isAllocated(int r) {
                return true;
        }
-       
+
        @Override 
        public void reset() {
                if( _size > 0 ) {

http://git-wip-us.apache.org/repos/asf/systemml/blob/f627d07e/src/main/java/org/apache/sysml/runtime/matrix/operators/BinaryOperator.java
----------------------------------------------------------------------
diff --git 
a/src/main/java/org/apache/sysml/runtime/matrix/operators/BinaryOperator.java 
b/src/main/java/org/apache/sysml/runtime/matrix/operators/BinaryOperator.java
index e3b9a06..94619d0 100644
--- 
a/src/main/java/org/apache/sysml/runtime/matrix/operators/BinaryOperator.java
+++ 
b/src/main/java/org/apache/sysml/runtime/matrix/operators/BinaryOperator.java
@@ -91,11 +91,11 @@ public class BinaryOperator  extends Operator implements 
Serializable
                else if( fn instanceof And )                    return 
OpOp2.AND;
                else if( fn instanceof Or )                             return 
OpOp2.OR;
                else if( fn instanceof Xor )                    return 
OpOp2.XOR;
-               else if( fn instanceof BitwAnd )                return 
OpOp2.BW_AND;
-               else if( fn instanceof BitwOr )                 return 
OpOp2.BW_OR;
-               else if( fn instanceof BitwXor )                return 
OpOp2.BW_XOR;
-               else if( fn instanceof BitwShiftL )             return 
OpOp2.BW_SHIFTL;
-               else if( fn instanceof BitwShiftR )             return 
OpOp2.BW_SHIFTR;
+               else if( fn instanceof BitwAnd )                return 
OpOp2.BITWAND;
+               else if( fn instanceof BitwOr )                 return 
OpOp2.BITWOR;
+               else if( fn instanceof BitwXor )                return 
OpOp2.BITWXOR;
+               else if( fn instanceof BitwShiftL )             return 
OpOp2.BITWSHIFTL;
+               else if( fn instanceof BitwShiftR )             return 
OpOp2.BITWSHIFTR;
                else if( fn instanceof Power )                  return 
OpOp2.POW;
                else if( fn instanceof MinusNz )                return 
OpOp2.MINUS_NZ;
                else if( fn instanceof Builtin ) {

http://git-wip-us.apache.org/repos/asf/systemml/blob/f627d07e/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 d43ffa5..076620b 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
@@ -656,25 +656,57 @@ public class CPlanVectorPrimitivesTest extends 
AutomatedTestBase
        }
 
        @Test
-       public void testVectorVectorDenseDense() {
+       public void testVectorVectorXorDenseDense() {
                testVectorBinaryPrimitive(BinType.VECT_XOR, 
InputType.VECTOR_DENSE, InputType.VECTOR_DENSE);
        }
 
        @Test
-       public void testVectorScalarSparse() {
+       public void testVectorScalarXorSparse() {
                testVectorBinaryPrimitive(BinType.VECT_XOR_SCALAR, 
InputType.VECTOR_SPARSE, InputType.SCALAR);
        }
 
        @Test
-       public void testScalarVectorSparse() {
+       public void testScalarVectorXorSparse() {
                testVectorBinaryPrimitive(BinType.VECT_XOR_SCALAR, 
InputType.SCALAR, InputType.VECTOR_SPARSE);
        }
 
        @Test
-       public void testVectorVectorSparseDense() {
+       public void testVectorVectorXorSparseDense() {
                testVectorBinaryPrimitive(BinType.VECT_XOR, 
InputType.VECTOR_SPARSE, InputType.VECTOR_DENSE);
        }
 
+       //***************** Logical Bitwise Operators ********************//
+
+       @Test //1.
+       public void testVectorScalarBitwAndDense() {
+               testVectorBinaryPrimitive(BinType.VECT_BITWAND_SCALAR, 
InputType.VECTOR_DENSE, InputType.SCALAR);
+       }
+
+       @Test //2.
+       public void testScalarVectorBitwAndDense() {
+               testVectorBinaryPrimitive(BinType.VECT_BITWAND_SCALAR, 
InputType.SCALAR, InputType.VECTOR_DENSE);
+       }
+
+       @Test //3.
+       public void testVectorVectorBitwAndDenseDense() {
+               testVectorBinaryPrimitive(BinType.VECT_BITWAND, 
InputType.VECTOR_DENSE, InputType.VECTOR_DENSE);
+       }
+
+       @Test //4.
+       public void testVectorScalarBitwAndSparse() {
+               testVectorBinaryPrimitive(BinType.VECT_BITWAND, 
InputType.VECTOR_SPARSE, InputType.SCALAR);
+       }
+
+       @Test //5.
+       public void testScalarVectorBitwAndSparse() {
+               testVectorBinaryPrimitive(BinType.VECT_BITWAND, 
InputType.SCALAR, InputType.VECTOR_SPARSE);
+       }
+
+       @Test //6.
+       public void testVectorVectorBitwAndSparseDense() {
+               testVectorBinaryPrimitive(BinType.VECT_BITWAND, 
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/f627d07e/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 b32f06d..d6c56b7 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
@@ -55,6 +55,7 @@ public class CellwiseTmplTest extends AutomatedTestBase
        private static final String TEST_NAME17 = TEST_NAME+17; //xor operation
        private static final String TEST_NAME18 = TEST_NAME+18; 
//sum(ifelse(X,Y,Z))
        private static final String TEST_NAME19 = TEST_NAME+19; 
//sum(ifelse(true,Y,Z))+sum(ifelse(false,Y,Z))
+       private static final String TEST_NAME20 = TEST_NAME+20; //bitwAnd() 
operation
        
        private static final String TEST_DIR = "functions/codegen/";
        private static final String TEST_CLASS_DIR = TEST_DIR + 
CellwiseTmplTest.class.getSimpleName() + "/";
@@ -67,7 +68,7 @@ public class CellwiseTmplTest extends AutomatedTestBase
        @Override
        public void setUp() {
                TestUtils.clearAssertionInformation();
-               for( int i=1; i<=19; i++ ) {
+               for( int i=1; i<=20; i++ ) {
                        addTestConfiguration( TEST_NAME+i, new 
TestConfiguration(
                                        TEST_CLASS_DIR, TEST_NAME+i, new 
String[] {String.valueOf(i)}) );
                }
@@ -334,7 +335,21 @@ public class CellwiseTmplTest extends AutomatedTestBase
        public void testCodegenCellwiseRewrite19_sp() {
                testCodegenIntegration( TEST_NAME19, true, ExecType.SPARK );
        }
-       
+
+       @Test
+       public void testCodegenCellwiseRewrite20() {
+               testCodegenIntegration( TEST_NAME20, true, ExecType.CP );
+       }
+
+       @Test
+       public void testCodegenCellwise20() {
+               testCodegenIntegration( TEST_NAME20, false, ExecType.CP );
+       }
+
+       @Test
+       public void testCodegenCellwiseRewrite20_sp() {
+               testCodegenIntegration( TEST_NAME20, true, ExecType.SPARK );
+       }
        
        private void testCodegenIntegration( String testname, boolean rewrites, 
ExecType instType )
        {

http://git-wip-us.apache.org/repos/asf/systemml/blob/f627d07e/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 bd75c5b..79308e6 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
@@ -75,6 +75,7 @@ public class RowAggTmplTest extends AutomatedTestBase
        private static final String TEST_NAME36 = TEST_NAME+"36"; //xor 
operation
        private static final String TEST_NAME37 = TEST_NAME+"37"; 
//sprop(X/rowSums)
        private static final String TEST_NAME38 = TEST_NAME+"38"; 
//sigmoid(X/rowSums)
+       private static final String TEST_NAME39 = TEST_NAME+"39"; //BitwAnd 
operation
        
        private static final String TEST_DIR = "functions/codegen/";
        private static final String TEST_CLASS_DIR = TEST_DIR + 
RowAggTmplTest.class.getSimpleName() + "/";
@@ -86,7 +87,7 @@ public class RowAggTmplTest extends AutomatedTestBase
        @Override
        public void setUp() {
                TestUtils.clearAssertionInformation();
-               for(int i=1; i<=38; i++)
+               for(int i=1; i<=39; i++)
                        addTestConfiguration( TEST_NAME+i, new 
TestConfiguration(TEST_CLASS_DIR, TEST_NAME+i, new String[] { String.valueOf(i) 
}) );
        }
        
@@ -659,7 +660,22 @@ public class RowAggTmplTest extends AutomatedTestBase
        public void testCodegenRowAgg38SP() {
                testCodegenIntegration( TEST_NAME38, false, ExecType.SPARK );
        }
-       
+
+       @Test
+       public void testCodegenRowAggRewrite39CP() {
+               testCodegenIntegration( TEST_NAME39, true, ExecType.CP );
+       }
+
+       @Test
+       public void testCodegenRowAgg39CP() {
+               testCodegenIntegration( TEST_NAME39, false, ExecType.CP );
+       }
+
+       @Test
+       public void testCodegenRowAgg39SP() {
+               testCodegenIntegration( TEST_NAME39, false, ExecType.SPARK );
+       }
+
        private void testCodegenIntegration( String testname, boolean rewrites, 
ExecType instType )
        {
                boolean oldFlag = OptimizerUtils.ALLOW_ALGEBRAIC_SIMPLIFICATION;

http://git-wip-us.apache.org/repos/asf/systemml/blob/f627d07e/src/test/scripts/functions/codegen/cellwisetmpl20.R
----------------------------------------------------------------------
diff --git a/src/test/scripts/functions/codegen/cellwisetmpl20.R 
b/src/test/scripts/functions/codegen/cellwisetmpl20.R
new file mode 100644
index 0000000..072d86f
--- /dev/null
+++ b/src/test/scripts/functions/codegen/cellwisetmpl20.R
@@ -0,0 +1,32 @@
+#-------------------------------------------------------------
+#
+# 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, 1006), 500, 2, byrow=TRUE);
+
+R1 = (X/3) %% 0.6;
+R2 = (X/3) %/% 0.6;
+R = bitwAnd(R1, R2);
+
+writeMM(as(R,"CsparseMatrix"), paste(args[2], "S", sep=""));

http://git-wip-us.apache.org/repos/asf/systemml/blob/f627d07e/src/test/scripts/functions/codegen/cellwisetmpl20.dml
----------------------------------------------------------------------
diff --git a/src/test/scripts/functions/codegen/cellwisetmpl20.dml 
b/src/test/scripts/functions/codegen/cellwisetmpl20.dml
new file mode 100644
index 0000000..2d0a25a
--- /dev/null
+++ b/src/test/scripts/functions/codegen/cellwisetmpl20.dml
@@ -0,0 +1,28 @@
+#-------------------------------------------------------------
+#
+# 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, 1006), 500, 2);
+
+R1 = (X/3) %% 0.6;
+R2 = (X/3) %/% 0.6;
+R = bitwAnd(R1, R2);
+
+write(R, $1)

http://git-wip-us.apache.org/repos/asf/systemml/blob/f627d07e/src/test/scripts/functions/codegen/rowAggPattern39.R
----------------------------------------------------------------------
diff --git a/src/test/scripts/functions/codegen/rowAggPattern39.R 
b/src/test/scripts/functions/codegen/rowAggPattern39.R
new file mode 100644
index 0000000..7c341e0
--- /dev/null
+++ b/src/test/scripts/functions/codegen/rowAggPattern39.R
@@ -0,0 +1,32 @@
+#-------------------------------------------------------------
+#
+# 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, byrow=TRUE);
+
+Y = X/(rowSums(X)%*%matrix(1,1,ncol(X)))
+S = bitwAnd(X, Y);
+
+writeMM(as(S, "CsparseMatrix"), paste(args[2], "S", sep=""));

http://git-wip-us.apache.org/repos/asf/systemml/blob/f627d07e/src/test/scripts/functions/codegen/rowAggPattern39.dml
----------------------------------------------------------------------
diff --git a/src/test/scripts/functions/codegen/rowAggPattern39.dml 
b/src/test/scripts/functions/codegen/rowAggPattern39.dml
new file mode 100644
index 0000000..3cb4ff1
--- /dev/null
+++ b/src/test/scripts/functions/codegen/rowAggPattern39.dml
@@ -0,0 +1,27 @@
+#-------------------------------------------------------------
+#
+# 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 = bitwAnd(X, Y);
+
+write(S, $1);

Reply via email to