Repository: incubator-systemml
Updated Branches:
  refs/heads/master 2bc266298 -> fb82482b0


[SYSTEMML-1513] Additional unary/binary codegen row vector primitives

This patch adds compiler and runtime support for the following commonly
used row vector primitives: abs, round, ceil, floor, sign, pow2, mult2,
sqrt, min, max, plus, pow. Furthermore, this also includes additional
tests for complex rowwise fusion patterns.

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

Branch: refs/heads/master
Commit: f9f70b3a216a77414d81fe44dcb3a25cbc8a902d
Parents: 2bc2662
Author: Matthias Boehm <[email protected]>
Authored: Tue Apr 11 20:40:07 2017 -0700
Committer: Matthias Boehm <[email protected]>
Committed: Tue Apr 11 20:40:07 2017 -0700

----------------------------------------------------------------------
 .../sysml/hops/codegen/cplan/CNodeBinary.java   |  38 ++-
 .../sysml/hops/codegen/cplan/CNodeUnary.java    |  46 ++-
 .../hops/codegen/template/TemplateRow.java      |   8 +-
 .../runtime/codegen/LibSpoofPrimitives.java     | 324 ++++++++++++++++++-
 .../functions/codegen/RowAggTmplTest.java       |  34 +-
 .../scripts/functions/codegen/rowAggPattern14.R |  34 ++
 .../functions/codegen/rowAggPattern14.dml       |  28 ++
 .../scripts/functions/codegen/rowAggPattern15.R |  35 ++
 .../functions/codegen/rowAggPattern15.dml       |  29 ++
 9 files changed, 553 insertions(+), 23 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-systemml/blob/f9f70b3a/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 4d54cd1..180d352 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
