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 2017/08/09 20:53:02 UTC

[4/4] systemml git commit: [SYSTEMML-1833] Fix codegen race conditions and cleanup robustness

[SYSTEMML-1833] Fix codegen race conditions and cleanup robustness

This patch fixes two codegen issues which led to failures on the ARIMA
and MDABivariate algorithms. In detail, this includes (1) a fix of race
conditions on variable name creation/usage in multi-threaded parfor
contexts with dynamic recompilation, and (2) a fix of cleanup robustness
for row-wise templates with partial unknowns (which led to selecting a
row template for column vectors and thus invalid generated source code).
Additionally, we now also avoid unnecessary dense allocations for empty
side vector inputs to row-wise templates because these are only used
through cell indexing or dot products. 

Furthermore, this also includes a cleanup of the DML and R scripts for
MDABivariate statistics (vectorized loops), which simplifies debugging
and improves the R performance of these tests by almost 2x.


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

Branch: refs/heads/master
Commit: c170374e7fb2c709ac07b00caa9536c2da7e6987
Parents: 4b81d0d
Author: Matthias Boehm <mb...@gmail.com>
Authored: Wed Aug 9 13:51:38 2017 -0700
Committer: Matthias Boehm <mb...@gmail.com>
Committed: Wed Aug 9 13:52:53 2017 -0700

----------------------------------------------------------------------
 .../sysml/hops/codegen/SpoofCompiler.java       | 19 ++++---
 .../apache/sysml/hops/codegen/cplan/CNode.java  |  4 --
 .../sysml/hops/codegen/cplan/CNodeCell.java     |  2 +-
 .../hops/codegen/cplan/CNodeOuterProduct.java   |  2 +-
 .../hops/codegen/template/TemplateCell.java     |  2 +-
 .../sysml/runtime/codegen/SpoofOperator.java    | 10 ++--
 .../applications/MDABivariateStatsTest.java     |  1 +
 .../functions/codegen/AlgorithmARIMA.java       | 52 ++++++++++++++++++++
 .../functions/codegen/AlgorithmMDABivar.java    | 52 ++++++++++++++++++++
 .../applications/mdabivar/MDABivariateStats.R   | 35 +++++--------
 .../applications/mdabivar/MDABivariateStats.dml | 26 +++-------
 .../functions/codegen/ZPackageSuite.java        |  2 +
 12 files changed, 147 insertions(+), 60 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/systemml/blob/c170374e/src/main/java/org/apache/sysml/hops/codegen/SpoofCompiler.java
----------------------------------------------------------------------
diff --git a/src/main/java/org/apache/sysml/hops/codegen/SpoofCompiler.java b/src/main/java/org/apache/sysml/hops/codegen/SpoofCompiler.java
index 5029802..d5c9618 100644
--- a/src/main/java/org/apache/sysml/hops/codegen/SpoofCompiler.java
+++ b/src/main/java/org/apache/sysml/hops/codegen/SpoofCompiler.java
@@ -704,15 +704,18 @@ public class SpoofCompiler
 					}
 			}
 			
