Repository: incubator-systemml
Updated Branches:
  refs/heads/master 354ec0217 -> 28467c3fe


[SYSTEMML-410] Fix UpdateInPlace intermediate candidate


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

Branch: refs/heads/master
Commit: 28467c3fea6b8ed86ecfdc7d321bbd2390745010
Parents: 354ec02
Author: Arvind Surve <[email protected]>
Authored: Mon Mar 7 12:05:56 2016 -0800
Committer: Arvind Surve <[email protected]>
Committed: Mon Mar 7 12:05:56 2016 -0800

----------------------------------------------------------------------
 .../java/org/apache/sysml/hops/DataGenOp.java   |  3 +-
 .../apache/sysml/hops/recompile/Recompiler.java |  2 +-
 .../parfor/opt/OptimizerConstrained.java        |  4 +-
 .../parfor/opt/OptimizerRuleBased.java          | 99 +++++++++++++++-----
 .../instructions/cp/VariableCPInstruction.java  |  3 +-
 .../java/org/apache/sysml/utils/Explain.java    |  4 +-
 .../java/org/apache/sysml/utils/Statistics.java | 16 ++++
 .../updateinplace/UpdateInPlaceTest.java        | 48 ++++++----
 .../functions/updateinplace/updateinplace10.dml |  2 +
 9 files changed, 130 insertions(+), 51 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-systemml/blob/28467c3f/src/main/java/org/apache/sysml/hops/DataGenOp.java
----------------------------------------------------------------------
diff --git a/src/main/java/org/apache/sysml/hops/DataGenOp.java 
b/src/main/java/org/apache/sysml/hops/DataGenOp.java
index c8d7fc4..c584d9c 100644
--- a/src/main/java/org/apache/sysml/hops/DataGenOp.java
+++ b/src/main/java/org/apache/sysml/hops/DataGenOp.java
@@ -168,7 +168,8 @@ public class DataGenOp extends Hop implements 
MultiThreadedHop
                                
(getRowsInBlock()>0)?getRowsInBlock():DMLTranslator.DMLBlockSize, 
                                
(getColsInBlock()>0)?getColsInBlock():DMLTranslator.DMLBlockSize,  
                                //actual rand nnz might differ (in cp/mr they 
are corrected after execution)
-                               (_op==DataGenMethod.RAND && et==ExecType.SPARK 
&& getNnz()!=0) ? -1 : getNnz() );
+                               (_op==DataGenMethod.RAND && et==ExecType.SPARK 
&& getNnz()!=0) ? -1 : getNnz(),
+                               getUpdateInPlace());
                
                setLineNumbers(rnd);
                setLops(rnd);

http://git-wip-us.apache.org/repos/asf/incubator-systemml/blob/28467c3f/src/main/java/org/apache/sysml/hops/recompile/Recompiler.java
----------------------------------------------------------------------
diff --git a/src/main/java/org/apache/sysml/hops/recompile/Recompiler.java 
b/src/main/java/org/apache/sysml/hops/recompile/Recompiler.java
index 0f2add5..aa0eb03 100644
--- a/src/main/java/org/apache/sysml/hops/recompile/Recompiler.java
+++ b/src/main/java/org/apache/sysml/hops/recompile/Recompiler.java
@@ -905,7 +905,7 @@ public class Recompiler
                
        }
        