@@ -29,10 +29,12 @@ public class CNodeBinary extends CNode
 {
        public enum BinType {
                DOT_PRODUCT,
-               VECT_MULT_ADD, VECT_DIV_ADD, VECT_MINUS_ADD,
+               VECT_MULT_ADD, VECT_DIV_ADD, VECT_MINUS_ADD, VECT_PLUS_ADD,
+               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_MULT_SCALAR, VECT_DIV_SCALAR, VECT_MINUS_SCALAR, 
+               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,
                MULT, DIV, PLUS, MINUS, MODULUS, INTDIV, 
@@ -61,6 +63,11 @@ public class CNodeBinary extends CNode
                                
                                case VECT_MULT_ADD:
                                case VECT_DIV_ADD:
+                               case VECT_MINUS_ADD:
+                               case VECT_PLUS_ADD:
+                               case VECT_POW_ADD:
+                               case VECT_MIN_ADD:
+                               case VECT_MAX_ADD:      
                                case VECT_EQUAL_ADD:
                                case VECT_NOTEQUAL_ADD:
                                case VECT_LESS_ADD:
@@ -72,9 +79,13 @@ public class CNodeBinary extends CNode
                                                                        "    
LibSpoofPrimitives.vect"+vectName+"Add(%IN1%, %IN2%, %OUT%, %POS1%, %POSOUT%, 
%LEN%);\n";
                                }
                                
+                               case VECT_MULT_SCALAR:
                                case VECT_DIV_SCALAR:
                                case VECT_MINUS_SCALAR:
-                               case VECT_MULT_SCALAR:
+                               case VECT_PLUS_SCALAR:
+                               case VECT_POW_SCALAR:
+                               case VECT_MIN_SCALAR:
+                               case VECT_MAX_SCALAR:   
                                case VECT_EQUAL_SCALAR:
                                case VECT_NOTEQUAL_SCALAR:
                                case VECT_LESS_SCALAR:
@@ -133,7 +144,10 @@ public class CNodeBinary extends CNode
                        }
                }
                public boolean isVectorScalarPrimitive() {
-                       return this == VECT_DIV_SCALAR || this == 
VECT_MULT_SCALAR || this == VECT_MINUS_SCALAR
+                       return this == VECT_DIV_SCALAR || this == 
VECT_MULT_SCALAR 
+                               || this == VECT_MINUS_SCALAR || this == 
VECT_PLUS_SCALAR
+                               || this == VECT_POW_SCALAR 
+                               || this == VECT_MIN_SCALAR || this == 
VECT_MAX_SCALAR
                                || this == VECT_EQUAL_SCALAR || this == 
VECT_NOTEQUAL_SCALAR
                                || this == VECT_LESS_SCALAR || this == 
VECT_LESSEQUAL_SCALAR
                                || this == VECT_GREATER_SCALAR || this == 
VECT_GREATEREQUAL_SCALAR;
@@ -215,6 +229,10 @@ public class CNodeBinary extends CNode
                        case VECT_MULT_ADD: return "b(vma)";
                        case VECT_DIV_ADD: return "b(vda)";
                        case VECT_MINUS_ADD: return "b(vmia)";
+                       case VECT_PLUS_ADD: return "b(vpa)";
+                       case VECT_POW_ADD: return "b(vpowa)";
+                       case VECT_MIN_ADD: return "b(vmina)";
+                       case VECT_MAX_ADD: return "b(vmaxa)";
                        case VECT_EQUAL_ADD: return "b(veqa)";
                        case VECT_NOTEQUAL_ADD: return "b(vneqa)";
                        case VECT_LESS_ADD: return "b(vlta)";
@@ -224,6 +242,10 @@ public class CNodeBinary extends CNode
                        case VECT_MULT_SCALAR:  return "b(vm)";
                        case VECT_DIV_SCALAR:  return "b(vd)";
                        case VECT_MINUS_SCALAR:  return "b(vmi)";
+                       case VECT_PLUS_SCALAR: return "b(vp)";
+                       case VECT_POW_SCALAR: return "b(vpow)";
+                       case VECT_MIN_SCALAR: return "b(vmin)";
+                       case VECT_MAX_SCALAR: return "b(vmax)";
                        case VECT_EQUAL_SCALAR: return "b(veq)";
                        case VECT_NOTEQUAL_SCALAR: return "b(vneq)";
                        case VECT_LESS_SCALAR: return "b(vlt)";
@@ -259,6 +281,10 @@ public class CNodeBinary extends CNode
                        case VECT_MULT_ADD: 
                        case VECT_DIV_ADD:
                        case VECT_MINUS_ADD:
+                       case VECT_PLUS_ADD:
+                       case VECT_POW_ADD:
+                       case VECT_MIN_ADD:
+                       case VECT_MAX_ADD:
                        case VECT_EQUAL_ADD: 
                        case VECT_NOTEQUAL_ADD: 
                        case VECT_LESS_ADD: 
@@ -273,6 +299,10 @@ public class CNodeBinary extends CNode
                        case VECT_DIV_SCALAR:   
                        case VECT_MULT_SCALAR:
                        case VECT_MINUS_SCALAR:
+                       case VECT_PLUS_SCALAR:
+                       case VECT_POW_SCALAR:
+                       case VECT_MIN_SCALAR:
+                       case VECT_MAX_SCALAR:
                        case VECT_EQUAL_SCALAR: 
                        case VECT_NOTEQUAL_SCALAR: 
                        case VECT_LESS_SCALAR: 

http://git-wip-us.apache.org/repos/asf/incubator-systemml/blob/f9f70b3a/src/main/java/org/apache/sysml/hops/codegen/cplan/CNodeUnary.java
----------------------------------------------------------------------
diff --git a/src/main/java/org/apache/sysml/hops/codegen/cplan/CNodeUnary.java 
b/src/main/java/org/apache/sysml/hops/codegen/cplan/CNodeUnary.java
index 437100f..30752a2 100644
--- a/src/main/java/org/apache/sysml/hops/codegen/cplan/CNodeUnary.java
+++ b/src/main/java/org/apache/sysml/hops/codegen/cplan/CNodeUnary.java
@@ -30,7 +30,8 @@ public class CNodeUnary extends CNode
        public enum UnaryType {
                LOOKUP_R, LOOKUP_RC, LOOKUP0, //codegen specific
                ROW_SUMS, ROW_MINS, ROW_MAXS, //codegen specific
-               VECT_EXP_SCALAR, VECT_LOG_SCALAR,
+               VECT_EXP, VECT_POW2, VECT_MULT2, VECT_SQRT, VECT_LOG,
+               VECT_ABS, VECT_ROUND, VECT_CEIL, VECT_FLOOR, VECT_SIGN, 
                EXP, POW2, MULT2, SQRT, LOG, LOG_NZ,
                ABS, ROUND, CEIL, FLOOR, SIGN, 
                SIN, COS, TAN, ASIN, ACOS, ATAN,
@@ -53,8 +54,16 @@ public class CNodeUnary extends CNode
                                                                        "    
double %TMP% = LibSpoofPrimitives.vect"+vectName+"(%IN1%, %POS1%, %LEN%);\n"; 
                                }
                        
-                               case VECT_EXP_SCALAR:
-                               case VECT_LOG_SCALAR: {
+                               case VECT_EXP:
+                               case VECT_POW2:
+                               case VECT_MULT2: 
+                               case VECT_SQRT: 
+                               case VECT_LOG:
+                               case VECT_ABS:
+                               case VECT_ROUND:
+                               case VECT_CEIL:
+                               case VECT_FLOOR:
+                               case VECT_SIGN: {
                                        String vectName = 
getVectorPrimitiveName();
                                        return sparse ? "    double[] %TMP% = 
LibSpoofPrimitives.vect"+vectName+"Write(%IN1v%, %IN1i%, %POS1%, %LEN%);\n" : 
                                                                        "    
double[] %TMP% = LibSpoofPrimitives.vect"+vectName+"Write(%IN1%, %POS1%, 
%LEN%);\n";
@@ -112,8 +121,11 @@ public class CNodeUnary extends CNode
                        }
                }
                public boolean isVectorScalarPrimitive() {
-                       return this == UnaryType.VECT_EXP_SCALAR 
-                               || this == UnaryType.VECT_LOG_SCALAR;
+                       return this == VECT_EXP || this == VECT_POW2
+                               || this == VECT_MULT2 || this == VECT_SQRT
+                               || this == VECT_LOG || this == VECT_ABS
+                               || this == VECT_ROUND || this == VECT_CEIL
+                               || this == VECT_FLOOR || this == VECT_SIGN;
                }
                public UnaryType getVectorAddPrimitive() {
                        return 
UnaryType.valueOf("VECT_"+getVectorPrimitiveName().toUpperCase()+"_ADD");
@@ -184,8 +196,16 @@ public class CNodeUnary extends CNode
                        case ROW_SUMS:  return "u(R+)";
                        case ROW_MINS:  return "u(Rmin)";
                        case ROW_MAXS:  return "u(Rmax)";
-                       case VECT_EXP_SCALAR: return "u(vexp)";
-                       case VECT_LOG_SCALAR: return "u(vlog)";
+                       case VECT_EXP:
+                       case VECT_POW2:
+                       case VECT_MULT2: 
+                       case VECT_SQRT: 
+                       case VECT_LOG:
+                       case VECT_ABS:
+                       case VECT_ROUND:
+                       case VECT_CEIL:
+                       case VECT_FLOOR:
+                       case VECT_SIGN: return 
"u(v"+_type.name().toLowerCase()+")";
                        case LOOKUP_R:  return "u(ixr)";
                        case LOOKUP_RC: return "u(ixrc)";
                        case LOOKUP0:   return "u(ix0)";
@@ -197,8 +217,16 @@ public class CNodeUnary extends CNode
        @Override
        public void setOutputDims() {
                switch(_type) {
-                       case VECT_EXP_SCALAR:
-                       case VECT_LOG_SCALAR:   
+                       case VECT_EXP:
+                       case VECT_POW2:
+                       case VECT_MULT2: 
+                       case VECT_SQRT: 
+                       case VECT_LOG:
+                       case VECT_ABS:
+                       case VECT_ROUND:
+                       case VECT_CEIL:
+                       case VECT_FLOOR:
+                       case VECT_SIGN: 
                                _rows = _inputs.get(0)._rows;
                                _cols = _inputs.get(0)._cols;
                                _dataType= DataType.MATRIX;

http://git-wip-us.apache.org/repos/asf/incubator-systemml/blob/f9f70b3a/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 2e1d9f8..ca9776d 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
@@ -57,8 +57,10 @@ import org.apache.sysml.runtime.matrix.data.Pair;
 public class TemplateRow extends TemplateBase 
 {
        private static final Hop.AggOp[] SUPPORTED_ROW_AGG = new 
AggOp[]{AggOp.SUM, AggOp.MIN, AggOp.MAX};
-       private static final Hop.OpOp1[] SUPPORTED_VECT_UNARY = new 
OpOp1[]{OpOp1.EXP, OpOp1.LOG};
-       private static final Hop.OpOp2[] SUPPORTED_VECT_BINARY = new 
OpOp2[]{OpOp2.MULT, OpOp2.DIV, OpOp2.MINUS, 
+       private static final Hop.OpOp1[] SUPPORTED_VECT_UNARY = new OpOp1[]{
+                       OpOp1.EXP, OpOp1.SQRT, OpOp1.LOG, OpOp1.ABS, 
OpOp1.ROUND, OpOp1.CEIL, OpOp1.FLOOR, OpOp1.SIGN};
+       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.EQUAL, OpOp2.NOTEQUAL, OpOp2.LESS, 
OpOp2.LESSEQUAL, OpOp2.GREATER, OpOp2.GREATEREQUAL};
        
        public TemplateRow() {
@@ -216,7 +218,7 @@ public class TemplateRow extends TemplateBase
                        if(hop.getInput().get(0).getDim1() > 1 && 
hop.getInput().get(0).getDim2() > 1 ) 
                        {
                                if( HopRewriteUtils.isUnary(hop, 
SUPPORTED_VECT_UNARY) ) {
-                                       String opname = 
"VECT_"+((UnaryOp)hop).getOp().name()+"_SCALAR";
+                                       String opname = 
"VECT_"+((UnaryOp)hop).getOp().name();
                                        out = new CNodeUnary(cdata1, 
UnaryType.valueOf(opname));
                                }
                                else 

http://git-wip-us.apache.org/repos/asf/incubator-systemml/blob/f9f70b3a/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 9283c46..7a9adeb 100644
--- a/src/main/java/org/apache/sysml/runtime/codegen/LibSpoofPrimitives.java
+++ b/src/main/java/org/apache/sysml/runtime/codegen/LibSpoofPrimitives.java
@@ -127,7 +127,7 @@ public class LibSpoofPrimitives
                for( int i = ai; i < ai+len; i++ )
                        val = Math.min(a[i], val);
                return val; 
-       } 
+       }
        
        public static double vectMin(double[] avals, int[] aix, int ai, int 
len) {
                double val = Double.MAX_VALUE;
@@ -155,7 +155,7 @@ public class LibSpoofPrimitives
        public static void vectDivAdd(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] / bval;
-       } 
+       }
 
        public static void vectDivAdd(double[] a, double bval, double[] c, 
int[] aix, int ai, int ci, int len) {
                for( int j = ai; j < ai+len; j++ )
@@ -181,7 +181,7 @@ public class LibSpoofPrimitives
        public static void vectMinusAdd(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] - bval;
-       } 
+       }
 
        public static void vectMinusAdd(double[] a, double bval, double[] c, 
int[] aix, int ai, int ci, int len) {
                for( int j = ai; j < ai+len; j++ )
@@ -194,20 +194,124 @@ public class LibSpoofPrimitives
                        c[j] = a[ai] - bval;
                return c;
        }
-
+       
        public static double[] vectMinusWrite(double[] a, double bval, int[] 
aix, int ai, int len) {
                double[] c = allocVector(len, true);
                for( int j = ai; j < ai+len; j++ )
                        c[aix[j]] = a[j] - bval;
                return c;
        }
+       
+       //custom vector plus
+       
+       public static void vectPlusAdd(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] + bval;
+       }
+
+       public static void vectPlusAdd(double[] a, double bval, double[] c, 
int[] aix, int ai, int ci, int len) {
+               for( int j = ai; j < ai+len; j++ )
+                       c[ci + aix[j]] += a[j] + bval;
+       }
+       
+       public static double[] vectPlusWrite(double[] a, double bval, int ai, 
int len) {
+               double[] c = allocVector(len, false);
+               for( int j = 0; j < len; j++, ai++)
+                       c[j] = a[ai] + bval;
+               return c;
+       }
+
+       public static double[] vectPlusWrite(double[] a, double bval, int[] 
aix, int ai, int len) {
+               double[] c = allocVector(len, true);
+               for( int j = ai; j < ai+len; j++ )
+                       c[aix[j]] = a[j] + bval;
+               return c;
+       }
+       
+       //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);
+       }
+
+       public static void vectPowAdd(double[] a, double bval, double[] c, 
int[] aix, int ai, int ci, int len) {
+               for( int j = ai; j < ai+len; j++ )
+                       c[ci + aix[j]] += Math.pow(a[j], bval);
+       }
+       
+       public static double[] vectPowWrite(double[] a, double bval, int ai, 
int len) {
+               double[] c = allocVector(len, false);
+               for( int j = 0; j < len; j++, ai++)
+                       c[j] = Math.pow(a[ai], bval);
+               return c;
+       }
+
+       public static double[] vectPowWrite(double[] a, double bval, int[] aix, 
int ai, int len) {
+               double[] c = allocVector(len, true);
+               for( int j = ai; j < ai+len; j++ )
+                       c[aix[j]] = Math.pow(a[j], bval);
+               return c;
+       }
+       
+       //custom vector min
+       
+       public static void vectMinAdd(double[] a, double bval, double[] c, int 
ai, int ci, int len) {
+               for( int j = ai; j < ai+len; j++, ci++)
+                       c[ci] += Math.min(a[j], bval);
+       }
+
+       public static void vectMinAdd(double[] a, double bval, double[] c, 
int[] aix, int ai, int ci, int len) {
+               for( int j = ai; j < ai+len; j++ )
+                       c[ci + aix[j]] += Math.min(a[j], bval);
+       }
+       
+       public static double[] vectMinWrite(double[] a, double bval, int ai, 
int len) {
+               double[] c = allocVector(len, false);
+               for( int j = 0; j < len; j++, ai++)
+                       c[j] = Math.min(a[ai], bval);
+               return c;
+       }
+
+       public static double[] vectMinWrite(double[] a, double bval, int[] aix, 
int ai, int len) {
+               double[] c = allocVector(len, true);
+               for( int j = ai; j < ai+len; j++ )
+                       c[aix[j]] = Math.min(a[j], bval);
+               return c;
+       }
+       
+       //custom vector max
+       
+       public static void vectMaxAdd(double[] a, double bval, double[] c, int 
ai, int ci, int len) {
+               for( int j = ai; j < ai+len; j++, ci++)
+                       c[ci] += Math.max(a[j], bval);
+       }
+
+       public static void vectMaxAdd(double[] a, double bval, double[] c, 
int[] aix, int ai, int ci, int len) {
+               for( int j = ai; j < ai+len; j++ )
+                       c[ci + aix[j]] += Math.max(a[j], bval);
+       }
+       
+       public static double[] vectMaxWrite(double[] a, double bval, int ai, 
int len) {
+               double[] c = allocVector(len, false);
+               for( int j = 0; j < len; j++, ai++)
+                       c[j] = Math.max(a[ai], bval);
+               return c;
+       }
+
+       public static double[] vectMaxWrite(double[] a, double bval, int[] aix, 
int ai, int len) {
+               double[] c = allocVector(len, true);
+               for( int j = ai; j < ai+len; j++ )
+                       c[aix[j]] = Math.max(a[j], bval);
+               return c;
+       }
 
        //custom exp
        
        public static void vectExpAdd(double[] a, double[] c, int ai, int ci, 
int len) {
                for( int j = ai; j < ai+len; j++, ci++)
                        c[ci] +=  FastMath.exp(a[j]);
-       } 
+       }
 
        public static void vectExpAdd(double[] a, double[] c, int[] aix, int 
ai, int ci, int len) {
                for( int j = ai; j < ai+len; j++ )
@@ -233,7 +337,7 @@ public class LibSpoofPrimitives
        public static void vectLogAdd(double[] a, double[] c, int ai, int ci, 
int len) {
                for( int j = ai; j < ai+len; j++, ci++)
                        c[ci] +=  FastMath.log(a[j]);
-       } 
+       }
 
        public static void vectLogAdd(double[] a, double[] c, int[] aix, int 
ai, int ci, int len) {
                for( int j = ai; j < ai+len; j++ )
@@ -254,6 +358,214 @@ public class LibSpoofPrimitives
                return c;
        }
        