-			//remove spurious lookups on main input of cell template
-			if( tpl instanceof CNodeCell || tpl instanceof CNodeOuterProduct ) {
-				CNodeData in1 = (CNodeData)tpl.getInput().get(0);
-				rFindAndRemoveLookup(tpl.getOutput(), in1);
-			}
-			else if( tpl instanceof CNodeMultiAgg ) {
-				CNodeData in1 = (CNodeData)tpl.getInput().get(0);
+			//remove invalid lookups on main input (all templates)
+			CNodeData in1 = (CNodeData)tpl.getInput().get(0);
+			if( tpl instanceof CNodeMultiAgg )
 				rFindAndRemoveLookupMultiAgg((CNodeMultiAgg)tpl, in1);
-			}
+			else
+				rFindAndRemoveLookup(tpl.getOutput(), in1);
+			
+			//remove invalid row templates (e.g., due to partial unknowns)
+			if( tpl instanceof CNodeRow && (in1.getNumCols() == 1
+				|| (((CNodeRow)tpl).getRowType()==RowType.NO_AGG
+					&& tpl.getOutput().getDataType().isScalar())) )
+				cplans2.remove(e.getKey());
 			
 			//remove cplan w/ single op and w/o agg
 			if( (tpl instanceof CNodeCell && ((CNodeCell)tpl).getCellType()==CellType.NO_AGG

http://git-wip-us.apache.org/repos/asf/systemml/blob/c170374e/src/main/java/org/apache/sysml/hops/codegen/cplan/CNode.java
----------------------------------------------------------------------
diff --git a/src/main/java/org/apache/sysml/hops/codegen/cplan/CNode.java b/src/main/java/org/apache/sysml/hops/codegen/cplan/CNode.java
index 1f91697..ff9103e 100644
--- a/src/main/java/org/apache/sysml/hops/codegen/cplan/CNode.java
+++ b/src/main/java/org/apache/sysml/hops/codegen/cplan/CNode.java
@@ -75,10 +75,6 @@ public abstract class CNode
 		return _genVar; 
 	}
 	
-	protected static String getCurrentVarName() {
-		return "TMP"+(_seqVar.getCurrentID()-1);
-	}
-	
 	public String getVarname() {
 		return _genVar;
 	}

http://git-wip-us.apache.org/repos/asf/systemml/blob/c170374e/src/main/java/org/apache/sysml/hops/codegen/cplan/CNodeCell.java
----------------------------------------------------------------------
diff --git a/src/main/java/org/apache/sysml/hops/codegen/cplan/CNodeCell.java b/src/main/java/org/apache/sysml/hops/codegen/cplan/CNodeCell.java
index 36cf56f..dd3806d 100644
--- a/src/main/java/org/apache/sysml/hops/codegen/cplan/CNodeCell.java
+++ b/src/main/java/org/apache/sysml/hops/codegen/cplan/CNodeCell.java
@@ -118,7 +118,7 @@ public class CNodeCell extends CNodeTpl
 		tmp = tmp.replace("%BODY_dense%", tmpDense);
 		
 		//return last TMP
-		tmp = tmp.replace("%OUT%", getCurrentVarName());
+		tmp = tmp.replace("%OUT%", _output.getVarname());
 		
 		//replace meta data information
 		tmp = tmp.replace("%TYPE%", getCellType().name());

http://git-wip-us.apache.org/repos/asf/systemml/blob/c170374e/src/main/java/org/apache/sysml/hops/codegen/cplan/CNodeOuterProduct.java
----------------------------------------------------------------------
diff --git a/src/main/java/org/apache/sysml/hops/codegen/cplan/CNodeOuterProduct.java b/src/main/java/org/apache/sysml/hops/codegen/cplan/CNodeOuterProduct.java
index 90917f8..b06e9b9 100644
--- a/src/main/java/org/apache/sysml/hops/codegen/cplan/CNodeOuterProduct.java
+++ b/src/main/java/org/apache/sysml/hops/codegen/cplan/CNodeOuterProduct.java
@@ -83,7 +83,7 @@ public class CNodeOuterProduct extends CNodeTpl
 		else {
 			tmp = tmp.replace("%BODY_dense%", "");
 			tmp = tmp.replace("%BODY_cellwise%", tmpDense);
-			tmp = tmp.replace("%OUT_cellwise%", getCurrentVarName());
+			tmp = tmp.replace("%OUT_cellwise%", _output.getVarname());
 		}
 		//replace size information
 		tmp = tmp.replace("%LEN%", "len");

http://git-wip-us.apache.org/repos/asf/systemml/blob/c170374e/src/main/java/org/apache/sysml/hops/codegen/template/TemplateCell.java
----------------------------------------------------------------------
diff --git a/src/main/java/org/apache/sysml/hops/codegen/template/TemplateCell.java b/src/main/java/org/apache/sysml/hops/codegen/template/TemplateCell.java
index b781fd8..c9d97b9 100644
--- a/src/main/java/org/apache/sysml/hops/codegen/template/TemplateCell.java
+++ b/src/main/java/org/apache/sysml/hops/codegen/template/TemplateCell.java
@@ -275,7 +275,7 @@ public class TemplateCell extends TemplateBase
 	}
 	
 	protected static boolean isValidOperation(Hop hop) 