-
+       
        /**
         * 
         * @param oldCallVars

http://git-wip-us.apache.org/repos/asf/incubator-systemml/blob/28467c3f/src/main/java/org/apache/sysml/runtime/controlprogram/parfor/opt/OptimizerConstrained.java
----------------------------------------------------------------------
diff --git 
a/src/main/java/org/apache/sysml/runtime/controlprogram/parfor/opt/OptimizerConstrained.java
 
b/src/main/java/org/apache/sysml/runtime/controlprogram/parfor/opt/OptimizerConstrained.java
index 3c67bd7..5f3fb75 100644
--- 
a/src/main/java/org/apache/sysml/runtime/controlprogram/parfor/opt/OptimizerConstrained.java
+++ 
b/src/main/java/org/apache/sysml/runtime/controlprogram/parfor/opt/OptimizerConstrained.java
@@ -162,7 +162,7 @@ public class OptimizerConstrained extends OptimizerRuleBased
                
                        //rewrite 14:
                        HashSet<String> inplaceResultVars = new 
HashSet<String>();
-                       super.rewriteSetInPlaceResultIndexing(pn, M1, 
ec.getVariables(), inplaceResultVars);
+                       super.rewriteSetInPlaceResultIndexing(pn, M1, 
ec.getVariables(), inplaceResultVars, ec);
                        
                        //rewrite 15:
                        super.rewriteDisableCPCaching(pn, inplaceResultVars, 
ec.getVariables());
@@ -178,7 +178,7 @@ public class OptimizerConstrained extends OptimizerRuleBased
 
                        // rewrite 14: set in-place result indexing
                        HashSet<String> inplaceResultVars = new 
HashSet<String>();
-                       super.rewriteSetInPlaceResultIndexing(pn, M1, 
ec.getVariables(), inplaceResultVars);
+                       super.rewriteSetInPlaceResultIndexing(pn, M1, 
ec.getVariables(), inplaceResultVars, ec);
                        
                        if( !OptimizerUtils.isSparkExecutionMode() ) {
                                // rewrite 16: runtime piggybacking

http://git-wip-us.apache.org/repos/asf/incubator-systemml/blob/28467c3f/src/main/java/org/apache/sysml/runtime/controlprogram/parfor/opt/OptimizerRuleBased.java
----------------------------------------------------------------------
diff --git 
a/src/main/java/org/apache/sysml/runtime/controlprogram/parfor/opt/OptimizerRuleBased.java
 
b/src/main/java/org/apache/sysml/runtime/controlprogram/parfor/opt/OptimizerRuleBased.java
index 6c4d254..6d17a06 100644
--- 
a/src/main/java/org/apache/sysml/runtime/controlprogram/parfor/opt/OptimizerRuleBased.java
+++ 
b/src/main/java/org/apache/sysml/runtime/controlprogram/parfor/opt/OptimizerRuleBased.java
@@ -35,6 +35,7 @@ import org.apache.hadoop.fs.Path;
 import org.apache.sysml.conf.ConfigurationManager;
 import org.apache.sysml.conf.DMLConfig;
 import org.apache.sysml.hops.AggBinaryOp;
+import org.apache.sysml.hops.DataGenOp;
 import org.apache.sysml.hops.DataOp;
 import org.apache.sysml.hops.FunctionOp;
 import org.apache.sysml.hops.Hop;
@@ -101,6 +102,7 @@ import org.apache.sysml.runtime.matrix.MatrixFormatMetaData;
 import org.apache.sysml.runtime.matrix.data.MatrixBlock;
 import org.apache.sysml.runtime.matrix.data.OutputInfo;
 import org.apache.sysml.runtime.matrix.data.SparseRow;
+import org.apache.sysml.utils.Explain;
 import org.apache.sysml.yarn.ropt.YarnClusterAnalyzer;
 
 /**
@@ -155,7 +157,7 @@ public class OptimizerRuleBased extends Optimizer
        public static final boolean APPLY_REWRITE_NESTED_PARALLELISM = false;
        public static final String FUNCTION_UNFOLD_NAMEPREFIX = "__unfold_";
        
-       public static final boolean APPLY_REWRITE_UPDATE_INPLACE_INTERMEDIATE = 
false;
+       public static final boolean APPLY_REWRITE_UPDATE_INPLACE_INTERMEDIATE = 
true;
        
        public static final double PAR_K_FACTOR        = 
OptimizationWrapper.PAR_FACTOR_INFRASTRUCTURE; 
        public static final double PAR_K_MR_FACTOR     = 1.0 * 
OptimizationWrapper.PAR_FACTOR_INFRASTRUCTURE; 
@@ -290,7 +292,7 @@ public class OptimizerRuleBased extends Optimizer
                        
                        // rewrite 14: set in-place result indexing
                        HashSet<String> inplaceResultVars = new 
HashSet<String>();
-                       rewriteSetInPlaceResultIndexing(pn, M1, 
ec.getVariables(), inplaceResultVars);
+                       rewriteSetInPlaceResultIndexing(pn, M1, 
ec.getVariables(), inplaceResultVars, ec);
                        
                        // rewrite 15: disable caching
                        rewriteDisableCPCaching(pn, inplaceResultVars, 
ec.getVariables());
@@ -305,7 +307,7 @@ public class OptimizerRuleBased extends Optimizer
                        
                        // rewrite 14: set in-place result indexing
                        HashSet<String> inplaceResultVars = new 
HashSet<String>();
-                       rewriteSetInPlaceResultIndexing(pn, M1, 
ec.getVariables(), inplaceResultVars);
+                       rewriteSetInPlaceResultIndexing(pn, M1, 
ec.getVariables(), inplaceResultVars, ec);
                        
                        if( !OptimizerUtils.isSparkExecutionMode() ) {
                                // rewrite 16: runtime piggybacking
@@ -1863,7 +1865,7 @@ public class OptimizerRuleBased extends Optimizer
         * @param inPlaceResultVars
         * @throws DMLRuntimeException
         */