+       //custom abs
+       
+       public static void vectAbsAdd(double[] a, double[] c, int ai, int ci, 
int len) {
+               for( int j = ai; j < ai+len; j++, ci++)
+                       c[ci] +=  Math.abs(a[j]);
+       }
+
+       public static void vectAbsAdd(double[] a, double[] c, int[] aix, int 
ai, int ci, int len) {
+               for( int j = ai; j < ai+len; j++ )
+                       c[ci + aix[j]] += Math.log(a[j]);
+       }
+       
+       public static double[] vectAbsWrite(double[] a, int ai, int len) {
+               double[] c = allocVector(len, false);
+               for( int j = 0; j < len; j++, ai++)
+                       c[j] = Math.log(a[ai]);
+               return c;
+       }
+
+       public static double[] vectAbsWrite(double[] a, int[] aix, int ai, int 
len) {
+               double[] c = allocVector(len, true);
+               for( int j = ai; j < ai+len; j++ )
+                       c[aix[j]] = Math.log(a[j]);
+               return c;
+       }
+       
+       //custom round
+       
+       public static void vectRoundAdd(double[] a, double[] c, int ai, int ci, 
int len) {
+               for( int j = ai; j < ai+len; j++, ci++)
+                       c[ci] +=  Math.round(a[j]);
+       }
+
+       public static void vectRoundAdd(double[] a, double[] c, int[] aix, int 
ai, int ci, int len) {
+               for( int j = ai; j < ai+len; j++ )
+                       c[ci + aix[j]] += Math.round(a[j]);
+       }
+       
+       public static double[] vectRoundWrite(double[] a, int ai, int len) {
+               double[] c = allocVector(len, false);
+               for( int j = 0; j < len; j++, ai++)
+                       c[j] = Math.round(a[ai]);
+               return c;
+       }
+
+       public static double[] vectRoundWrite(double[] a, int[] aix, int ai, 
int len) {
+               double[] c = allocVector(len, true);
+               for( int j = ai; j < ai+len; j++ )
+                       c[aix[j]] = Math.round(a[j]);
+               return c;
+       }
+       
+       //custom ceil
+       
+       public static void vectCeilAdd(double[] a, double[] c, int ai, int ci, 
int len) {
+               for( int j = ai; j < ai+len; j++, ci++)
+                       c[ci] +=  FastMath.ceil(a[j]);
+       }
+
+       public static void vectCeilAdd(double[] a, double[] c, int[] aix, int 
ai, int ci, int len) {
+               for( int j = ai; j < ai+len; j++ )
+                       c[ci + aix[j]] += FastMath.ceil(a[j]);
+       }
+       
+       public static double[] vectCeilWrite(double[] a, int ai, int len) {
+               double[] c = allocVector(len, false);
+               for( int j = 0; j < len; j++, ai++)
+                       c[j] = FastMath.ceil(a[ai]);
+               return c;
+       }
+
+       public static double[] vectCeilWrite(double[] a, int[] aix, int ai, int 
len) {
+               double[] c = allocVector(len, true);
+               for( int j = ai; j < ai+len; j++ )
+                       c[aix[j]] = FastMath.ceil(a[j]);
+               return c;
+       }
+       
+       //custom floor
+       
+       public static void vectFloorAdd(double[] a, double[] c, int ai, int ci, 
int len) {
+               for( int j = ai; j < ai+len; j++, ci++)
+                       c[ci] +=  FastMath.floor(a[j]);
+       }
+
+       public static void vectFloorAdd(double[] a, double[] c, int[] aix, int 
ai, int ci, int len) {
+               for( int j = ai; j < ai+len; j++ )
+                       c[ci + aix[j]] += FastMath.floor(a[j]);
+       }
+       
+       public static double[] vectFloorWrite(double[] a, int ai, int len) {
+               double[] c = allocVector(len, false);
+               for( int j = 0; j < len; j++, ai++)
+                       c[j] = FastMath.floor(a[ai]);
+               return c;
+       }
+
+       public static double[] vectFloorWrite(double[] a, int[] aix, int ai, 
int len) {
+               double[] c = allocVector(len, true);
+               for( int j = ai; j < ai+len; j++ )
+                       c[aix[j]] = FastMath.floor(a[j]);
+               return c;
+       }
+       
+       //custom sign
+       
+       public static void vectSignAdd(double[] a, double[] c, int ai, int ci, 
int len) {
+               for( int j = ai; j < ai+len; j++, ci++)
+                       c[ci] +=  FastMath.signum(a[j]);
+       }
+
+       public static void vectSignAdd(double[] a, double[] c, int[] aix, int 
ai, int ci, int len) {
+               for( int j = ai; j < ai+len; j++ )
+                       c[ci + aix[j]] += FastMath.signum(a[j]);
+       }
+       
+       public static double[] vectSignWrite(double[] a, int ai, int len) {
+               double[] c = allocVector(len, false);
+               for( int j = 0; j < len; j++, ai++)
+                       c[j] = FastMath.signum(a[ai]);
+               return c;
+       }
+
+       public static double[] vectSignWrite(double[] a, int[] aix, int ai, int 
len) {
+               double[] c = allocVector(len, true);
+               for( int j = ai; j < ai+len; j++ )
+                       c[aix[j]] = FastMath.signum(a[j]);
+               return c;
+       }
+       
+       //custom pow2
+       
+       public static void vectPow2Add(double[] a, double[] c, int ai, int ci, 
int len) {
+               for( int j = ai; j < ai+len; j++, ci++)
+                       c[ci] +=  a[j] * a[j];
+       }
+
+       public static void vectPow2Add(double[] a, double[] c, int[] aix, int 
ai, int ci, int len) {
+               for( int j = ai; j < ai+len; j++ )
+                       c[ci + aix[j]] += a[j] * a[j];
+       }
+       
+       public static double[] vectPow2Write(double[] a, int ai, int len) {
+               double[] c = allocVector(len, false);
+               for( int j = 0; j < len; j++, ai++)
+                       c[j] = a[ai] * a[ai];
+               return c;
+       }
+
+       public static double[] vectPow2Write(double[] a, int[] aix, int ai, int 
len) {
+               double[] c = allocVector(len, true);
+               for( int j = ai; j < ai+len; j++ )
+                       c[aix[j]] = a[j] * a[j];
+               return c;
+       }
+       
+       //custom mult2
+       
+       public static void vectMult2Add(double[] a, double[] c, int ai, int ci, 
int len) {
+               for( int j = ai; j < ai+len; j++, ci++)
+                       c[ci] +=  a[j] + a[j];
+       }
+
+       public static void vectMult2Add(double[] a, double[] c, int[] aix, int 
ai, int ci, int len) {
+               for( int j = ai; j < ai+len; j++ )
+                       c[ci + aix[j]] += a[j] + a[j];
+       }
+       
+       public static double[] vectMult2Write(double[] a, int ai, int len) {
+               double[] c = allocVector(len, false);
+               for( int j = 0; j < len; j++, ai++)
+                       c[j] = a[ai] + a[ai];
+               return c;
+       }
+
+       public static double[] vectMult2Write(double[] a, int[] aix, int ai, 
int len) {
+               double[] c = allocVector(len, true);
+               for( int j = ai; j < ai+len; j++ )
+                       c[aix[j]] = a[j] + a[j];
+               return c;
+       }
+       
+       //custom sqrt
+       
+       public static void vectSqrtAdd(double[] a, double[] c, int ai, int ci, 
int len) {
+               for( int j = ai; j < ai+len; j++, ci++)
+                       c[ci] +=  Math.sqrt(a[j]);
+       }
+
+       public static void vectSqrtAdd(double[] a, double[] c, int[] aix, int 
ai, int ci, int len) {
+               for( int j = ai; j < ai+len; j++ )
+                       c[ci + aix[j]] += Math.sqrt(a[j]);
+       }
+       
+       public static double[] vectSqrtWrite(double[] a, int ai, int len) {
+               double[] c = allocVector(len, false);
+               for( int j = 0; j < len; j++, ai++)
+                       c[j] = Math.sqrt(a[ai]);
+               return c;
+       }
+
+       public static double[] vectSqrtWrite(double[] a, int[] aix, int ai, int 
len) {
+               double[] c = allocVector(len, true);
+               for( int j = ai; j < ai+len; j++ )
+                       c[aix[j]] = Math.sqrt(a[j]);
+               return c;
+       }
+       
        //custom vector equal
        
        public static void vectEqualAdd(double[] a, double bval, double[] c, 
int ai, int ci, int len) {

http://git-wip-us.apache.org/repos/asf/incubator-systemml/blob/f9f70b3a/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 865080a..4037edb 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
@@ -49,6 +49,8 @@ public class RowAggTmplTest extends AutomatedTestBase
        private static final String TEST_NAME11 = TEST_NAME+"11"; //y - X %*% v
        private static final String TEST_NAME12 = TEST_NAME+"12"; //Y=(X>=v); 
R=Y/rowSums(Y)
        private static final String TEST_NAME13 = TEST_NAME+"13"; 
//rowSums(X)+rowSums(Y)
+       private static final String TEST_NAME14 = TEST_NAME+"14"; 
//colSums(max(floor(round(abs(min(sign(X+Y),1)))),7))
+       private static final String TEST_NAME15 = TEST_NAME+"15"; //systemml nn 
- softmax backward (partially)
        
        private static final String TEST_DIR = "functions/codegen/";
        private static final String TEST_CLASS_DIR = TEST_DIR + 
RowAggTmplTest.class.getSimpleName() + "/";
@@ -60,7 +62,7 @@ public class RowAggTmplTest extends AutomatedTestBase
        @Override
        public void setUp() {
                TestUtils.clearAssertionInformation();
-               for(int i=1; i<=13; i++)
+               for(int i=1; i<=15; i++)
                        addTestConfiguration( TEST_NAME+i, new 
TestConfiguration(TEST_CLASS_DIR, TEST_NAME+i, new String[] { String.valueOf(i) 
}) );
        }
        
@@ -259,6 +261,36 @@ public class RowAggTmplTest extends AutomatedTestBase
                testCodegenIntegration( TEST_NAME13, false, ExecType.SPARK );
        }
        
