[SYSTEMML-1472] Improved codegen handling of empty inputs w/o alloc

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

Branch: refs/heads/master
Commit: f2ea6336fea757ba0fb81f315af9bb97df6615d3
Parents: 5744e75
Author: Matthias Boehm <[email protected]>
Authored: Thu Apr 6 17:14:45 2017 -0700
Committer: Matthias Boehm <[email protected]>
Committed: Thu Apr 6 21:16:30 2017 -0700

----------------------------------------------------------------------
 .../org/apache/sysml/hops/codegen/cplan/CNodeTernary.java   | 2 +-
 .../org/apache/sysml/hops/codegen/cplan/CNodeUnary.java     | 4 ++--
 .../org/apache/sysml/runtime/codegen/SpoofOperator.java     | 9 +++++++--
 .../integration/functions/codegen/MultiAggTmplTest.java     | 8 ++++----
 4 files changed, 14 insertions(+), 9 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-systemml/blob/f2ea6336/src/main/java/org/apache/sysml/hops/codegen/cplan/CNodeTernary.java
----------------------------------------------------------------------
diff --git 
a/src/main/java/org/apache/sysml/hops/codegen/cplan/CNodeTernary.java 
b/src/main/java/org/apache/sysml/hops/codegen/cplan/CNodeTernary.java
index a8bbcb2..b3b1942 100644
--- a/src/main/java/org/apache/sysml/hops/codegen/cplan/CNodeTernary.java
+++ b/src/main/java/org/apache/sysml/hops/codegen/cplan/CNodeTernary.java
@@ -54,7 +54,7 @@ public class CNodeTernary extends CNode
                                        return "    double %TMP% = 
Double.isNaN(%IN1%) ? %IN3% : %IN1%;\n";
                                        
                                case LOOKUP_RC1:
-                                       return "    double %TMP% = 
%IN1%[rowIndex*%IN2%+%IN3%-1];\n";   
+                                       return "    double %TMP% = 
getValue(%IN1%, rowIndex*%IN2%+%IN3%-1);\n"; 
                                        
                                default: 
                                        throw new RuntimeException("Invalid 
ternary type: "+this.toString());

http://git-wip-us.apache.org/repos/asf/incubator-systemml/blob/f2ea6336/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 e28a989..9d3a877 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
@@ -48,9 +48,9 @@ public class CNodeUnary extends CNode
                                case EXP:
                                        return "    double %TMP% = 
FastMath.exp(%IN1%);\n";
                            case LOOKUP_R:
-                                       return "    double %TMP% = 
%IN1%[rowIndex];\n";
+                               return "    double %TMP% = getValue(%IN1%, 
rowIndex);\n";
                            case LOOKUP_RC:
-                                       return "    double %TMP% = 
%IN1%[rowIndex*n+colIndex];\n";      
+                               return "    double %TMP% = getValue(%IN1%, 
rowIndex*n+colIndex);\n";    
                                case LOOKUP0:
                                        return "    double %TMP% = %IN1%[0];\n" 
;
                                case POW2:

http://git-wip-us.apache.org/repos/asf/incubator-systemml/blob/f2ea6336/src/main/java/org/apache/sysml/runtime/codegen/SpoofOperator.java
----------------------------------------------------------------------
diff --git a/src/main/java/org/apache/sysml/runtime/codegen/SpoofOperator.java 
b/src/main/java/org/apache/sysml/runtime/codegen/SpoofOperator.java
index c62a535..ced10f9 100644
--- a/src/main/java/org/apache/sysml/runtime/codegen/SpoofOperator.java
+++ b/src/main/java/org/apache/sysml/runtime/codegen/SpoofOperator.java
@@ -70,8 +70,7 @@ public abstract class SpoofOperator implements Serializable
                for(int i=offset; i<offset+len; i++) {
                        //convert empty or sparse to dense temporary block 
(note: we don't do
                        //this in place because this block might be used by 
multiple threads)
-                       if( (inputs.get(i).isEmptyBlock(false) && 
!inputs.get(i).isAllocated())
-                               || inputs.get(i).isInSparseFormat() ) {
+                       if( inputs.get(i).isInSparseFormat() && 
inputs.get(i).isAllocated() ) {
                                MatrixBlock tmp = inputs.get(i);
                                b[i-offset] = 
DataConverter.convertToDoubleVector(tmp);
                                LOG.warn(getClass().getName()+": Converted 
"+tmp.getNumRows()+"x"+tmp.getNumColumns()+
@@ -92,4 +91,10 @@ public abstract class SpoofOperator implements Serializable
                        scalars[i] = scalarObjects.get(i).getDoubleValue();
                return scalars;
        }
+       
+       //abstraction for safely accessing sideways matrices without the need 
+       //to allocate empty matrices as dense, see prepInputMatrices
+       protected static double getValue(double[] data, int index) {
+               return (data!=null) ? data[index] : 0;
+       }
 }

http://git-wip-us.apache.org/repos/asf/incubator-systemml/blob/f2ea6336/src/test/java/org/apache/sysml/test/integration/functions/codegen/MultiAggTmplTest.java
----------------------------------------------------------------------
diff --git 
a/src/test/java/org/apache/sysml/test/integration/functions/codegen/MultiAggTmplTest.java
 
b/src/test/java/org/apache/sysml/test/integration/functions/codegen/MultiAggTmplTest.java
index 21aabb8..b25d496 100644
--- 
a/src/test/java/org/apache/sysml/test/integration/functions/codegen/MultiAggTmplTest.java
+++ 
b/src/test/java/org/apache/sysml/test/integration/functions/codegen/MultiAggTmplTest.java
@@ -59,12 +59,12 @@ public class MultiAggTmplTest extends AutomatedTestBase
        }
 
        @Test   
-       public void testCodegenRowAgg1CP() {
+       public void testCodegenMultiAgg1CP() {
                testCodegenIntegration( TEST_NAME1, false, ExecType.CP );
        }
        
        @Test   
-       public void testCodegenRowAgg1Spark() {
+       public void testCodegenMultiAgg1Spark() {
                testCodegenIntegration( TEST_NAME1, false, ExecType.SPARK );
        }
        
@@ -74,12 +74,12 @@ public class MultiAggTmplTest extends AutomatedTestBase
        }
 
        @Test   
-       public void testCodegenRowAgg2CP() {
+       public void testCodegenMultiAgg2CP() {
                testCodegenIntegration( TEST_NAME2, false, ExecType.CP );
        }
        
        @Test   
-       public void testCodegenRowAgg2Spark() {
+       public void testCodegenMultiAgg2Spark() {
                testCodegenIntegration( TEST_NAME2, false, ExecType.SPARK );
        }
        

Reply via email to