-       protected void rewriteSetInPlaceResultIndexing(OptNode pn, double M, 
LocalVariableMap vars, HashSet<String> inPlaceResultVars) 
+       protected void rewriteSetInPlaceResultIndexing(OptNode pn, double M, 
LocalVariableMap vars, HashSet<String> inPlaceResultVars, ExecutionContext ec) 
                throws DMLRuntimeException 
        {
                //assertions (warnings of corrupt optimizer decisions)
@@ -1933,11 +1935,11 @@ public class OptimizerRuleBased extends Optimizer
                                        
                                        if (uipCandHopList != null) {
                                                for (UIPCandidateHop 
uipCandHop: uipCandHopList)
-                                                       
if(uipCandHop.isLoopApplicable() && uipCandHop.isUpdateInPlace())
+                                                       
if(uipCandHop.isIntermediate() && uipCandHop.isLoopApplicable() && 
uipCandHop.isUpdateInPlace())
                                                        {
                                                                
uipCandHop.getHop().setUpdateInPlace(true);
                                                                
bAnyUIPApplicable = true;
-                                                               
+
                                                                
if(LOG.isDebugEnabled())
                                                                        
listUIPRes.get().add(uipCandHop.getHop().getName());
                                                        }
@@ -1945,8 +1947,9 @@ public class OptimizerRuleBased extends Optimizer
                                }
                                if(bAnyUIPApplicable)
                                        try {
-                                               //Recompile this block if there 
is any update in place applicable.
-                                               
Recompiler.recompileProgramBlockInstructions(pfpb);             //TODO: 
Recompile @ very high level ok?
+                                               //Recompile this block 
recursively if there is any update in place applicable.
+                                               LocalVariableMap 
localVaraibleMap = (LocalVariableMap) ec.getVariables().clone();
+                                               
Recompiler.recompileProgramBlockHierarchy(pfpb.getChildBlocks(), 
localVaraibleMap, 0L, true);
                                        }
                                        catch(Exception ex){
                                                throw new 
DMLRuntimeException(ex);
@@ -1956,7 +1959,9 @@ public class OptimizerRuleBased extends Optimizer
 
                if(APPLY_REWRITE_UPDATE_INPLACE_INTERMEDIATE && 
LOG.isTraceEnabled())
                {
-                       LOG.trace("UpdateInPlace = " + apply + " for lines 
between " + pn.getBeginLine() + " and " + pn.getEndLine());
+                       LOG.trace("UpdateInPlace = " + apply + " for lines 
between " + pn.getBeginLine() + " and " + pn.getEndLine()
+                                       + " for " + uipCandHopHM.size() + " 
intermediate matrix objects:" + uipCandHopHM.keySet().toString());
+                               
                        for(Entry<String, ArrayList <UIPCandidateHop>> entry: 
uipCandHopHM.entrySet())
                        {
                                ArrayList <UIPCandidateHop> uipCandHopList = 
entry.getValue();
@@ -1964,8 +1969,18 @@ public class OptimizerRuleBased extends Optimizer
                                if (uipCandHopList != null) {
                                        for (UIPCandidateHop uipCandHop: 
uipCandHopList)
                                        {
-                                               LOG.trace("Matrix Object: Name: 
" + uipCandHop.getHop().getName() + "<" + uipCandHop.getHop().getBeginLine() + 
"," + uipCandHop.getHop().getEndLine()+ ">, InLoop:"
-                                                               + 
uipCandHop.isLoopApplicable() + ", UIPApplicable:" + 
uipCandHop.isUpdateInPlace() + ", HopUIPApplicable:" + 
uipCandHop.getHop().getUpdateInPlace());  
+                                               if(uipCandHop.getHop() != null)
+                                               {
+                                                       LOG.trace("Matrix 
Object: Name: " + uipCandHop.getHop().getName() + "<" + 
uipCandHop.getHop().getBeginLine() + "," + uipCandHop.getHop().getEndLine()+ 
">, InLoop:"
+                                                               + 
uipCandHop.isLoopApplicable() + ", UIPApplicable:" + 
uipCandHop.isUpdateInPlace() + ", HopUIPApplicable:" + 
uipCandHop.getHop().getUpdateInPlace());
+                                                       LOG.trace("Explain 
Candidate HOP after recompile");
+                                                       
LOG.trace(Explain.explain(uipCandHop.getHop()));
+                                               }
+                                               else
+                                               {
+                                                       LOG.trace("Matrix 
Object: Name: " + uipCandHop.getLixHop().getName() + "<" + 
uipCandHop.getLixHop().getBeginLine() + "," + 
uipCandHop.getLixHop().getEndLine()+ ">, InLoop:"
+                                                                       + 
uipCandHop.isLoopApplicable() + ", Not an Intermediate matrix object");
+                                               }
                                        }
                                }
                        }
@@ -2024,7 +2039,7 @@ public class OptimizerRuleBased extends Optimizer
        {
                rIsInLoop(pn, uipCandHopHM, false);
                
-               // Prune candidate list based on non-existance of candidate in 
the loop
+               // Prune candidate list based on non-existance of intermediate 
candidate in the loop
                Iterator<Map.Entry<String, ArrayList <UIPCandidateHop>>> 
uipCandHopHMIter = uipCandHopHM.entrySet().iterator();
                while(uipCandHopHMIter.hasNext())
                {
@@ -2035,12 +2050,18 @@ public class OptimizerRuleBased extends Optimizer
                                for (Iterator<UIPCandidateHop> 
uipCandHopListIter = uipCandHopList.iterator(); uipCandHopListIter.hasNext();) 
                                {
                                        UIPCandidateHop uipCandHop = 
uipCandHopListIter.next();
-                                       if (!uipCandHop.isLoopApplicable())     
//If Loop is not applicable then remove it from the list. 
+                                       if (!uipCandHop.isIntermediate() || 
!uipCandHop.isLoopApplicable())     //If Loop is not applicable then remove it 
from the list. 
                                        {
                                                uipCandHopListIter.remove();
                                                if(LOG.isTraceEnabled())
-                                                       LOG.trace("Matrix 
Object: Name: " + uipCandHop.getHop().getName() + "<" + 
uipCandHop.getHop().getBeginLine() + "," + uipCandHop.getHop().getEndLine()+ 
-                                                                       ">, 
removed from the candidate list as it does not have loop criteria applicable.");
+                                               {
+                                                       if 
(!uipCandHop.isIntermediate())
+                                                               
LOG.trace("Matrix Object: Name: " + uipCandHop.getLixHop().getName() + "<" + 
uipCandHop.getLixHop().getBeginLine() + "," + 
uipCandHop.getLixHop().getEndLine()+ 
+                                                                               
">, removed from the candidate list as it is not an intermediate matrix 
object.");
+                                                       else
+                                                               
LOG.trace("Matrix Object: Name: " + uipCandHop.getLixHop().getName() + "<" + 
uipCandHop.getLixHop().getBeginLine() + "," + 
uipCandHop.getLixHop().getEndLine()+ 
+                                                                               
">, removed from the candidate list as it does not have loop criteria 
applicable.");
+                                               }
                                        }
                                }
                                if(uipCandHopList.isEmpty())
@@ -2074,7 +2095,7 @@ public class OptimizerRuleBased extends Optimizer
                                                                {
                                                                        
uipCandHopListIter.remove();
                                                                        
if(LOG.isTraceEnabled())
-                                                                               
LOG.trace("Matrix Object: Name: " + uipCandHop.getHop().getName() + "<" + 
uipCandHop.getHop().getBeginLine() + "," + uipCandHop.getHop().getEndLine()+ 
+                                                                               
LOG.trace("Matrix Object: Name: " + uipCandHop.getLixHop().getName() + "<" + 
uipCandHop.getLixHop().getBeginLine() + "," + 
uipCandHop.getLixHop().getEndLine()+ 
                                                                                
                ">, removed from the candidate list as one of the consumer is 
FunctionOp.");
                                                                        break;
                                                                }
@@ -2135,7 +2156,7 @@ public class OptimizerRuleBased extends Optimizer
                                rIsInLoop(optNode, uipCandHopHM, bLoop);
                        }
                }
-               else if(bInLoop)
+               else 
                {
                        Hop hop = (Hop) 
OptTreeConverter.getAbstractPlanMapping().getMappedHop(pn.getID());
 
@@ -2147,8 +2168,16 @@ public class OptimizerRuleBased extends Optimizer
                                {
                                        for (UIPCandidateHop uipCandHop: 
uipCandHopList)
                                        {
+                                               //Identify where intermediate 
object has been defined.
+                                               if (hop instanceof DataGenOp && 
hop.getName().equals(uipCandHop.getLixHop().getName()))
+                                               {
+                                                       uipCandHop.setHop(hop);
+                                                       
uipCandHop.setLocation(hop.getBeginLine());
+                                                       
uipCandHop.setIntermediate(true);
+                                               }
+                                                       
                                                //Update if candiate hop 
defined outside this loop, and leftindexing is within this loop.
-                                               if (uipCandHop.getLocation() <= 
hop.getBeginLine() && uipCandHop.getHop().getBeginLine() <= hop.getEndLine())
+                                               if ((bInLoop) && 
(uipCandHop.getLocation() <= hop.getBeginLine() && 
uipCandHop.getLixHop().getBeginLine() <= hop.getEndLine()))
                                                        
uipCandHop.setIsLoopApplicable(true);
                                        }
                                }
@@ -2725,8 +2754,8 @@ public class OptimizerRuleBased extends Optimizer
                                uipCandidateHM.put(uipCandiateID, 
uipCandiHopList);
 
                                StatementBlock sb = (StatementBlock) 
OptTreeConverter.getAbstractPlanMapping().getMappedProg(OptTreeConverter.getAbstractPlanMapping().getMappedParentID(n.getID()))[0];
-                               if(LOG.isDebugEnabled())
-                                       LOG.debug("Candidate Hop:" + 
h.getName() + "<" + h.getBeginLine() + "," + h.getEndLine() + ">,<" + 
+                               if(LOG.isTraceEnabled())
+                                       LOG.trace("Candidate Hop:" + 
h.getName() + "<" + h.getBeginLine() + "," + h.getEndLine() + ">,<" + 
                                                h.getBeginColumn() + "," + 
h.getEndColumn() + "> PB:" + "<" + pb.getBeginLine() + "," + pb.getEndLine() + 
">,<" + 
                                                pb.getBeginColumn() + "," + 
pb.getEndColumn() + "> SB:" + "<" + sb.getBeginLine() + "," + sb.getEndLine() + 
">,<" + 
                                                sb.getBeginColumn() + "," + 
sb.getEndColumn() + ">");
@@ -3894,22 +3923,32 @@ public class OptimizerRuleBased extends Optimizer
         * as location, flag to indicate if its in loop (for, parfor, while), 
flag to indicate if hop can be marked as "UpdateInPlace".
         */
        class UIPCandidateHop {
-               Hop hop;
+               Hop hopCandidate, hopLix;
                int iLocation = -1;
                ProgramBlock pb;
-               Boolean bIsLoopApplicable = false, bUpdateInPlace = true;
+               Boolean bIntermediate = false, bIsLoopApplicable = false, 
bUpdateInPlace = true;
                ArrayList<Hop> consumerHops = null;
                
                
-               UIPCandidateHop(Hop hop, ProgramBlock pb)
+               UIPCandidateHop(Hop hopLix, ProgramBlock pb)
                {
-                       this.hop = hop;
+                       this.hopLix = hopLix;
                        this.pb = pb;
                }
                
+               Hop getLixHop()
+               {
+                       return hopLix;
+               }
+               
                Hop getHop()
                {
-                       return hop;
+                       return hopCandidate;
+               }
+               
+               void setHop(Hop hopCandidate)
+               {
+                       this.hopCandidate = hopCandidate;
                }
                
                ProgramBlock getProgramBlock()
@@ -3927,6 +3966,16 @@ public class OptimizerRuleBased extends Optimizer
                        this.iLocation = iLocation;
                }
                
+               boolean isIntermediate()
+               {
+                       return(bIntermediate);
+               }
+               
+               void setIntermediate(boolean bIntermediate)
+               {
+                       this.bIntermediate = bIntermediate;
+               }
+               
                boolean isLoopApplicable()
                {
                        return(bIsLoopApplicable);

http://git-wip-us.apache.org/repos/asf/incubator-systemml/blob/28467c3f/src/main/java/org/apache/sysml/runtime/instructions/cp/VariableCPInstruction.java
----------------------------------------------------------------------
diff --git 
a/src/main/java/org/apache/sysml/runtime/instructions/cp/VariableCPInstruction.java
 
b/src/main/java/org/apache/sysml/runtime/instructions/cp/VariableCPInstruction.java
index 22bd2ab..dac114b 100644
--- 
a/src/main/java/org/apache/sysml/runtime/instructions/cp/VariableCPInstruction.java
+++ 
b/src/main/java/org/apache/sysml/runtime/instructions/cp/VariableCPInstruction.java
@@ -22,6 +22,7 @@ package org.apache.sysml.runtime.instructions.cp;
 import java.io.IOException;
 
 import org.apache.commons.lang.StringUtils;
+import org.apache.sysml.api.DMLScript;
 import org.apache.sysml.lops.Lop;
 import org.apache.sysml.lops.UnaryCP;
 import org.apache.sysml.parser.Expression.DataType;
@@ -446,7 +447,7 @@ public class VariableCPInstruction extends CPInstruction
                                mobj.setFileFormatProperties(formatProperties);
                                mobj.enableUpdateInPlace(updateInPlace);
                                ec.setVariable(input1.getName(), mobj);
-                               if(updateInPlace)
+                               if(DMLScript.STATISTICS && updateInPlace)
                                        Statistics.incrementTotalUIPVar();
                        }
                        else if ( input1.getDataType() == DataType.SCALAR ){

http://git-wip-us.apache.org/repos/asf/incubator-systemml/blob/28467c3f/src/main/java/org/apache/sysml/utils/Explain.java
----------------------------------------------------------------------
diff --git a/src/main/java/org/apache/sysml/utils/Explain.java 
b/src/main/java/org/apache/sysml/utils/Explain.java
index 1986265..c070378 100644
--- a/src/main/java/org/apache/sysml/utils/Explain.java
+++ b/src/main/java/org/apache/sysml/utils/Explain.java
@@ -28,9 +28,7 @@ import java.util.Map.Entry;
 import org.apache.sysml.api.DMLException;
 import org.apache.sysml.hops.FunctionOp;
 import org.apache.sysml.hops.Hop;
-import org.apache.sysml.hops.Hop.DataOpTypes;
 import org.apache.sysml.hops.Hop.VisitStatus;
-import org.apache.sysml.hops.DataOp;
 import org.apache.sysml.hops.HopsException;
 import org.apache.sysml.hops.LiteralOp;
 import org.apache.sysml.hops.OptimizerUtils;
@@ -686,7 +684,7 @@ public class Explain
                               + hop.getColsInBlock() + "," 
                                       + hop.getNnz());
                
-               if (hop instanceof DataOp && ((DataOp)hop).getDataOpType() == 
DataOpTypes.TRANSIENTREAD && hop.getUpdateInPlace())
+               if (hop.getUpdateInPlace())
                        sb.append("," + hop.getUpdateInPlace());
                
                sb.append("]");

http://git-wip-us.apache.org/repos/asf/incubator-systemml/blob/28467c3f/src/main/java/org/apache/sysml/utils/Statistics.java
----------------------------------------------------------------------
diff --git a/src/main/java/org/apache/sysml/utils/Statistics.java 
b/src/main/java/org/apache/sysml/utils/Statistics.java
index ce133ff..a517136 100644
--- a/src/main/java/org/apache/sysml/utils/Statistics.java
+++ b/src/main/java/org/apache/sysml/utils/Statistics.java
@@ -159,14 +159,26 @@ public class Statistics
                iNoOfCompiledSPInst ++;
        }
        
+       public static long getTotalUIPVar() {
+               return lTotalUIPVar.get();
+       }
+
        public static void incrementTotalUIPVar() {
                lTotalUIPVar.incrementAndGet();
        }
 
+       public static long getTotalLixUIP() {
+               return lTotalLixUIP.get();
+       }
+
        public static void incrementTotalLixUIP() {
                lTotalLixUIP.incrementAndGet();
        }
 
+       public static long getTotalLix() {
+               return lTotalLix.get();
+       }
+
        public static void incrementTotalLix() {
                lTotalLix.incrementAndGet();
        }
@@ -320,6 +332,10 @@ public class Statistics
                parforInitTime = 0;
                parforMergeTime = 0;
                
+               lTotalLix.set(0);
+               lTotalLixUIP.set(0);
+               lTotalUIPVar.set(0);
+               
                resetJITCompileTime();
                resetJVMgcTime();
                resetJVMgcCount();

http://git-wip-us.apache.org/repos/asf/incubator-systemml/blob/28467c3f/src/test/java/org/apache/sysml/test/integration/functions/updateinplace/UpdateInPlaceTest.java
----------------------------------------------------------------------
diff --git 
a/src/test/java/org/apache/sysml/test/integration/functions/updateinplace/UpdateInPlaceTest.java
 
b/src/test/java/org/apache/sysml/test/integration/functions/updateinplace/UpdateInPlaceTest.java
index 503a42f..062a680 100644
--- 
a/src/test/java/org/apache/sysml/test/integration/functions/updateinplace/UpdateInPlaceTest.java
+++ 
b/src/test/java/org/apache/sysml/test/integration/functions/updateinplace/UpdateInPlaceTest.java
@@ -29,6 +29,7 @@ import 
org.apache.sysml.runtime.controlprogram.parfor.opt.OptimizerRuleBased;
 import org.apache.sysml.test.integration.AutomatedTestBase;
 import org.apache.sysml.test.integration.TestConfiguration;
 import org.apache.sysml.test.utils.TestUtils;
+import org.apache.sysml.utils.Statistics;
 
 public class UpdateInPlaceTest extends AutomatedTestBase 
 {
@@ -101,13 +102,12 @@ public class UpdateInPlaceTest extends AutomatedTestBase
                addTestConfiguration(TEST_NAME, new 
TestConfiguration(TEST_CLASS_DIR, TEST_NAME, null));
        }
 
-       //public void testUIPOverlapStatement(1)
        @Test
        public void testUIP() 
        {
                List<String> listUIPRes = Arrays.asList("A");
 
-               runUpdateInPlaceTest(TEST_NAME, 1, listUIPRes);
+               runUpdateInPlaceTest(TEST_NAME, 1, listUIPRes, 2, 4, 4);
        }
        
        @Test
@@ -115,7 +115,7 @@ public class UpdateInPlaceTest extends AutomatedTestBase
        {
                List<String> listUIPRes = Arrays.asList();
 
-               runUpdateInPlaceTest(TEST_NAME, 2, listUIPRes);
+               runUpdateInPlaceTest(TEST_NAME, 2, listUIPRes, 0, 0, 4);
        }
        
        @Test
@@ -123,7 +123,7 @@ public class UpdateInPlaceTest extends AutomatedTestBase
        {
                List<String> listUIPRes = Arrays.asList();
 
-               runUpdateInPlaceTest(TEST_NAME, 3, listUIPRes);
+               runUpdateInPlaceTest(TEST_NAME, 3, listUIPRes, 0, 0, 4);
        }
        
        @Test
@@ -131,7 +131,7 @@ public class UpdateInPlaceTest extends AutomatedTestBase
        {
                List<String> listUIPRes = Arrays.asList("A");
 
-               runUpdateInPlaceTest(TEST_NAME, 4, listUIPRes);
+               runUpdateInPlaceTest(TEST_NAME, 4, listUIPRes, 2, 4, 4);
        }
        
        @Test
@@ -139,7 +139,7 @@ public class UpdateInPlaceTest extends AutomatedTestBase
        {
                List<String> listUIPRes = Arrays.asList();
 
-               runUpdateInPlaceTest(TEST_NAME, 5, listUIPRes);
+               runUpdateInPlaceTest(TEST_NAME, 5, listUIPRes, 0, 0, 4);
        }
        
        @Test
@@ -147,7 +147,7 @@ public class UpdateInPlaceTest extends AutomatedTestBase
        {
                List<String> listUIPRes = Arrays.asList();
 
-               runUpdateInPlaceTest(TEST_NAME, 6, listUIPRes);
+               runUpdateInPlaceTest(TEST_NAME, 6, listUIPRes, 0, 0, 4);
        }
        
        @Test
@@ -155,7 +155,7 @@ public class UpdateInPlaceTest extends AutomatedTestBase
        {
                List<String> listUIPRes = Arrays.asList();
 
-               runUpdateInPlaceTest(TEST_NAME, 7, listUIPRes);
+               runUpdateInPlaceTest(TEST_NAME, 7, listUIPRes, 0, 0, 4);
        }
        
        @Test
@@ -163,7 +163,7 @@ public class UpdateInPlaceTest extends AutomatedTestBase
        {
                List<String> listUIPRes = Arrays.asList();
 
-               runUpdateInPlaceTest(TEST_NAME, 8, listUIPRes);
+               runUpdateInPlaceTest(TEST_NAME, 8, listUIPRes, 0, 0, 4);
        }
        
        @Test
@@ -171,7 +171,7 @@ public class UpdateInPlaceTest extends AutomatedTestBase
        {
                List<String> listUIPRes = Arrays.asList();
 
-               runUpdateInPlaceTest(TEST_NAME, 9, listUIPRes);
+               runUpdateInPlaceTest(TEST_NAME, 9, listUIPRes, 0, 0, 4);
        }
        
        @Test
@@ -179,7 +179,7 @@ public class UpdateInPlaceTest extends AutomatedTestBase
        {
                List<String> listUIPRes = Arrays.asList();
 
-               runUpdateInPlaceTest(TEST_NAME, 10, listUIPRes);
+               runUpdateInPlaceTest(TEST_NAME, 10, listUIPRes, 0, 0, 12);
        }
        
        @Test
@@ -187,7 +187,7 @@ public class UpdateInPlaceTest extends AutomatedTestBase
        {
                List<String> listUIPRes = Arrays.asList();
 
-               runUpdateInPlaceTest(TEST_NAME, 11, listUIPRes);
+               runUpdateInPlaceTest(TEST_NAME, 11, listUIPRes, 0, 0, 8);
        }
        
        @Test
@@ -195,7 +195,7 @@ public class UpdateInPlaceTest extends AutomatedTestBase
        {
                List<String> listUIPRes = Arrays.asList();
 
-               runUpdateInPlaceTest(TEST_NAME, 12, listUIPRes);
+               runUpdateInPlaceTest(TEST_NAME, 12, listUIPRes, 0, 0, 4);
        }
        
        @Test
@@ -203,7 +203,7 @@ public class UpdateInPlaceTest extends AutomatedTestBase
        {
                List<String> listUIPRes = Arrays.asList();
 
-               runUpdateInPlaceTest(TEST_NAME, 13, listUIPRes);
+               runUpdateInPlaceTest(TEST_NAME, 13, listUIPRes, 0, 0, 4);
        }
        
        @Test
@@ -211,7 +211,7 @@ public class UpdateInPlaceTest extends AutomatedTestBase
        {
                List<String> listUIPRes = Arrays.asList("A");
 
-               runUpdateInPlaceTest(TEST_NAME, 14, listUIPRes);
+               runUpdateInPlaceTest(TEST_NAME, 14, listUIPRes, 2, 4, 8);
        }
                
        @Test
@@ -219,17 +219,16 @@ public class UpdateInPlaceTest extends AutomatedTestBase
        {
                List<String> listUIPRes = Arrays.asList();
 
-               runUpdateInPlaceTest(TEST_NAME, 15, listUIPRes);
+               runUpdateInPlaceTest(TEST_NAME, 15, listUIPRes, 0, 0, 4);
        }
        
-
        /**
         * 
         * @param TEST_NAME
         * @param iTestNumber
         * @param listUIPRes
         */
-       private void runUpdateInPlaceTest( String TEST_NAME, int iTestNumber, 
List<String> listUIPExp )
+       private void runUpdateInPlaceTest( String TEST_NAME, int iTestNumber, 
List<String> listUIPExp, long lTotalUIPVar, long lTotalLixUIP, long lTotalLix)
        {
                try
                {
@@ -272,6 +271,19 @@ public class UpdateInPlaceTest extends AutomatedTestBase
                                                        " does not match with 
the # of matrix objects " + "0" + " from optimization result.", 
                                                        (listUIPRes == null || 
listUIPRes.size() == 0));
                                }
+                               
+                               Assert.assertTrue("Expected # of UpdateInPlace 
create variables of type matrix " + lTotalUIPVar + 
+                                               " does not match with the # of 
UpdateInPlace create variables of type matrix objects " + 
Statistics.getTotalUIPVar() + " from optimization result.", 
+                                               (Statistics.getTotalUIPVar() == 
lTotalUIPVar));
+                               
+                               Assert.assertTrue("Expected # of UpdateInPlace 
LeftIndexing " + lTotalLixUIP + 
+                                               " does not match with the # of 
UpdateInPlace LeftIndexing " + Statistics.getTotalLixUIP() + " from 
optimization result.", 
+                                               (Statistics.getTotalLixUIP() == 
lTotalLixUIP));
+                               
+                               Assert.assertTrue("Expected # of total 
LeftIndexing " + lTotalLix + 
+                                               " does not match with the # of 
total LeftIndexing " + Statistics.getTotalLix() + " from optimization result.", 
+                                               (Statistics.getTotalLix() == 
lTotalLix));
+                               
                        }
                }
                finally{

http://git-wip-us.apache.org/repos/asf/incubator-systemml/blob/28467c3f/src/test/scripts/functions/updateinplace/updateinplace10.dml
----------------------------------------------------------------------
diff --git a/src/test/scripts/functions/updateinplace/updateinplace10.dml 
b/src/test/scripts/functions/updateinplace/updateinplace10.dml
index 936bbfe..0d3a99a 100644
--- a/src/test/scripts/functions/updateinplace/updateinplace10.dml
+++ b/src/test/scripts/functions/updateinplace/updateinplace10.dml
@@ -31,6 +31,8 @@ parfor (j in 1:m, log=DEBUG){
                if(1 == 1)
                        B = A
                A[i,2] = j*3+i;
+               if(1 == 1)
+                       B = A
                A[i,3] = j*4+i;
        }
 }

Reply via email to