This is an automated email from the ASF dual-hosted git repository.

arnabp20 pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/systemml.git


The following commit(s) were added to refs/heads/master by this push:
     new 2671a55  [MINOR] Reuse rand and others, bug fixes
2671a55 is described below

commit 2671a55fedb826a8e560401e467d372b6dc70b34
Author: arnabp <[email protected]>
AuthorDate: Sun Jun 21 18:23:55 2020 +0200

    [MINOR] Reuse rand and others, bug fixes
    
    This patch enables reuse for rand(matrix) and few more
    instructions. Furthermore, it fixes a bug in eviction
    logic that was forming cycles in the linked lists.
---
 .../apache/sysds/runtime/instructions/cp/DataGenCPInstruction.java | 4 ++++
 src/main/java/org/apache/sysds/runtime/lineage/LineageCache.java   | 7 +++++--
 .../java/org/apache/sysds/runtime/lineage/LineageCacheConfig.java  | 6 ++++--
 src/test/scripts/functions/lineage/LineageReuseAlg3.dml            | 6 +++---
 src/test/scripts/functions/lineage/RewriteTest2.dml                | 6 +++---
 5 files changed, 19 insertions(+), 10 deletions(-)

diff --git 
a/src/main/java/org/apache/sysds/runtime/instructions/cp/DataGenCPInstruction.java
 