+       @Test   
+       public void testCodegenRowAggRewrite14CP() {
+               testCodegenIntegration( TEST_NAME14, true, ExecType.CP );
+       }
+       
+       @Test
+       public void testCodegenRowAgg14CP() {
+               testCodegenIntegration( TEST_NAME14, false, ExecType.CP );
+       }
+       
+       @Test
+       public void testCodegenRowAgg14SP() {
+               testCodegenIntegration( TEST_NAME14, false, ExecType.SPARK );
+       }
+       
+       @Test   
+       public void testCodegenRowAggRewrite15CP() {
+               testCodegenIntegration( TEST_NAME15, true, ExecType.CP );
+       }
+       
+       @Test
+       public void testCodegenRowAgg15CP() {
+               testCodegenIntegration( TEST_NAME15, false, ExecType.CP );
+       }
+       
+       @Test
+       public void testCodegenRowAgg15SP() {
+               testCodegenIntegration( TEST_NAME15, 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/incubator-systemml/blob/f9f70b3a/src/test/scripts/functions/codegen/rowAggPattern14.R
----------------------------------------------------------------------
diff --git a/src/test/scripts/functions/codegen/rowAggPattern14.R 
b/src/test/scripts/functions/codegen/rowAggPattern14.R
new file mode 100644
index 0000000..34589e1
--- /dev/null
+++ b/src/test/scripts/functions/codegen/rowAggPattern14.R
@@ -0,0 +1,34 @@
+#-------------------------------------------------------------
+#
+# 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,1500), 150, 10, byrow=TRUE);
+y = seq(1,150);
+
+Z = pmax(floor(round(abs(pmin(sign(X+y),1)))),7);
+R = t(colSums(Z));
+
+writeMM(as(R, "CsparseMatrix"), paste(args[2], "S", sep="")); 

http://git-wip-us.apache.org/repos/asf/incubator-systemml/blob/f9f70b3a/src/test/scripts/functions/codegen/rowAggPattern14.dml
----------------------------------------------------------------------
diff --git a/src/test/scripts/functions/codegen/rowAggPattern14.dml 
b/src/test/scripts/functions/codegen/rowAggPattern14.dml
new file mode 100644
index 0000000..f13c1ff
--- /dev/null
+++ b/src/test/scripts/functions/codegen/rowAggPattern14.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(1,1500), rows=150, cols=10);
+y = seq(1,150);
+
+Z = max(floor(round(abs(min(sign(X+y),1)))),7)
+R = colSums(Z); 
+
+write(R, $1)

http://git-wip-us.apache.org/repos/asf/incubator-systemml/blob/f9f70b3a/src/test/scripts/functions/codegen/rowAggPattern15.R
----------------------------------------------------------------------
diff --git a/src/test/scripts/functions/codegen/rowAggPattern15.R 
b/src/test/scripts/functions/codegen/rowAggPattern15.R
new file mode 100644
index 0000000..a24679a
--- /dev/null
+++ b/src/test/scripts/functions/codegen/rowAggPattern15.R
@@ -0,0 +1,35 @@
+#-------------------------------------------------------------
+#
+# 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,1500), 150, 10, byrow=TRUE);
+
+Y1 = X - rowMaxs(X) 
+Y2 = exp(Y1)
+Y3 = Y2 / rowSums(Y2)
+R = Y3 * rowSums(Y3)
+
+writeMM(as(R, "CsparseMatrix"), paste(args[2], "S", sep="")); 

http://git-wip-us.apache.org/repos/asf/incubator-systemml/blob/f9f70b3a/src/test/scripts/functions/codegen/rowAggPattern15.dml
----------------------------------------------------------------------
diff --git a/src/test/scripts/functions/codegen/rowAggPattern15.dml 
b/src/test/scripts/functions/codegen/rowAggPattern15.dml
new file mode 100644
index 0000000..d51397a
--- /dev/null
+++ b/src/test/scripts/functions/codegen/rowAggPattern15.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,1500), rows=150, cols=10);
+
+Y1 = X - rowMaxs(X) 
+Y2 = exp(Y1)
+Y3 = Y2 / rowSums(Y2)
+R = Y3 * rowSums(Y3)
+
+write(R, $1)

Reply via email to