-	{	
+	{
 		//prepare indicators for binary operations
 		boolean isBinaryMatrixScalar = false;
 		boolean isBinaryMatrixVector = false;

http://git-wip-us.apache.org/repos/asf/systemml/blob/c170374e/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 e302012..cff640c 100644
--- a/src/main/java/org/apache/sysml/runtime/codegen/SpoofOperator.java
+++ b/src/main/java/org/apache/sysml/runtime/codegen/SpoofOperator.java
@@ -93,9 +93,13 @@ public abstract class SpoofOperator implements Serializable
 			if( denseOnly && (in.isInSparseFormat() || !in.isAllocated()) ) {
 				//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)
-				b[i-offset] = new SideInput(DataConverter.convertToDoubleVector(in), null, clen);
-				LOG.warn(getClass().getName()+": Converted "+in.getNumRows()+"x"+in.getNumColumns()+
-					", nnz="+in.getNonZeros()+" sideways input matrix from sparse to dense.");	
+				if( in.getNumColumns()==1 && in.isEmptyBlock(false) ) //dense empty
+					b[i-offset] = new SideInput(null, null, clen);
+				else {
+					b[i-offset] = new SideInput(DataConverter.convertToDoubleVector(in), null, clen);
+					LOG.warn(getClass().getName()+": Converted "+in.getNumRows()+"x"+in.getNumColumns()+
+						", nnz="+in.getNonZeros()+" sideways input matrix from sparse to dense.");	
+				}
 			}
 			else if( in.isInSparseFormat() && in.isAllocated() ) {
 				b[i-offset] = new SideInput(null, in, clen);

http://git-wip-us.apache.org/repos/asf/systemml/blob/c170374e/src/test/java/org/apache/sysml/test/integration/applications/MDABivariateStatsTest.java
----------------------------------------------------------------------
diff --git a/src/test/java/org/apache/sysml/test/integration/applications/MDABivariateStatsTest.java b/src/test/java/org/apache/sysml/test/integration/applications/MDABivariateStatsTest.java
index 3b38504..f635241 100644
--- a/src/test/java/org/apache/sysml/test/integration/applications/MDABivariateStatsTest.java
+++ b/src/test/java/org/apache/sysml/test/integration/applications/MDABivariateStatsTest.java
@@ -72,6 +72,7 @@ public abstract class MDABivariateStatsTest extends AutomatedTestBase
 		if (scriptType == ScriptType.PYDML) {
 			proArgs.add("-python");
 		}
+		proArgs.add("-stats");
 		proArgs.add("-args");
 		proArgs.add(input("X"));
 		proArgs.add(Integer.toString(label_index));

http://git-wip-us.apache.org/repos/asf/systemml/blob/c170374e/src/test/java/org/apache/sysml/test/integration/functions/codegen/AlgorithmARIMA.java
----------------------------------------------------------------------
diff --git a/src/test/java/org/apache/sysml/test/integration/functions/codegen/AlgorithmARIMA.java b/src/test/java/org/apache/sysml/test/integration/functions/codegen/AlgorithmARIMA.java
new file mode 100644
index 0000000..248eb82
--- /dev/null
+++ b/src/test/java/org/apache/sysml/test/integration/functions/codegen/AlgorithmARIMA.java
@@ -0,0 +1,52 @@
+/*
+ * 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.codegen;
+
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.junit.runners.Parameterized;
+
+import java.io.File;
+
+import org.apache.sysml.test.integration.applications.ArimaTest;
+
+@RunWith(value = Parameterized.class)
+public class AlgorithmARIMA extends ArimaTest 
+{
+	private final static String LOCAL_TEST_DIR = "functions/codegen/";
+	private final static String TEST_CONF = "SystemML-config-codegen.xml";
+	private final static File   TEST_CONF_FILE = new File(SCRIPT_DIR + LOCAL_TEST_DIR, TEST_CONF);
+	
+	public AlgorithmARIMA(int m, int p, int d, int q, int P, int D, int Q, int s, int include_mean, int useJacobi) {
+		super(m, p, d, q, P, D, Q, s, include_mean, useJacobi);
+		TEST_CLASS_DIR = TEST_DIR + AlgorithmARIMA.class.getSimpleName() + "/";
+	}
+
+	@Test
+	public void testArimaDml() {
+		testArima(ScriptType.DML);
+	}
+	
+	@Override
+	protected File getConfigTemplateFile() {
+		System.out.println("This test case overrides default configuration with " + TEST_CONF_FILE.getPath());
+		return TEST_CONF_FILE;
+	}
+}

http://git-wip-us.apache.org/repos/asf/systemml/blob/c170374e/src/test/java/org/apache/sysml/test/integration/functions/codegen/AlgorithmMDABivar.java
----------------------------------------------------------------------
diff --git a/src/test/java/org/apache/sysml/test/integration/functions/codegen/AlgorithmMDABivar.java b/src/test/java/org/apache/sysml/test/integration/functions/codegen/AlgorithmMDABivar.java
new file mode 100644
index 0000000..9477234
--- /dev/null
+++ b/src/test/java/org/apache/sysml/test/integration/functions/codegen/AlgorithmMDABivar.java
@@ -0,0 +1,52 @@
+/*
+ * 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.codegen;
+
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.junit.runners.Parameterized;
+
+import java.io.File;
+
+import org.apache.sysml.test.integration.applications.MDABivariateStatsTest;
+
+@RunWith(value = Parameterized.class)
+public class AlgorithmMDABivar extends MDABivariateStatsTest 
+{
+	private final static String LOCAL_TEST_DIR = "functions/codegen/";
+	private final static String TEST_CONF = "SystemML-config-codegen.xml";
+	private final static File   TEST_CONF_FILE = new File(SCRIPT_DIR + LOCAL_TEST_DIR, TEST_CONF);
+	
+	public AlgorithmMDABivar(int n, int m, int li, int lml) {
+		super(n, m, li, lml);
+		TEST_CLASS_DIR = TEST_DIR + AlgorithmMDABivar.class.getSimpleName() + "/";
+	}
+
+	@Test
+	public void testMDABivariateStatsDml() {
+		testMDABivariateStats(ScriptType.DML);
+	}
+	
+	@Override
+	protected File getConfigTemplateFile() {
+		System.out.println("This test case overrides default configuration with " + TEST_CONF_FILE.getPath());
+		return TEST_CONF_FILE;
+	}
+}

http://git-wip-us.apache.org/repos/asf/systemml/blob/c170374e/src/test/scripts/applications/mdabivar/MDABivariateStats.R
----------------------------------------------------------------------
diff --git a/src/test/scripts/applications/mdabivar/MDABivariateStats.R b/src/test/scripts/applications/mdabivar/MDABivariateStats.R
index 1844bbb..92605ad 100644
--- a/src/test/scripts/applications/mdabivar/MDABivariateStats.R
+++ b/src/test/scripts/applications/mdabivar/MDABivariateStats.R
@@ -101,19 +101,19 @@ args <- commandArgs(TRUE)
 library(Matrix)
 
 # input data set
-D = readMM(paste(args[1], "X.mtx", sep=""));
+D = as.matrix(readMM(paste(args[1], "X.mtx", sep="")));
 
 # label attr id (must be a valid index > 0)  
 label_index = as.integer(args[2])
 
 # feature attributes, column vector of indices
-feature_indices = readMM(paste(args[1], "feature_indices.mtx", sep="")) 
+feature_indices = as.matrix(readMM(paste(args[1], "feature_indices.mtx", sep=""))) 
 
 # can be either 1 (scale) or 0 (categorical)
 label_measurement_level = as.integer(args[3]) 
 
 # measurement levels for features, 0/1 column vector
-feature_measurement_levels = readMM(paste(args[1], "feature_measurement_levels.mtx", sep="")) 
+feature_measurement_levels = as.matrix(readMM(paste(args[1], "feature_measurement_levels.mtx", sep=""))) 
 
 sz = ncol(D)
 
@@ -180,9 +180,7 @@ featureSTDs = matrix(0, sz, maxNumberOfGroups)
 
 if(label_measurement_level == 0){
 	featureCounts[label_index,1:length(distinct_label_values)] = distinct_label_values
-	for(i2 in 1:length(distinct_label_values)){
-		featureValues[label_index,i2] = i2-labelCorrection
-	}
+	featureValues[label_index,1:length(distinct_label_values)] = t(seq(1,length(distinct_label_values))-labelCorrection);
 }
 
 for(i3 in 1:nrow(feature_indices)){
@@ -209,28 +207,19 @@ for(i3 in 1:nrow(feature_indices)){
 			
 		  sz3 = nrow(contingencyTable)*ncol(contingencyTable)
 			
-		  contingencyTableCounts = matrix(0, 1, sz3)
-		  contingencyTableLabelValues = matrix(0, 1, sz3)
-		  contingencyTableFeatureValues = matrix(0, 1, sz3)
+			tmpLV = (seq(1,nrow(contingencyTable)) %*% matrix(1,1,ncol(contingencyTable))) - labelCorrection;
+			tmpFV = (matrix(1,nrow(contingencyTable),1) %*% t(seq(1,ncol(contingencyTable)))) - featureCorrection;
+			contingencyTableLabelValues = matrix(tmpLV, 1, sz3, byrow=TRUE);
+			contingencyTableFeatureValues = matrix(tmpFV, 1, sz3, byrow=TRUE);
 			
-            	  for(i4 in 1:nrow(contingencyTable)){
-		  	 for(j in 1:ncol(contingencyTable)){
-					#get rid of this, see *1 below
-					contingencyTableCounts[1, ncol(contingencyTable)*(i4-1)+j] = contingencyTable[i4,j]
-					
-					contingencyTableLabelValues[1, ncol(contingencyTable)*(i4-1)+j] = i4-labelCorrection
-					contingencyTableFeatureValues[1, ncol(contingencyTable)*(i4-1)+j] = j-featureCorrection 
-				}
-			}
+			contingencyTableCounts = matrix(contingencyTable, 1, sz3, byrow=TRUE);
 			contingencyTablesCounts[feature_index2,1:sz3] = contingencyTableCounts
             
 			contingencyTablesLabelValues[feature_index2,1:sz3] = contingencyTableLabelValues
 			contingencyTablesFeatureValues[feature_index2,1:sz3] = contingencyTableFeatureValues
 			
 			featureCounts[feature_index2,1:length(colMarginals)] = colMarginals
-			for(i5 in 1:length(colMarginals)){
-				featureValues[feature_index2,i5] = i5-featureCorrection
-			}
+			featureValues[feature_index2,1:length(colMarginals)] = t(seq(1,length(colMarginals)) - featureCorrection);
 		}else{
 			# label is scale, feature is categorical
 			tests[feature_index2,1] = 2
@@ -243,9 +232,7 @@ for(i3 in 1:nrow(feature_indices)){
 
 			stats[feature_index2,1] = pVal
 			featureCounts[feature_index2,1:nrow(frequencies)] = t(frequencies)
-			for(i6 in 1:nrow(frequencies)){
-				featureValues[feature_index2,i6] = i6 - featureCorrection
-			}
+			featureValues[feature_index2,1:nrow(frequencies)] = t(seq(1,nrow(frequencies)) - featureCorrection)
 			featureMeans[feature_index2,1:nrow(means)] = t(means)
 			featureSTDs[feature_index2,1:nrow(variances)] = t(sqrt(variances))
 		}

http://git-wip-us.apache.org/repos/asf/systemml/blob/c170374e/src/test/scripts/applications/mdabivar/MDABivariateStats.dml
----------------------------------------------------------------------
diff --git a/src/test/scripts/applications/mdabivar/MDABivariateStats.dml b/src/test/scripts/applications/mdabivar/MDABivariateStats.dml
index faf29b6..61ec7f2 100644
--- a/src/test/scripts/applications/mdabivar/MDABivariateStats.dml
+++ b/src/test/scripts/applications/mdabivar/MDABivariateStats.dml
@@ -101,9 +101,7 @@ featureSTDs = matrix(0, rows=sz, cols=maxNumberOfGroups)
 
 if(label_measurement_level == 0){
 	featureCounts[label_index,1:nrow(distinct_label_values)] = t(distinct_label_values)
-	parfor(i2 in 1:nrow(distinct_label_values)){
-		featureValues[label_index,i2] = i2-labelCorrection
-	}
+	featureValues[label_index,1:nrow(distinct_label_values)] = t(seq(1,nrow(distinct_label_values))-labelCorrection);
 }
 
 parfor(i3 in 1:nrow(feature_indices), check=0){
@@ -125,34 +123,26 @@ parfor(i3 in 1:nrow(feature_indices), check=0){
 			sz3 = nrow(contingencyTable)*ncol(contingencyTable)
 			while(FALSE){}
 			
-			contingencyTableLabelValues = matrix(0, rows=1, cols=sz3)
-			contingencyTableFeatureValues = matrix(0, rows=1, cols=sz3)
+			tmpLV = (seq(1,nrow(contingencyTable)) %*% matrix(1,1,ncol(contingencyTable))) - labelCorrection;
+			tmpFV = (matrix(1,nrow(contingencyTable),1) %*% t(seq(1,ncol(contingencyTable)))) - featureCorrection;
+			contingencyTableLabelValues = matrix(tmpLV, rows=1, cols=sz3)
+			contingencyTableFeatureValues = matrix(tmpFV, rows=1, cols=sz3)
 			
-            parfor(i4 in 1:nrow(contingencyTable), check=0){
-				parfor(j in 1:ncol(contingencyTable), check=0){
-					contingencyTableLabelValues[1, ncol(contingencyTable)*(i4-1)+j] = i4-labelCorrection
-					contingencyTableFeatureValues[1, ncol(contingencyTable)*(i4-1)+j] = j-featureCorrection 
-				}
-			}
 			contingencyTableCounts = matrix(contingencyTable, rows=1, cols=sz3, byrow=TRUE)
-            contingencyTablesCounts[feature_index2,1:sz3] = contingencyTableCounts
+			contingencyTablesCounts[feature_index2,1:sz3] = contingencyTableCounts
             
 			contingencyTablesLabelValues[feature_index2,1:sz3] = contingencyTableLabelValues
 			contingencyTablesFeatureValues[feature_index2,1:sz3] = contingencyTableFeatureValues
 			
 			featureCounts[feature_index2,1:ncol(colMarginals)] = colMarginals
-			parfor(i5 in 1:ncol(colMarginals), check=0){
-				featureValues[feature_index2,i5] = i5-featureCorrection
-			}
+			featureValues[feature_index2,1:ncol(colMarginals)] = t(seq(1,ncol(colMarginals)) - featureCorrection);
 		}else{
 			# label is scale, feature is categorical
 			tests[feature_index2,1] = 2
 			[pVal, frequencies, means, variances] = bivar_sc(labels, feature)
 			stats[feature_index2,1] = pVal
 			featureCounts[feature_index2,1:nrow(frequencies)] = t(frequencies)
-			parfor(i6 in 1:nrow(frequencies), check=0){
-				featureValues[feature_index2,i6] = i6 - featureCorrection
-			}
+			featureValues[feature_index2,1:nrow(frequencies)] = t(seq(1,nrow(frequencies)) - featureCorrection)
 			featureMeans[feature_index2,1:nrow(means)] = t(means)
 			featureSTDs[feature_index2,1:nrow(variances)] = t(sqrt(variances))
 		}

http://git-wip-us.apache.org/repos/asf/systemml/blob/c170374e/src/test_suites/java/org/apache/sysml/test/integration/functions/codegen/ZPackageSuite.java
----------------------------------------------------------------------
diff --git a/src/test_suites/java/org/apache/sysml/test/integration/functions/codegen/ZPackageSuite.java b/src/test_suites/java/org/apache/sysml/test/integration/functions/codegen/ZPackageSuite.java
index a9310b3..3b24fcc 100644
--- a/src/test_suites/java/org/apache/sysml/test/integration/functions/codegen/ZPackageSuite.java
+++ b/src/test_suites/java/org/apache/sysml/test/integration/functions/codegen/ZPackageSuite.java
@@ -26,10 +26,12 @@ import org.junit.runners.Suite;
  *  won't run two of them at once. */
 @RunWith(Suite.class)
 @Suite.SuiteClasses({
+	AlgorithmARIMA.class,
 	AlgorithmGLM.class,
 	AlgorithmKMeans.class,
 	AlgorithmL2SVM.class,
 	AlgorithmLinregCG.class,
+	AlgorithmMDABivar.class,
 	AlgorithmMLogreg.class,
 	AlgorithmMSVM.class,
 	AlgorithmPNMF.class,