b/src/main/java/org/apache/sysds/runtime/instructions/cp/DataGenCPInstruction.java
index 464884c..6f92b8f 100644
--- 
a/src/main/java/org/apache/sysds/runtime/instructions/cp/DataGenCPInstruction.java
+++ 
b/src/main/java/org/apache/sysds/runtime/instructions/cp/DataGenCPInstruction.java
@@ -172,6 +172,10 @@ public class DataGenCPInstruction extends 
UnaryCPInstruction {
        public boolean isOnesCol() {
                return minValue == maxValue && minValue == 1 && sparsity == 1 
&& getCols() == 1;
        }
+
+       public boolean isMatrixCall() {
+               return minValue == maxValue && sparsity == 1;
+       }
        
        public long getFrom() {
                return seq_from.isLiteral() ? 
UtilFunctions.parseToLong(seq_from.getName()) : -1;
diff --git a/src/main/java/org/apache/sysds/runtime/lineage/LineageCache.java 
b/src/main/java/org/apache/sysds/runtime/lineage/LineageCache.java
index 1e875a4..5e56d84 100644
--- a/src/main/java/org/apache/sysds/runtime/lineage/LineageCache.java
+++ b/src/main/java/org/apache/sysds/runtime/lineage/LineageCache.java
@@ -375,6 +375,7 @@ public class LineageCache
                if (LineageCache.probe(probeItem)) {
                        LineageCacheEntry oe = getIntern(probeItem);
                        LineageCacheEntry e = _cache.get(item);
+                       boolean exists = !e.isNullVal();
                        if (oe.isMatrixValue())
                                e.setValue(oe.getMBValue(), computetime); 
                        else
@@ -386,8 +387,10 @@ public class LineageCache
                        // Add the SB/func entry to the list of items pointing 
to the same data.
                        // No cache size update is necessary.
                        // Maintain _origItem as head.
-                       e._nextEntry = oe._nextEntry;
-                       oe._nextEntry = e;
+                       if (!exists) {
+                               e._nextEntry = oe._nextEntry;
+                               oe._nextEntry = e;
+                       }
                        
                        //maintain order for eviction
                        LineageCacheEviction.addEntry(e);
diff --git 
a/src/main/java/org/apache/sysds/runtime/lineage/LineageCacheConfig.java 
b/src/main/java/org/apache/sysds/runtime/lineage/LineageCacheConfig.java
index 48fd186..b610a96 100644
--- a/src/main/java/org/apache/sysds/runtime/lineage/LineageCacheConfig.java
+++ b/src/main/java/org/apache/sysds/runtime/lineage/LineageCacheConfig.java
@@ -24,6 +24,7 @@ import org.apache.sysds.api.DMLScript;
 import org.apache.sysds.runtime.controlprogram.context.ExecutionContext;
 import org.apache.sysds.runtime.instructions.Instruction;
 import org.apache.sysds.runtime.instructions.cp.ComputationCPInstruction;
+import org.apache.sysds.runtime.instructions.cp.DataGenCPInstruction;
 import org.apache.sysds.runtime.instructions.cp.ListIndexingCPInstruction;
 import org.apache.sysds.runtime.instructions.cp.MatrixIndexingCPInstruction;
 
@@ -38,7 +39,7 @@ public class LineageCacheConfig
                "rightIndex", "leftIndex", "groupedagg", "r'", "solve", "spoof",
                "uamean", "max", "min", "ifelse", "-", "sqrt", ">", "uak+", 
"<=",
                "^", "uamax", "uark+", "uacmean", "eigen", "ctableexpand", 
"replace",
-               "^2", "uack+", "tak+*"
+               "^2", "uack+", "tak+*", "uacsqk+", "uark+"
                //TODO: Reuse everything. 
        };
        private static String[] REUSE_OPCODES  = new String[] {};
@@ -152,7 +153,8 @@ public class LineageCacheConfig
                boolean insttype = inst instanceof ComputationCPInstruction 
                        && !(inst instanceof ListIndexingCPInstruction);
                boolean rightop = (ArrayUtils.contains(REUSE_OPCODES, 
inst.getOpcode())
-                       || (inst.getOpcode().equals("append") && 
isVectorAppend(inst, ec)));
+                       || (inst.getOpcode().equals("append") && 
isVectorAppend(inst, ec))
+                       || (inst instanceof DataGenCPInstruction) && 
((DataGenCPInstruction) inst).isMatrixCall());
                boolean updateInplace = (inst instanceof 
MatrixIndexingCPInstruction)
                        && 
ec.getMatrixObject(((ComputationCPInstruction)inst).input1).getUpdateType().isInPlace();
                return insttype && rightop && !updateInplace;
diff --git a/src/test/scripts/functions/lineage/LineageReuseAlg3.dml 
b/src/test/scripts/functions/lineage/LineageReuseAlg3.dml
index 6b095cb..17e6b6d 100644
--- a/src/test/scripts/functions/lineage/LineageReuseAlg3.dml
+++ b/src/test/scripts/functions/lineage/LineageReuseAlg3.dml
@@ -23,7 +23,7 @@ findBetas = function(Matrix[double] X, Matrix[double] y)
              return (Matrix[double] all_betas)
 {
   R = matrix(0, rows=10*(ncol(X)+1), cols=5);
-  for (lamda in 20:25) {
+  for (lamda in 20:39) {
     #betas = multiLogReg(X=X, Y=y, maxii=0, verbose=FALSE);
     betas = multiLogReg(X=X, Y=y, icpt=2, tol=0.000001,
                         reg=lamda, maxi=100, maxii=0, verbose=FALSE);
@@ -36,7 +36,7 @@ findIcpt = function(Matrix[double] X, Matrix[double] y)
            return (Matrix[double] all_betas)
 {
   R = matrix(0, rows=12*(ncol(X)+2), cols=5);
-  for (lamda in 20:22) {
+  for (lamda in 20:29) {
     for (icpt in 1:2) {
       #Function level reuse of 3 out of 6 calls.
       betas = multiLogReg(X=X, Y=y, icpt=icpt, tol=0.000001,
@@ -49,7 +49,7 @@ findIcpt = function(Matrix[double] X, Matrix[double] y)
 }
 
 
-X = rand(rows=1000, cols=1000, sparsity=1.0, seed=42);
+X = rand(rows=1000, cols=100, sparsity=1.0, seed=42);
 y = rand(rows=1000, cols=1, min=0, max=6, sparsity=1.0, seed=42);
 y = floor(y);
 
diff --git a/src/test/scripts/functions/lineage/RewriteTest2.dml 
b/src/test/scripts/functions/lineage/RewriteTest2.dml
index 2ec31d9..f9c7e76 100644
--- a/src/test/scripts/functions/lineage/RewriteTest2.dml
+++ b/src/test/scripts/functions/lineage/RewriteTest2.dml
@@ -22,12 +22,12 @@
 X = read($1);
 
 sum = 0;
-tmp = X[,1];
+tmp = matrix(0, rows=nrow(X), cols=0);
 R = matrix(0, 1, ncol(X));
 
-for (i in 2:ncol(X)) {
-  Res1 = t(tmp) %*% tmp;
+for (i in 1:ncol(X)) {
   tmp = cbind(tmp, X[,i]);
+  Res1 = t(tmp) %*% tmp;
   while(FALSE) {}      
   R[1,i] = sum(Res1);
   sum = sum + sum(Res1);

Reply via email to