You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@systemml.apache.org by mb...@apache.org on 2016/05/10 18:39:46 UTC
[1/2] incubator-systemml git commit: [SYSTEMML-677] Fix decision tree
data generator, frame meta data write
Repository: incubator-systemml
Updated Branches:
refs/heads/master 59c1e5540 -> 9b7f8b621
[SYSTEMML-677] Fix decision tree data generator, frame meta data write
Project: http://git-wip-us.apache.org/repos/asf/incubator-systemml/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-systemml/commit/d7dedce2
Tree: http://git-wip-us.apache.org/repos/asf/incubator-systemml/tree/d7dedce2
Diff: http://git-wip-us.apache.org/repos/asf/incubator-systemml/diff/d7dedce2
Branch: refs/heads/master
Commit: d7dedce29bcfce41fdcc58c6f0ee27b71e821abd
Parents: 59c1e55
Author: Matthias Boehm <mb...@us.ibm.com>
Authored: Mon May 9 19:43:58 2016 -0700
Committer: Matthias Boehm <mb...@us.ibm.com>
Committed: Tue May 10 11:34:59 2016 -0700
----------------------------------------------------------------------
scripts/datagen/genRandData4DecisionTree1.dml | 3 ++-
.../apache/sysml/runtime/controlprogram/caching/FrameObject.java | 2 +-
.../sysml/runtime/controlprogram/context/ExecutionContext.java | 2 ++
3 files changed, 5 insertions(+), 2 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/incubator-systemml/blob/d7dedce2/scripts/datagen/genRandData4DecisionTree1.dml
----------------------------------------------------------------------
diff --git a/scripts/datagen/genRandData4DecisionTree1.dml b/scripts/datagen/genRandData4DecisionTree1.dml
index b679783..7d1dd50 100644
--- a/scripts/datagen/genRandData4DecisionTree1.dml
+++ b/scripts/datagen/genRandData4DecisionTree1.dml
@@ -35,5 +35,6 @@ write (Y_bin, YFile);
# generate categorical features
X_cat = floor (rand (rows = num_records, cols = num_cat_features, min = 1, max = num_distinct + 0.99999999999999, sparsity = sparsity));
-write (X_cat, XCatFile, format = "csv");
+fX_cat = as.frame(X_cat);
+write (fX_cat, XCatFile, format = "csv");
http://git-wip-us.apache.org/repos/asf/incubator-systemml/blob/d7dedce2/src/main/java/org/apache/sysml/runtime/controlprogram/caching/FrameObject.java
----------------------------------------------------------------------
diff --git a/src/main/java/org/apache/sysml/runtime/controlprogram/caching/FrameObject.java b/src/main/java/org/apache/sysml/runtime/controlprogram/caching/FrameObject.java
index 35740e9..78f58be 100644
--- a/src/main/java/org/apache/sysml/runtime/controlprogram/caching/FrameObject.java
+++ b/src/main/java/org/apache/sysml/runtime/controlprogram/caching/FrameObject.java
@@ -53,7 +53,7 @@ public class FrameObject extends CacheableData<FrameBlock>
*
*/
protected FrameObject() {
- super(DataType.FRAME, ValueType.UNKNOWN);
+ super(DataType.FRAME, ValueType.STRING);
}
/**
http://git-wip-us.apache.org/repos/asf/incubator-systemml/blob/d7dedce2/src/main/java/org/apache/sysml/runtime/controlprogram/context/ExecutionContext.java
----------------------------------------------------------------------
diff --git a/src/main/java/org/apache/sysml/runtime/controlprogram/context/ExecutionContext.java b/src/main/java/org/apache/sysml/runtime/controlprogram/context/ExecutionContext.java
index f2b34c2..b31541e 100644
--- a/src/main/java/org/apache/sysml/runtime/controlprogram/context/ExecutionContext.java
+++ b/src/main/java/org/apache/sysml/runtime/controlprogram/context/ExecutionContext.java
@@ -338,6 +338,8 @@ public class ExecutionContext
throws DMLRuntimeException
{
FrameObject fo = (FrameObject) getVariable(varName);
+ if( outputData.getNumColumns()>0 && outputData.getSchema()!=null )
+ fo.setValueType(outputData.getSchema().get(0));
fo.acquireModify(outputData);
fo.release();
[2/2] incubator-systemml git commit: [SYSTEMML-675] Fix missing
support negative for/parfor increments, tests
Posted by mb...@apache.org.
[SYSTEMML-675] Fix missing support negative for/parfor increments, tests
Project: http://git-wip-us.apache.org/repos/asf/incubator-systemml/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-systemml/commit/9b7f8b62
Tree: http://git-wip-us.apache.org/repos/asf/incubator-systemml/tree/9b7f8b62
Diff: http://git-wip-us.apache.org/repos/asf/incubator-systemml/diff/9b7f8b62
Branch: refs/heads/master
Commit: 9b7f8b621c9a57e107f43171776b807791f65f59
Parents: d7dedce
Author: Matthias Boehm <mb...@us.ibm.com>
Authored: Mon May 9 23:32:49 2016 -0700
Committer: Matthias Boehm <mb...@us.ibm.com>
Committed: Tue May 10 11:39:22 2016 -0700
----------------------------------------------------------------------
.../sysml/hops/rewrite/ProgramRewriter.java | 3 +
.../rewrite/RewriteForLoopVectorization.java | 7 +-
.../org/apache/sysml/parser/DMLTranslator.java | 4 +-
.../apache/sysml/parser/ForStatementBlock.java | 2 +-
.../apache/sysml/parser/IterablePredicate.java | 26 ++--
.../sysml/parser/ParForStatementBlock.java | 7 +-
.../parser/common/CommonSyntacticValidator.java | 1 -
.../sysml/parser/dml/DmlSyntacticValidator.java | 6 +-
.../parser/pydml/PydmlSyntacticValidator.java | 5 +-
.../runtime/controlprogram/ForProgramBlock.java | 81 ++++++++----
.../controlprogram/ParForProgramBlock.java | 8 +-
.../controlprogram/parfor/TaskPartitioner.java | 36 ++++--
.../parfor/opt/OptTreeConverter.java | 12 +-
.../misc/NegativeLoopIncrementsTest.java | 129 +++++++++++++++++++
.../functions/misc/NegativeForIncrTest.R | 43 +++++++
.../functions/misc/NegativeForIncrTest.dml | 35 +++++
.../functions/misc/NegativeParForIncrTest.R | 43 +++++++
.../functions/misc/NegativeParForIncrTest.dml | 36 ++++++
.../functions/misc/conditionalValidate3.dml | 2 +-
.../functions/misc/ZPackageSuite.java | 1 +
20 files changed, 419 insertions(+), 68 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/incubator-systemml/blob/9b7f8b62/src/main/java/org/apache/sysml/hops/rewrite/ProgramRewriter.java
----------------------------------------------------------------------
diff --git a/src/main/java/org/apache/sysml/hops/rewrite/ProgramRewriter.java b/src/main/java/org/apache/sysml/hops/rewrite/ProgramRewriter.java
index cfc5855..9837a62 100644
--- a/src/main/java/org/apache/sysml/hops/rewrite/ProgramRewriter.java
+++ b/src/main/java/org/apache/sysml/hops/rewrite/ProgramRewriter.java
@@ -296,6 +296,9 @@ public class ProgramRewriter
public Hop rewriteHopDAG(Hop root, ProgramRewriteStatus state)
throws HopsException
{
+ if( root == null )
+ return root;
+
for( HopRewriteRule r : _dagRuleSet )
{
root.resetVisitStatus(); //reset for each rule
http://git-wip-us.apache.org/repos/asf/incubator-systemml/blob/9b7f8b62/src/main/java/org/apache/sysml/hops/rewrite/RewriteForLoopVectorization.java
----------------------------------------------------------------------
diff --git a/src/main/java/org/apache/sysml/hops/rewrite/RewriteForLoopVectorization.java b/src/main/java/org/apache/sysml/hops/rewrite/RewriteForLoopVectorization.java
index 31bd306..c773319 100644
--- a/src/main/java/org/apache/sysml/hops/rewrite/RewriteForLoopVectorization.java
+++ b/src/main/java/org/apache/sysml/hops/rewrite/RewriteForLoopVectorization.java
@@ -77,7 +77,7 @@ public class RewriteForLoopVectorization extends StatementBlockRewriteRule
|| csb instanceof IfStatementBlock
|| csb instanceof ForStatementBlock ) )
{
- //auto vectorzation pattern
+ //auto vectorization pattern
sb = vectorizeScalarAggregate(sb, csb, from, to, incr, iterVar); //e.g., for(i){s = s + as.scalar(X[i,2])}
sb = vectorizeElementwiseBinary(sb, csb, from, to, incr, iterVar);
sb = vectorizeElementwiseUnary(sb, csb, from, to, incr, iterVar);
@@ -110,8 +110,9 @@ public class RewriteForLoopVectorization extends StatementBlockRewriteRule
{
StatementBlock ret = sb;
- //check supported increment values
- if( !(increment instanceof LiteralOp && ((LiteralOp)increment).getDoubleValue()==1.0) ){
+ //check missing and supported increment values
+ if( !(increment!=null && increment instanceof LiteralOp
+ && ((LiteralOp)increment).getDoubleValue()==1.0) ) {
return ret;
}
http://git-wip-us.apache.org/repos/asf/incubator-systemml/blob/9b7f8b62/src/main/java/org/apache/sysml/parser/DMLTranslator.java
----------------------------------------------------------------------
diff --git a/src/main/java/org/apache/sysml/parser/DMLTranslator.java b/src/main/java/org/apache/sysml/parser/DMLTranslator.java
index b2b91c9..9e710e3 100644
--- a/src/main/java/org/apache/sysml/parser/DMLTranslator.java
+++ b/src/main/java/org/apache/sysml/parser/DMLTranslator.java
@@ -1377,7 +1377,7 @@ public class DMLTranslator
varsRead = ip.getFromExpr().variablesRead();
else if (i==1)
varsRead = ip.getToExpr().variablesRead();
- else
+ else if( ip.getIncrementExpr() != null )
varsRead = ip.getIncrementExpr().variablesRead();
if(varsRead != null) {
@@ -1405,7 +1405,7 @@ public class DMLTranslator
fsb.setFromHops( processTempIntExpression( ip.getFromExpr(), _ids ));
else if(i==1)
fsb.setToHops( processTempIntExpression( ip.getToExpr(), _ids ));
- else
+ else if( ip.getIncrementExpr() != null )
fsb.setIncrementHops( processTempIntExpression( ip.getIncrementExpr(), _ids ));
}
http://git-wip-us.apache.org/repos/asf/incubator-systemml/blob/9b7f8b62/src/main/java/org/apache/sysml/parser/ForStatementBlock.java
----------------------------------------------------------------------
diff --git a/src/main/java/org/apache/sysml/parser/ForStatementBlock.java b/src/main/java/org/apache/sysml/parser/ForStatementBlock.java
index a13db39..782b682 100644
--- a/src/main/java/org/apache/sysml/parser/ForStatementBlock.java
+++ b/src/main/java/org/apache/sysml/parser/ForStatementBlock.java
@@ -358,7 +358,7 @@ public class ForStatementBlock extends StatementBlock
if (replacementExpr != null)
ip.setFromExpr(replacementExpr);
- // handle replacment in to expression
+ // handle replacement in to expression
replacementExpr = replaceConstantVar(ip.getToExpr(), currConstVars);
if (replacementExpr != null)
ip.setToExpr(replacementExpr);
http://git-wip-us.apache.org/repos/asf/incubator-systemml/blob/9b7f8b62/src/main/java/org/apache/sysml/parser/IterablePredicate.java
----------------------------------------------------------------------
diff --git a/src/main/java/org/apache/sysml/parser/IterablePredicate.java b/src/main/java/org/apache/sysml/parser/IterablePredicate.java
index 5c86350..e145eb7 100644
--- a/src/main/java/org/apache/sysml/parser/IterablePredicate.java
+++ b/src/main/java/org/apache/sysml/parser/IterablePredicate.java
@@ -73,19 +73,18 @@ public class IterablePredicate extends Expression
}
- public VariableSet variablesRead()
- {
+ public VariableSet variablesRead() {
VariableSet result = new VariableSet();
result.addVariables( _fromExpr.variablesRead() );
result.addVariables( _toExpr.variablesRead() );
- result.addVariables( _incrementExpr.variablesRead() );
+ if( _incrementExpr != null )
+ result.addVariables( _incrementExpr.variablesRead() );
return result;
}
- public VariableSet variablesUpdated()
- {
+ public VariableSet variablesUpdated() {
VariableSet result = new VariableSet();
result.addVariable(_iterVar.getName(), _iterVar);
@@ -105,7 +104,6 @@ public class IterablePredicate extends Expression
public void validateExpression(HashMap<String, DataIdentifier> ids, HashMap<String, ConstIdentifier> constVars, boolean conditional)
throws LanguageException
{
-
//recursive validate
if (_iterVar instanceof FunctionCallIdentifier
|| _fromExpr instanceof FunctionCallIdentifier
@@ -115,8 +113,6 @@ public class IterablePredicate extends Expression
false, LanguageException.LanguageErrorCodes.UNSUPPORTED_EXPRESSION);
}
-
-
//1) VALIDATE ITERATION VARIABLE (index)
// check the variable has either 1) not been defined already OR 2) defined as integer scalar
if (ids.containsKey(_iterVar.getName())){
@@ -134,10 +130,20 @@ public class IterablePredicate extends Expression
//2) VALIDATE FOR PREDICATE in (from, to, increment)
+ // handle default increment if unspecified
+ if( _incrementExpr == null && _fromExpr instanceof ConstIdentifier
+ && _toExpr instanceof ConstIdentifier ) {
+ ConstIdentifier cFrom = (ConstIdentifier) _fromExpr;
+ ConstIdentifier cTo = (ConstIdentifier) _toExpr;
+ _incrementExpr = new IntIdentifier( (cFrom.getLongValue() <= cTo.getLongValue()) ? 1 : -1,
+ getFilename(), getBeginLine(), getBeginColumn(), getEndLine(), getEndColumn());
+ }
+
//recursively validate the individual expression
_fromExpr.validateExpression(ids, constVars, conditional);
_toExpr.validateExpression(ids, constVars, conditional);
- _incrementExpr.validateExpression(ids, constVars, conditional);
+ if( _incrementExpr != null )
+ _incrementExpr.validateExpression(ids, constVars, conditional);
//check for scalar expression output
checkNumericScalarOutput( _fromExpr );
@@ -195,7 +201,7 @@ public class IterablePredicate extends Expression
ret[1] = from.getOutputParameters().getLabel();
if( to.getType()==Lop.Type.Data )
ret[2] = to.getOutputParameters().getLabel();
- if( incr.getType()==Lop.Type.Data )
+ if( incr != null && incr.getType()==Lop.Type.Data )
ret[3] = incr.getOutputParameters().getLabel();
return ret;
http://git-wip-us.apache.org/repos/asf/incubator-systemml/blob/9b7f8b62/src/main/java/org/apache/sysml/parser/ParForStatementBlock.java
----------------------------------------------------------------------
diff --git a/src/main/java/org/apache/sysml/parser/ParForStatementBlock.java b/src/main/java/org/apache/sysml/parser/ParForStatementBlock.java
index 64cffec..fb5a8eb 100644
--- a/src/main/java/org/apache/sysml/parser/ParForStatementBlock.java
+++ b/src/main/java/org/apache/sysml/parser/ParForStatementBlock.java
@@ -1050,10 +1050,9 @@ public class ParForStatementBlock extends ForStatementBlock
//NOTE: conservative approach: include all index variables (also from for)
if( ip.getIncrementExpr() instanceof IntIdentifier )
incr = ((IntIdentifier)ip.getIncrementExpr()).getValue();
- else
- throw new LanguageException("PARFOR loop dependency analysis: cannot check for dependencies " +
- "because increment expression '"+ip.getIncrementExpr().toString()+"' cannot be normalized.");
-
+ else
+ incr = ( low <= up ) ? 1 : -1;
+
_bounds._lower.put(ip.getIterVar()._name, low);
_bounds._upper.put(ip.getIterVar()._name, up);
_bounds._increment.put(ip.getIterVar()._name, incr);
http://git-wip-us.apache.org/repos/asf/incubator-systemml/blob/9b7f8b62/src/main/java/org/apache/sysml/parser/common/CommonSyntacticValidator.java
----------------------------------------------------------------------
diff --git a/src/main/java/org/apache/sysml/parser/common/CommonSyntacticValidator.java b/src/main/java/org/apache/sysml/parser/common/CommonSyntacticValidator.java
index e75c31d..78ba3d6 100644
--- a/src/main/java/org/apache/sysml/parser/common/CommonSyntacticValidator.java
+++ b/src/main/java/org/apache/sysml/parser/common/CommonSyntacticValidator.java
@@ -40,7 +40,6 @@ import org.apache.sysml.parser.DoubleIdentifier;
import org.apache.sysml.parser.Expression;
import org.apache.sysml.parser.Expression.DataOp;
import org.apache.sysml.parser.FunctionCallIdentifier;
-import org.apache.sysml.parser.IndexedIdentifier;
import org.apache.sysml.parser.IntIdentifier;
import org.apache.sysml.parser.LanguageException;
import org.apache.sysml.parser.MultiAssignmentStatement;
http://git-wip-us.apache.org/repos/asf/incubator-systemml/blob/9b7f8b62/src/main/java/org/apache/sysml/parser/dml/DmlSyntacticValidator.java
----------------------------------------------------------------------
diff --git a/src/main/java/org/apache/sysml/parser/dml/DmlSyntacticValidator.java b/src/main/java/org/apache/sysml/parser/dml/DmlSyntacticValidator.java
index 5f5b2f3..81538bc 100644
--- a/src/main/java/org/apache/sysml/parser/dml/DmlSyntacticValidator.java
+++ b/src/main/java/org/apache/sysml/parser/dml/DmlSyntacticValidator.java
@@ -47,7 +47,6 @@ import org.apache.sysml.parser.FunctionStatement;
import org.apache.sysml.parser.IfStatement;
import org.apache.sysml.parser.ImportStatement;
import org.apache.sysml.parser.IndexedIdentifier;
-import org.apache.sysml.parser.IntIdentifier;
import org.apache.sysml.parser.IterablePredicate;
import org.apache.sysml.parser.LanguageException;
import org.apache.sysml.parser.ParForStatement;
@@ -651,7 +650,7 @@ public class DmlSyntacticValidator extends CommonSyntacticValidator implements D
DataIdentifier iterVar = new DataIdentifier(ctx.iterVar.getText());
HashMap<String, String> parForParamValues = null;
- Expression incrementExpr = new IntIdentifier(1, currentFile, line, col, line, col);
+ Expression incrementExpr = null; //1/-1
if(ctx.iterPred.info.increment != null) {
incrementExpr = ctx.iterPred.info.increment;
}
@@ -682,8 +681,7 @@ public class DmlSyntacticValidator extends CommonSyntacticValidator implements D
}
}
- Expression incrementExpr = new IntIdentifier(1, currentFile, line, col, line, col);
-
+ Expression incrementExpr = null; //1/-1
if( ctx.iterPred.info.increment != null ) {
incrementExpr = ctx.iterPred.info.increment;
}
http://git-wip-us.apache.org/repos/asf/incubator-systemml/blob/9b7f8b62/src/main/java/org/apache/sysml/parser/pydml/PydmlSyntacticValidator.java
----------------------------------------------------------------------
diff --git a/src/main/java/org/apache/sysml/parser/pydml/PydmlSyntacticValidator.java b/src/main/java/org/apache/sysml/parser/pydml/PydmlSyntacticValidator.java
index aa09e0d..3e2215c 100644
--- a/src/main/java/org/apache/sysml/parser/pydml/PydmlSyntacticValidator.java
+++ b/src/main/java/org/apache/sysml/parser/pydml/PydmlSyntacticValidator.java
@@ -1210,7 +1210,7 @@ public class PydmlSyntacticValidator extends CommonSyntacticValidator implements
DataIdentifier iterVar = new DataIdentifier(ctx.iterVar.getText());
HashMap<String, String> parForParamValues = null;
- Expression incrementExpr = new IntIdentifier(1, currentFile, line, col, line, col);
+ Expression incrementExpr = null; //1/-1
if(ctx.iterPred.info.increment != null) {
incrementExpr = ctx.iterPred.info.increment;
}
@@ -1241,8 +1241,7 @@ public class PydmlSyntacticValidator extends CommonSyntacticValidator implements
}
}
- Expression incrementExpr = new IntIdentifier(1, currentFile, line, col, line, col);
-
+ Expression incrementExpr = null; //1/-1
if( ctx.iterPred.info.increment != null ) {
incrementExpr = ctx.iterPred.info.increment;
}
http://git-wip-us.apache.org/repos/asf/incubator-systemml/blob/9b7f8b62/src/main/java/org/apache/sysml/runtime/controlprogram/ForProgramBlock.java
----------------------------------------------------------------------
diff --git a/src/main/java/org/apache/sysml/runtime/controlprogram/ForProgramBlock.java b/src/main/java/org/apache/sysml/runtime/controlprogram/ForProgramBlock.java
index db853f6..535f318 100644
--- a/src/main/java/org/apache/sysml/runtime/controlprogram/ForProgramBlock.java
+++ b/src/main/java/org/apache/sysml/runtime/controlprogram/ForProgramBlock.java
@@ -20,6 +20,7 @@
package org.apache.sysml.runtime.controlprogram;
import java.util.ArrayList;
+import java.util.Iterator;
import org.apache.sysml.api.DMLScript;
import org.apache.sysml.hops.Hop;
@@ -162,43 +163,35 @@ public class ForProgramBlock extends ProgramBlock
// evaluate from, to, incr only once (assumption: known at for entry)
IntObject from = executePredicateInstructions( 1, _fromInstructions, ec );
IntObject to = executePredicateInstructions( 2, _toInstructions, ec );
- IntObject incr = executePredicateInstructions( 3, _incrementInstructions, ec );
+ IntObject incr = (_incrementInstructions == null || _incrementInstructions.isEmpty()) && _iterablePredicateVars[3]==null ?
+ new IntObject((from.getLongValue()<=to.getLongValue()) ? 1 : -1) :
+ executePredicateInstructions( 3, _incrementInstructions, ec );
- if ( incr.getLongValue() <= 0 ) //would produce infinite loop
- throw new DMLRuntimeException(this.printBlockErrorLocation() + "Expression for increment of variable '" + iterVarName + "' must evaluate to a positive value.");
-
- // initialize iter var to from value
- IntObject iterVar = new IntObject(iterVarName, from.getLongValue() );
+ if ( incr.getLongValue() == 0 ) //would produce infinite loop
+ throw new DMLRuntimeException(this.printBlockErrorLocation() + "Expression for increment of variable '" + iterVarName + "' must evaluate to a non-zero value.");
// execute for loop
try
{
- // run for loop body as long as predicate is true
- // (for supporting dynamic TO, move expression execution to end of while loop)
- while( iterVar.getLongValue() <= to.getLongValue() )
+ // run for loop body for each instance of predicate sequence
+ SequenceIterator seqIter = new SequenceIterator(iterVarName, from, to, incr);
+ for( IntObject iterVar : seqIter )
{
+ //set iteration variable
ec.setVariable(iterVarName, iterVar);
- //for all child blocks
- for (int i=0 ; i < this._childBlocks.size() ; i++) {
+ //execute all child blocks
+ for(int i=0 ; i < this._childBlocks.size() ; i++) {
ec.updateDebugState( i );
_childBlocks.get(i).execute(ec);
}
-
- // update the iterable predicate variable
- if(ec.getVariable(iterVarName) == null || !(ec.getVariable(iterVarName) instanceof IntObject))
- throw new DMLRuntimeException("Iterable predicate variable " + iterVarName + " must remain of type scalar int.");
-
- //increment of iterVar (changes in loop body get discarded)
- iterVar = new IntObject( iterVarName, iterVar.getLongValue()+incr.getLongValue() );
}
}
- catch (DMLScriptException e)
- {
+ catch (DMLScriptException e) {
+ //propagate stop call
throw e;
}
- catch (Exception e)
- {
+ catch (Exception e) {
throw new DMLRuntimeException(printBlockErrorLocation() + "Error evaluating for program block", e);
}
@@ -286,4 +279,48 @@ public class ForProgramBlock extends ProgramBlock
public String printBlockErrorLocation(){
return "ERROR: Runtime error in for program block generated from for statement block between lines " + _beginLine + " and " + _endLine + " -- ";
}
+
+ /**
+ * Utility class for iterating over positive or negative predicate sequences.
+ */
+ protected class SequenceIterator implements Iterator<IntObject>, Iterable<IntObject>
+ {
+ private String _varName = null;
+ private long _cur = -1;
+ private long _to = -1;
+ private long _incr = -1;
+ private boolean _inuse = false;
+
+ protected SequenceIterator(String varName, IntObject from, IntObject to, IntObject incr) {
+ _varName = varName;
+ _cur = from.getLongValue();
+ _to = to.getLongValue();
+ _incr = incr.getLongValue();
+ }
+
+ @Override
+ public boolean hasNext() {
+ return _incr > 0 ? _cur <= _to : _cur >= _to;
+ }
+
+ @Override
+ public IntObject next() {
+ IntObject ret = new IntObject( _varName, _cur );
+ _cur += _incr; //update current val
+ return ret;
+ }
+
+ @Override
+ public Iterator<IntObject> iterator() {
+ if( _inuse )
+ throw new RuntimeException("Unsupported reuse of iterator.");
+ _inuse = true;
+ return this;
+ }
+
+ @Override
+ public void remove() {
+ throw new RuntimeException("Unsupported remove on iterator.");
+ }
+ }
}
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/incubator-systemml/blob/9b7f8b62/src/main/java/org/apache/sysml/runtime/controlprogram/ParForProgramBlock.java
----------------------------------------------------------------------
diff --git a/src/main/java/org/apache/sysml/runtime/controlprogram/ParForProgramBlock.java b/src/main/java/org/apache/sysml/runtime/controlprogram/ParForProgramBlock.java
index fd53f4d..d03d3b8 100644
--- a/src/main/java/org/apache/sysml/runtime/controlprogram/ParForProgramBlock.java
+++ b/src/main/java/org/apache/sysml/runtime/controlprogram/ParForProgramBlock.java
@@ -529,10 +529,12 @@ public class ParForProgramBlock extends ForProgramBlock
// evaluate from, to, incr only once (assumption: known at for entry)
IntObject from = executePredicateInstructions( 1, _fromInstructions, ec );
IntObject to = executePredicateInstructions( 2, _toInstructions, ec );
- IntObject incr = executePredicateInstructions( 3, _incrementInstructions, ec );
+ IntObject incr = (_incrementInstructions == null || _incrementInstructions.isEmpty()) && _iterablePredicateVars[3]==null ?
+ new IntObject((from.getLongValue()<=to.getLongValue()) ? 1 : -1) :
+ executePredicateInstructions( 3, _incrementInstructions, ec );
- if ( incr.getLongValue() <= 0 ) //would produce infinite loop
- throw new DMLRuntimeException(this.printBlockErrorLocation() + "Expression for increment of variable '" + iterVarName + "' must evaluate to a positive value.");
+ if ( incr.getLongValue() == 0 ) //would produce infinite loop
+ throw new DMLRuntimeException(this.printBlockErrorLocation() + "Expression for increment of variable '" + iterVarName + "' must evaluate to a non-zero value.");
//early exit on num iterations = zero
if( computeNumIterations(from, to, incr) <= 0 )
http://git-wip-us.apache.org/repos/asf/incubator-systemml/blob/9b7f8b62/src/main/java/org/apache/sysml/runtime/controlprogram/parfor/TaskPartitioner.java
----------------------------------------------------------------------
diff --git a/src/main/java/org/apache/sysml/runtime/controlprogram/parfor/TaskPartitioner.java b/src/main/java/org/apache/sysml/runtime/controlprogram/parfor/TaskPartitioner.java
index e96e9ee..9349402 100644
--- a/src/main/java/org/apache/sysml/runtime/controlprogram/parfor/TaskPartitioner.java
+++ b/src/main/java/org/apache/sysml/runtime/controlprogram/parfor/TaskPartitioner.java
@@ -33,27 +33,26 @@ import org.apache.sysml.runtime.instructions.cp.IntObject;
*
*/
public abstract class TaskPartitioner
-{
-
- protected long _taskSize = -1;
-
+{
+ protected long _taskSize = -1;
protected String _iterVarName = null;
protected IntObject _fromVal = null;
protected IntObject _toVal = null;
protected IntObject _incrVal = null;
-
- protected long _numIter = -1;
-
+ protected long _numIter = -1;
protected TaskPartitioner( long taskSize, String iterVarName, IntObject fromVal, IntObject toVal, IntObject incrVal )
{
_taskSize = taskSize;
-
_iterVarName = iterVarName;
_fromVal = fromVal;
_toVal = toVal;
_incrVal = incrVal;
+ //normalize predicate if necessary
+ normalizePredicate();
+
+ //compute number of iterations
_numIter = (long)Math.ceil(((double)(_toVal.getLongValue()-_fromVal.getLongValue()+1 )) / _incrVal.getLongValue());
}
@@ -79,8 +78,25 @@ public abstract class TaskPartitioner
*
* @return
*/
- public long getNumIterations()
- {
+ public long getNumIterations() {
return _numIter;
}
+
+ /**
+ * Normalizes the (from, to, incr) predicate to a predicate w/
+ * positive increment.
+ */
+ private void normalizePredicate() {
+ //check for positive increment
+ if( _incrVal.getLongValue() >= 0 )
+ return;
+
+ long lfrom = _fromVal.getLongValue();
+ long lto = _toVal.getLongValue();
+ long lincr = _incrVal.getLongValue();
+
+ _fromVal = new IntObject(lfrom - ((lfrom - lto)/lincr * lincr));
+ _toVal = new IntObject(lfrom);
+ _incrVal = new IntObject(-1 * lincr);
+ }
}
http://git-wip-us.apache.org/repos/asf/incubator-systemml/blob/9b7f8b62/src/main/java/org/apache/sysml/runtime/controlprogram/parfor/opt/OptTreeConverter.java
----------------------------------------------------------------------
diff --git a/src/main/java/org/apache/sysml/runtime/controlprogram/parfor/opt/OptTreeConverter.java b/src/main/java/org/apache/sysml/runtime/controlprogram/parfor/opt/OptTreeConverter.java
index 35d8b84..c65a627 100644
--- a/src/main/java/org/apache/sysml/runtime/controlprogram/parfor/opt/OptTreeConverter.java
+++ b/src/main/java/org/apache/sysml/runtime/controlprogram/parfor/opt/OptTreeConverter.java
@@ -447,10 +447,12 @@ public class OptTreeConverter
//handle predicate
fsb.getFromHops().resetVisitStatus();
fsb.getToHops().resetVisitStatus();
- fsb.getIncrementHops().resetVisitStatus();
+ if( fsb.getIncrementHops()!=null )
+ fsb.getIncrementHops().resetVisitStatus();
node.addChilds( rCreateAbstractOptNodes( fsb.getFromHops(), vars, memo ) );
node.addChilds( rCreateAbstractOptNodes( fsb.getToHops(), vars, memo ) );
- node.addChilds( rCreateAbstractOptNodes( fsb.getIncrementHops(), vars, memo ) );
+ if( fsb.getIncrementHops()!=null )
+ node.addChilds( rCreateAbstractOptNodes( fsb.getIncrementHops(), vars, memo ) );
//process body
int len = fs.getBody().size();
@@ -495,10 +497,12 @@ public class OptTreeConverter
{
fsb.getFromHops().resetVisitStatus();
fsb.getToHops().resetVisitStatus();
- fsb.getIncrementHops().resetVisitStatus();
+ if( fsb.getIncrementHops()!=null )
+ fsb.getIncrementHops().resetVisitStatus();
node.addChilds( rCreateAbstractOptNodes( fsb.getFromHops(), vars, memo ) );
node.addChilds( rCreateAbstractOptNodes( fsb.getToHops(), vars, memo ) );
- node.addChilds( rCreateAbstractOptNodes( fsb.getIncrementHops(), vars, memo ) );
+ if( fsb.getIncrementHops()!=null )
+ node.addChilds( rCreateAbstractOptNodes( fsb.getIncrementHops(), vars, memo ) );
}
//process body
http://git-wip-us.apache.org/repos/asf/incubator-systemml/blob/9b7f8b62/src/test/java/org/apache/sysml/test/integration/functions/misc/NegativeLoopIncrementsTest.java
----------------------------------------------------------------------
diff --git a/src/test/java/org/apache/sysml/test/integration/functions/misc/NegativeLoopIncrementsTest.java b/src/test/java/org/apache/sysml/test/integration/functions/misc/NegativeLoopIncrementsTest.java
new file mode 100644
index 0000000..fde3893
--- /dev/null
+++ b/src/test/java/org/apache/sysml/test/integration/functions/misc/NegativeLoopIncrementsTest.java
@@ -0,0 +1,129 @@
+/*
+ * 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.
+ */
+
+package org.apache.sysml.test.integration.functions.misc;
+
+import java.util.HashMap;
+
+import org.junit.Test;
+
+import org.apache.sysml.runtime.matrix.MatrixCharacteristics;
+import org.apache.sysml.runtime.matrix.data.MatrixValue.CellIndex;
+import org.apache.sysml.test.integration.AutomatedTestBase;
+import org.apache.sysml.test.integration.TestConfiguration;
+import org.apache.sysml.test.utils.TestUtils;
+
+/**
+ *
+ */
+public class NegativeLoopIncrementsTest extends AutomatedTestBase
+{
+ private final static String TEST_NAME1 = "NegativeForIncrTest";
+ private final static String TEST_NAME2 = "NegativeParforIncrTest";
+
+ private final static String TEST_DIR = "functions/misc/";
+ private static final String TEST_CLASS_DIR = TEST_DIR + NegativeLoopIncrementsTest.class.getSimpleName() + "/";
+ private final static int rows = 372;
+ private final static int cols = 1;
+ private final static double eps = 1e-8;
+
+ @Override
+ public void setUp() {
+ TestUtils.clearAssertionInformation();
+ addTestConfiguration(TEST_NAME1, new TestConfiguration(TEST_CLASS_DIR, TEST_NAME1, new String[] { "R" }));
+ addTestConfiguration(TEST_NAME2, new TestConfiguration(TEST_CLASS_DIR, TEST_NAME2, new String[] { "R" }));
+ }
+
+ @Test
+ public void testNegativeForIncrementsScalar() {
+ runNegativeLoopIncrementsTest(TEST_NAME1, false, false);
+ }
+
+ @Test
+ public void testNegativeForIncrementsVector() {
+ runNegativeLoopIncrementsTest(TEST_NAME1, true, false);
+ }
+
+ @Test
+ public void testNegativeParForIncrementsScalar() {
+ runNegativeLoopIncrementsTest(TEST_NAME2, false, false);
+ }
+
+ @Test
+ public void testNegativeParForIncrementsVector() {
+ runNegativeLoopIncrementsTest(TEST_NAME2, true, false);
+ }
+
+ @Test
+ public void testNegativeForIncrementsScalarMulti() {
+ runNegativeLoopIncrementsTest(TEST_NAME1, false, true);
+ }
+
+ @Test
+ public void testNegativeForIncrementsVectorMulti() {
+ runNegativeLoopIncrementsTest(TEST_NAME1, true, true);
+ }
+
+ @Test
+ public void testNegativeParForIncrementsScalarMulti() {
+ runNegativeLoopIncrementsTest(TEST_NAME2, false, true);
+ }
+
+ @Test
+ public void testNegativeParForIncrementsVectorMulti() {
+ runNegativeLoopIncrementsTest(TEST_NAME2, true, true);
+ }
+
+ /**
+ *
+ * @param sparseM1
+ * @param sparseM2
+ * @param instType
+ */
+ private void runNegativeLoopIncrementsTest( String testname, boolean vect, boolean multiStep )
+ {
+ String TEST_NAME = testname;
+ TestConfiguration config = getTestConfiguration(TEST_NAME);
+ loadTestConfiguration(config);
+
+ double[][] A = getRandomMatrix(rows, cols, -5, 5, 0.9, 7);
+ writeInputMatrixWithMTD("A", A, true);
+
+ String HOME = SCRIPT_DIR + TEST_DIR;
+ fullDMLScriptName = HOME + TEST_NAME + ".dml";
+ programArgs = new String[]{"-args", input("A"), String.valueOf(vect?0:1),
+ String.valueOf(multiStep).toUpperCase(), output("R")};
+
+ fullRScriptName = HOME + TEST_NAME +".R";
+ rCmd = getRCmd(inputDir(), String.valueOf(vect?0:1),
+ String.valueOf(multiStep).toUpperCase(), expectedDir());
+
+ //run Tests
+ runTest(true, false, null, -1);
+ runRScript(true);
+
+ //compare matrices
+ HashMap<CellIndex, Double> dmlfile = readDMLMatrixFromHDFS("R");
+ HashMap<CellIndex, Double> rfile = readRMatrixFromFS("R");
+ TestUtils.compareMatrices(dmlfile, rfile, eps, "Stat-DML", "Stat-R");
+
+ //check meta data
+ checkDMLMetaDataFile("R", new MatrixCharacteristics(1,1,1,1));
+ }
+}
http://git-wip-us.apache.org/repos/asf/incubator-systemml/blob/9b7f8b62/src/test/scripts/functions/misc/NegativeForIncrTest.R
----------------------------------------------------------------------
diff --git a/src/test/scripts/functions/misc/NegativeForIncrTest.R b/src/test/scripts/functions/misc/NegativeForIncrTest.R
new file mode 100644
index 0000000..a084986
--- /dev/null
+++ b/src/test/scripts/functions/misc/NegativeForIncrTest.R
@@ -0,0 +1,43 @@
+#-------------------------------------------------------------
+#
+# 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")
+
+A = as.matrix(readMM(paste(args[1], "A.mtx", sep="")))
+c = as.integer(args[2]);
+mStep = as.logical(args[3]);
+
+s = 0;
+if( mStep ) {
+ for( i in seq(nrow(A),1,-7) ) {
+ s = s + A[i,1] + c;
+ }
+} else {
+ for( i in nrow(A):1 ) {
+ s = s + A[i,1] + c;
+ }
+}
+
+R = as.matrix(s);
+writeMM(as(R, "CsparseMatrix"), paste(args[4], "R", sep=""));
http://git-wip-us.apache.org/repos/asf/incubator-systemml/blob/9b7f8b62/src/test/scripts/functions/misc/NegativeForIncrTest.dml
----------------------------------------------------------------------
diff --git a/src/test/scripts/functions/misc/NegativeForIncrTest.dml b/src/test/scripts/functions/misc/NegativeForIncrTest.dml
new file mode 100644
index 0000000..2a5e742
--- /dev/null
+++ b/src/test/scripts/functions/misc/NegativeForIncrTest.dml
@@ -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.
+#
+#-------------------------------------------------------------
+
+A = read($1);
+c = as.integer($2);
+mStep = as.logical($3);
+
+s = 0;
+if( mStep )
+ for( i in seq(nrow(A),1,-7) )
+ s = s + as.scalar(A[i,1]) + c;
+else
+ for( i in nrow(A):1 )
+ s = s + as.scalar(A[i,1]) + c;
+
+R = as.matrix(s);
+write(R, $4);
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/incubator-systemml/blob/9b7f8b62/src/test/scripts/functions/misc/NegativeParForIncrTest.R
----------------------------------------------------------------------
diff --git a/src/test/scripts/functions/misc/NegativeParForIncrTest.R b/src/test/scripts/functions/misc/NegativeParForIncrTest.R
new file mode 100644
index 0000000..a084986
--- /dev/null
+++ b/src/test/scripts/functions/misc/NegativeParForIncrTest.R
@@ -0,0 +1,43 @@
+#-------------------------------------------------------------
+#
+# 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")
+
+A = as.matrix(readMM(paste(args[1], "A.mtx", sep="")))
+c = as.integer(args[2]);
+mStep = as.logical(args[3]);
+
+s = 0;
+if( mStep ) {
+ for( i in seq(nrow(A),1,-7) ) {
+ s = s + A[i,1] + c;
+ }
+} else {
+ for( i in nrow(A):1 ) {
+ s = s + A[i,1] + c;
+ }
+}
+
+R = as.matrix(s);
+writeMM(as(R, "CsparseMatrix"), paste(args[4], "R", sep=""));
http://git-wip-us.apache.org/repos/asf/incubator-systemml/blob/9b7f8b62/src/test/scripts/functions/misc/NegativeParForIncrTest.dml
----------------------------------------------------------------------
diff --git a/src/test/scripts/functions/misc/NegativeParForIncrTest.dml b/src/test/scripts/functions/misc/NegativeParForIncrTest.dml
new file mode 100644
index 0000000..c53ce1c
--- /dev/null
+++ b/src/test/scripts/functions/misc/NegativeParForIncrTest.dml
@@ -0,0 +1,36 @@
+#-------------------------------------------------------------
+#
+# 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.
+#
+#-------------------------------------------------------------
+
+A = read($1);
+c = as.integer($2);
+mStep = as.logical($3);
+
+tmp = matrix(0, rows=nrow(A), cols=1);
+if( mStep )
+ parfor( i in seq(nrow(A),1,-7) )
+ tmp[i,1] = as.scalar(A[i,1]) + c;
+else
+ parfor( i in nrow(A):1 )
+ tmp[i,1] = as.scalar(A[i,1]) + c;
+s = sum(tmp);
+
+R = as.matrix(s);
+write(R, $4);
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/incubator-systemml/blob/9b7f8b62/src/test/scripts/functions/misc/conditionalValidate3.dml
----------------------------------------------------------------------
diff --git a/src/test/scripts/functions/misc/conditionalValidate3.dml b/src/test/scripts/functions/misc/conditionalValidate3.dml
index 94d8cdc..3b0f2f7 100644
--- a/src/test/scripts/functions/misc/conditionalValidate3.dml
+++ b/src/test/scripts/functions/misc/conditionalValidate3.dml
@@ -23,7 +23,7 @@
Y = matrix(1, rows=10, cols=10);
-for( i in 1:0 ) {
+for( i in seq(1,0,1) ) {
Y = read($1);
}
http://git-wip-us.apache.org/repos/asf/incubator-systemml/blob/9b7f8b62/src/test_suites/java/org/apache/sysml/test/integration/functions/misc/ZPackageSuite.java
----------------------------------------------------------------------
diff --git a/src/test_suites/java/org/apache/sysml/test/integration/functions/misc/ZPackageSuite.java b/src/test_suites/java/org/apache/sysml/test/integration/functions/misc/ZPackageSuite.java
index 5fa4d3a..23d8947 100644
--- a/src/test_suites/java/org/apache/sysml/test/integration/functions/misc/ZPackageSuite.java
+++ b/src/test_suites/java/org/apache/sysml/test/integration/functions/misc/ZPackageSuite.java
@@ -37,6 +37,7 @@ import org.junit.runners.Suite;
IPAScalarRecursionTest.class,
IPAUnknownRecursionTest.class,
LongOverflowTest.class,
+ NegativeLoopIncrementsTest.class,
NrowNcolStringTest.class,
NrowNcolUnknownCSVReadTest.class,
OuterTableExpandTest.class,