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 2015/11/23 04:53:01 UTC

[6/8] incubator-systemml git commit: New wumm quaternary op (rewrite, cp/mr/sp compiler/runtime, tests, docs)

http://git-wip-us.apache.org/repos/asf/incubator-systemml/blob/d70c4524/src/test/java/com/ibm/bi/dml/test/integration/functions/quaternary/WeightedUnaryMatrixMultTest.java
----------------------------------------------------------------------
diff --git a/src/test/java/com/ibm/bi/dml/test/integration/functions/quaternary/WeightedUnaryMatrixMultTest.java b/src/test/java/com/ibm/bi/dml/test/integration/functions/quaternary/WeightedUnaryMatrixMultTest.java
new file mode 100644
index 0000000..078cbd6
--- /dev/null
+++ b/src/test/java/com/ibm/bi/dml/test/integration/functions/quaternary/WeightedUnaryMatrixMultTest.java
@@ -0,0 +1,284 @@
+/**
+ * (C) Copyright IBM Corp. 2010, 2015
+ *
+ * Licensed 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 com.ibm.bi.dml.test.integration.functions.quaternary;
+
+import java.util.HashMap;
+
+import org.junit.Assert;
+import org.junit.Test;
+
+import com.ibm.bi.dml.api.DMLScript;
+import com.ibm.bi.dml.api.DMLScript.RUNTIME_PLATFORM;
+import com.ibm.bi.dml.hops.OptimizerUtils;
+import com.ibm.bi.dml.hops.QuaternaryOp;
+import com.ibm.bi.dml.lops.LopProperties.ExecType;
+import com.ibm.bi.dml.lops.WeightedUnaryMM;
+import com.ibm.bi.dml.lops.WeightedUnaryMMR;
+import com.ibm.bi.dml.runtime.instructions.Instruction;
+import com.ibm.bi.dml.runtime.matrix.MatrixCharacteristics;
+import com.ibm.bi.dml.runtime.matrix.data.MatrixValue.CellIndex;
+import com.ibm.bi.dml.test.integration.AutomatedTestBase;
+import com.ibm.bi.dml.test.integration.TestConfiguration;
+import com.ibm.bi.dml.test.utils.TestUtils;
+import com.ibm.bi.dml.utils.Statistics;
+
+/**
+ * 
+ * 
+ */
+public class WeightedUnaryMatrixMultTest extends AutomatedTestBase 
+{
+	private final static String TEST_NAME1 = "WeightedUnaryMMExpMult";
+	private final static String TEST_NAME2 = "WeightedUnaryMMExpDiv";	
+	private final static String TEST_NAME3 = "WeightedUnaryMMPow2";
+	private final static String TEST_NAME4 = "WeightedUnaryMMMult2";
+	private final static String TEST_DIR = "functions/quaternary/";
+	private final static String TEST_CLASS_DIR = TEST_DIR + WeightedUnaryMatrixMultTest.class.getSimpleName() + "/";
+	
+	private final static double eps = 1e-6;
+	
+	private final static int rows = 1201;
+	private final static int cols = 1103;
+	private final static int rank = 10;
+	private final static double spSparse = 0.001;
+	private final static double spDense = 0.6;
+	
+	@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"}));
+		addTestConfiguration(TEST_NAME3,new TestConfiguration(TEST_CLASS_DIR, TEST_NAME3,new String[]{"R"}));
+		addTestConfiguration(TEST_NAME4,new TestConfiguration(TEST_CLASS_DIR, TEST_NAME4,new String[]{"R"}));
+	}
+
+	//cp testcases
+	
+	@Test
+	public void testWeightedUnaryMMExpMultDenseCP()  {
+		runWeightedUnaryMMTest(TEST_NAME1, false, true, false, ExecType.CP);
+	}
+	
+	@Test
+	public void testWeightedUnaryMMExpDivDenseCP()  {
+		runWeightedUnaryMMTest(TEST_NAME2, false, true, false, ExecType.CP);
+	}
+	
+	@Test
+	public void testWeightedUnaryMMPow2DenseCP()  {
+		runWeightedUnaryMMTest(TEST_NAME3, false, true, false, ExecType.CP);
+	}
+	
+	@Test
+	public void testWeightedUnaryMMMult2DenseCP()  {
+		runWeightedUnaryMMTest(TEST_NAME4, false, true, false, ExecType.CP);
+	}
+	
+	@Test
+	public void testWeightedUnaryMMExpMultSparseCP()  {
+		runWeightedUnaryMMTest(TEST_NAME1, true, true, false, ExecType.CP);
+	}
+	
+	@Test
+	public void testWeightedUnaryMMExpDivSparseCP()  {
+		runWeightedUnaryMMTest(TEST_NAME2, true, true, false, ExecType.CP);
+	}
+	
+	@Test
+	public void testWeightedUnaryMMPow2SparseCP()  {
+		runWeightedUnaryMMTest(TEST_NAME3, true, true, false, ExecType.CP);
+	}
+	
+	@Test
+	public void testWeightedUnaryMMMult2SparseCP()  {
+		runWeightedUnaryMMTest(TEST_NAME4, true, true, false, ExecType.CP);
+	}
+	
+	//sp testcases
+	
+	@Test
+	public void testWeightedUnaryMMExpMultDenseSP()  {
+		runWeightedUnaryMMTest(TEST_NAME1, false, true, false, ExecType.SPARK);
+	}
+	
+	@Test
+	public void testWeightedUnaryMMExpDivDenseSP()  {
+		runWeightedUnaryMMTest(TEST_NAME2, false, true, false, ExecType.SPARK);
+	}
+	
+	@Test
+	public void testWeightedUnaryMMPow2DenseSP()  {
+		runWeightedUnaryMMTest(TEST_NAME3, false, true, false, ExecType.SPARK);
+	}
+	
+	@Test
+	public void testWeightedUnaryMMMult2DenseSP()  {
+		runWeightedUnaryMMTest(TEST_NAME4, false, true, false, ExecType.SPARK);
+	}
+	
+	@Test
+	public void testWeightedUnaryMMExpMultSparseSP()  {
+		runWeightedUnaryMMTest(TEST_NAME1, true, true, false, ExecType.SPARK);
+	}
+	
+	@Test
+	public void testWeightedUnaryMMExpDivSparseSP()  {
+		runWeightedUnaryMMTest(TEST_NAME2, true, true, false, ExecType.SPARK);
+	}
+	
+	@Test
+	public void testWeightedUnaryMMPow2SparseSP()  {
+		runWeightedUnaryMMTest(TEST_NAME3, true, true, false, ExecType.SPARK);
+	}
+	
+	@Test
+	public void testWeightedUnaryMMMult2SparseSP()  {
+		runWeightedUnaryMMTest(TEST_NAME4, true, true, false, ExecType.SPARK);
+	}
+	
+	@Test
+	public void testWeightedUnaryMMExpMultDenseRepSP()  {
+		runWeightedUnaryMMTest(TEST_NAME1, false, true, true, ExecType.SPARK);
+	}
+
+	//mr testcases
+	
+	@Test
+	public void testWeightedUnaryMMExpMultDenseMR()  {
+		runWeightedUnaryMMTest(TEST_NAME1, false, true, false, ExecType.MR);
+	}
+	
+	@Test
+	public void testWeightedUnaryMMExpDivDenseMR()  {
+		runWeightedUnaryMMTest(TEST_NAME2, false, true, false, ExecType.MR);
+	}
+	
+	@Test
+	public void testWeightedUnaryMMPow2DenseMR()  {
+		runWeightedUnaryMMTest(TEST_NAME3, false, true, false, ExecType.MR);
+	}
+	
+	@Test
+	public void testWeightedUnaryMMMult2DenseMR()  {
+		runWeightedUnaryMMTest(TEST_NAME4, false, true, false, ExecType.MR);
+	}
+	
+	@Test
+	public void testWeightedUnaryMMExpMultSparseMR()  {
+		runWeightedUnaryMMTest(TEST_NAME1, true, true, false, ExecType.MR);
+	}
+	
+	@Test
+	public void testWeightedUnaryMMExpDivSparseMR()  {
+		runWeightedUnaryMMTest(TEST_NAME2, true, true, false, ExecType.MR);
+	}
+	
+	@Test
+	public void testWeightedUnaryMMPow2SparseMR()  {
+		runWeightedUnaryMMTest(TEST_NAME3, true, true, false, ExecType.MR);
+	}
+	
+	@Test
+	public void testWeightedUnaryMMMult2SparseMR()  {
+		runWeightedUnaryMMTest(TEST_NAME4, true, true, false, ExecType.MR);
+	}
+
+	@Test
+	public void testWeightedUnaryMMExpMultDenseRepMR()  {
+		runWeightedUnaryMMTest(TEST_NAME1, false, true, true, ExecType.MR);
+	}
+	
+	
+	/**
+	 * 
+	 * @param sparseM1
+	 * @param sparseM2
+	 * @param instType
+	 */
+	private void runWeightedUnaryMMTest( String testname, boolean sparse, boolean rewrites, boolean rep, ExecType instType)
+	{		
+		RUNTIME_PLATFORM platformOld = rtplatform;
+		switch( instType ){
+			case MR: rtplatform = RUNTIME_PLATFORM.HADOOP; break;
+			case SPARK: rtplatform = RUNTIME_PLATFORM.SPARK; break;
+			default: rtplatform = RUNTIME_PLATFORM.HYBRID; break;
+		}
+	
+		boolean sparkConfigOld = DMLScript.USE_LOCAL_SPARK_CONFIG;
+		if( rtplatform == RUNTIME_PLATFORM.SPARK )
+			DMLScript.USE_LOCAL_SPARK_CONFIG = true;
+
+		boolean rewritesOld = OptimizerUtils.ALLOW_ALGEBRAIC_SIMPLIFICATION;
+		boolean forceOld = QuaternaryOp.FORCE_REPLICATION;
+
+		OptimizerUtils.ALLOW_ALGEBRAIC_SIMPLIFICATION = rewrites;
+		QuaternaryOp.FORCE_REPLICATION = rep;
+	    
+		try
+		{
+			double sparsity = (sparse) ? spSparse : spDense;
+			String TEST_NAME = testname;
+			
+			TestConfiguration config = getTestConfiguration(TEST_NAME);
+			loadTestConfiguration(config);
+			
+			// This is for running the junit test the new way, i.e., construct the arguments directly
+			String HOME = SCRIPT_DIR + TEST_DIR;
+			fullDMLScriptName = HOME + TEST_NAME + ".dml";
+			programArgs = new String[]{"-stats", "-explain", "runtime", "-args",
+				input("W"), input("U"), input("V"), output("R") };
+			
+			fullRScriptName = HOME + TEST_NAME + ".R";
+			rCmd = "Rscript" + " " + fullRScriptName + " " + inputDir() + " " + expectedDir();
+	
+			//generate actual dataset 
+			double[][] W = getRandomMatrix(rows, cols, 0, 1, sparsity, 7); 
+			writeInputMatrixWithMTD("W", W, true);
+			double[][] U = getRandomMatrix(rows, rank, 0, 1, 1.0, 713); 
+			writeInputMatrixWithMTD("U", U, true);
+			double[][] V = getRandomMatrix(cols, rank, 0, 1, 1.0, 812); 
+			writeInputMatrixWithMTD("V", V, true);
+			
+			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");
+			checkDMLMetaDataFile("R", new MatrixCharacteristics(rows, cols, 1, 1));
+
+			//check statistics for right operator in cp and spark
+			if( instType == ExecType.CP && rewrites ) {
+				Assert.assertTrue("Missing opcode wumm", Statistics.getCPHeavyHitterOpCodes().contains(WeightedUnaryMM.OPCODE_CP));
+			}
+			else if( instType == ExecType.SPARK && rewrites ) {
+				String opcode = Instruction.SP_INST_PREFIX + ((rep)?WeightedUnaryMMR.OPCODE:WeightedUnaryMM.OPCODE);
+				Assert.assertTrue("Missing opcode sp_wumm", Statistics.getCPHeavyHitterOpCodes().contains(opcode) );
+			}
+		}
+		finally
+		{
+			rtplatform = platformOld;
+			DMLScript.USE_LOCAL_SPARK_CONFIG = sparkConfigOld;
+			OptimizerUtils.ALLOW_ALGEBRAIC_SIMPLIFICATION = rewritesOld;
+			QuaternaryOp.FORCE_REPLICATION = forceOld;
+		}
+	}	
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-systemml/blob/d70c4524/src/test/scripts/functions/quaternary/WeightedUnaryMMExpDiv.R
----------------------------------------------------------------------
diff --git a/src/test/scripts/functions/quaternary/WeightedUnaryMMExpDiv.R b/src/test/scripts/functions/quaternary/WeightedUnaryMMExpDiv.R
new file mode 100644
index 0000000..e0c1e7f
--- /dev/null
+++ b/src/test/scripts/functions/quaternary/WeightedUnaryMMExpDiv.R
@@ -0,0 +1,33 @@
+#-------------------------------------------------------------
+#
+# (C) Copyright IBM Corp. 2010, 2015
+#
+# Licensed 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")
+
+W = as.matrix(readMM(paste(args[1], "W.mtx", sep="")))
+U = as.matrix(readMM(paste(args[1], "U.mtx", sep="")))
+V = as.matrix(readMM(paste(args[1], "V.mtx", sep="")))
+
+R = W/exp(U%*%t(V));
+
+writeMM(as(R, "CsparseMatrix"), paste(args[2], "R", sep="")); 
+
+

http://git-wip-us.apache.org/repos/asf/incubator-systemml/blob/d70c4524/src/test/scripts/functions/quaternary/WeightedUnaryMMExpDiv.dml
----------------------------------------------------------------------
diff --git a/src/test/scripts/functions/quaternary/WeightedUnaryMMExpDiv.dml b/src/test/scripts/functions/quaternary/WeightedUnaryMMExpDiv.dml
new file mode 100644
index 0000000..8b9ac1b
--- /dev/null
+++ b/src/test/scripts/functions/quaternary/WeightedUnaryMMExpDiv.dml
@@ -0,0 +1,27 @@
+#-------------------------------------------------------------
+#
+# (C) Copyright IBM Corp. 2010, 2015
+#
+# Licensed 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.
+#
+#-------------------------------------------------------------
+
+
+
+W = read($1);
+U = read($2);
+V = read($3);
+
+R = W/exp(U%*%t(V));
+
+write(R, $4);

http://git-wip-us.apache.org/repos/asf/incubator-systemml/blob/d70c4524/src/test/scripts/functions/quaternary/WeightedUnaryMMExpMult.R
----------------------------------------------------------------------
diff --git a/src/test/scripts/functions/quaternary/WeightedUnaryMMExpMult.R b/src/test/scripts/functions/quaternary/WeightedUnaryMMExpMult.R
new file mode 100644
index 0000000..e3caa5f
--- /dev/null
+++ b/src/test/scripts/functions/quaternary/WeightedUnaryMMExpMult.R
@@ -0,0 +1,33 @@
+#-------------------------------------------------------------
+#
+# (C) Copyright IBM Corp. 2010, 2015
+#
+# Licensed 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")
+
+W = as.matrix(readMM(paste(args[1], "W.mtx", sep="")))
+U = as.matrix(readMM(paste(args[1], "U.mtx", sep="")))
+V = as.matrix(readMM(paste(args[1], "V.mtx", sep="")))
+
+R = W*exp(U%*%t(V));
+
+writeMM(as(R, "CsparseMatrix"), paste(args[2], "R", sep="")); 
+
+

http://git-wip-us.apache.org/repos/asf/incubator-systemml/blob/d70c4524/src/test/scripts/functions/quaternary/WeightedUnaryMMExpMult.dml
----------------------------------------------------------------------
diff --git a/src/test/scripts/functions/quaternary/WeightedUnaryMMExpMult.dml b/src/test/scripts/functions/quaternary/WeightedUnaryMMExpMult.dml
new file mode 100644
index 0000000..31a371b
--- /dev/null
+++ b/src/test/scripts/functions/quaternary/WeightedUnaryMMExpMult.dml
@@ -0,0 +1,27 @@
+#-------------------------------------------------------------
+#
+# (C) Copyright IBM Corp. 2010, 2015
+#
+# Licensed 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.
+#
+#-------------------------------------------------------------
+
+
+
+W = read($1);
+U = read($2);
+V = read($3);
+
+R = W*exp(U%*%t(V));
+
+write(R, $4);

http://git-wip-us.apache.org/repos/asf/incubator-systemml/blob/d70c4524/src/test/scripts/functions/quaternary/WeightedUnaryMMMult2.R
----------------------------------------------------------------------
diff --git a/src/test/scripts/functions/quaternary/WeightedUnaryMMMult2.R b/src/test/scripts/functions/quaternary/WeightedUnaryMMMult2.R
new file mode 100644
index 0000000..63b08a5
--- /dev/null
+++ b/src/test/scripts/functions/quaternary/WeightedUnaryMMMult2.R
@@ -0,0 +1,33 @@
+#-------------------------------------------------------------
+#
+# (C) Copyright IBM Corp. 2010, 2015
+#
+# Licensed 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")
+
+W = as.matrix(readMM(paste(args[1], "W.mtx", sep="")))
+U = as.matrix(readMM(paste(args[1], "U.mtx", sep="")))
+V = as.matrix(readMM(paste(args[1], "V.mtx", sep="")))
+
+R = W*(2*(U%*%t(V)));
+
+writeMM(as(R, "CsparseMatrix"), paste(args[2], "R", sep="")); 
+
+

http://git-wip-us.apache.org/repos/asf/incubator-systemml/blob/d70c4524/src/test/scripts/functions/quaternary/WeightedUnaryMMMult2.dml
----------------------------------------------------------------------
diff --git a/src/test/scripts/functions/quaternary/WeightedUnaryMMMult2.dml b/src/test/scripts/functions/quaternary/WeightedUnaryMMMult2.dml
new file mode 100644
index 0000000..3a00f59
--- /dev/null
+++ b/src/test/scripts/functions/quaternary/WeightedUnaryMMMult2.dml
@@ -0,0 +1,27 @@
+#-------------------------------------------------------------
+#
+# (C) Copyright IBM Corp. 2010, 2015
+#
+# Licensed 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.
+#
+#-------------------------------------------------------------
+
+
+
+W = read($1);
+U = read($2);
+V = read($3);
+
+R = W*(2*(U%*%t(V)));
+
+write(R, $4);

http://git-wip-us.apache.org/repos/asf/incubator-systemml/blob/d70c4524/src/test/scripts/functions/quaternary/WeightedUnaryMMPow2.R
----------------------------------------------------------------------
diff --git a/src/test/scripts/functions/quaternary/WeightedUnaryMMPow2.R b/src/test/scripts/functions/quaternary/WeightedUnaryMMPow2.R
new file mode 100644
index 0000000..84178df
--- /dev/null
+++ b/src/test/scripts/functions/quaternary/WeightedUnaryMMPow2.R
@@ -0,0 +1,33 @@
+#-------------------------------------------------------------
+#
+# (C) Copyright IBM Corp. 2010, 2015
+#
+# Licensed 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")
+
+W = as.matrix(readMM(paste(args[1], "W.mtx", sep="")))
+U = as.matrix(readMM(paste(args[1], "U.mtx", sep="")))
+V = as.matrix(readMM(paste(args[1], "V.mtx", sep="")))
+
+R = W/(U%*%t(V))^2;
+
+writeMM(as(R, "CsparseMatrix"), paste(args[2], "R", sep="")); 
+
+

http://git-wip-us.apache.org/repos/asf/incubator-systemml/blob/d70c4524/src/test/scripts/functions/quaternary/WeightedUnaryMMPow2.dml
----------------------------------------------------------------------
diff --git a/src/test/scripts/functions/quaternary/WeightedUnaryMMPow2.dml b/src/test/scripts/functions/quaternary/WeightedUnaryMMPow2.dml
new file mode 100644
index 0000000..4c50bec
--- /dev/null
+++ b/src/test/scripts/functions/quaternary/WeightedUnaryMMPow2.dml
@@ -0,0 +1,27 @@
+#-------------------------------------------------------------
+#
+# (C) Copyright IBM Corp. 2010, 2015
+#
+# Licensed 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.
+#
+#-------------------------------------------------------------
+
+
+
+W = read($1);
+U = read($2);
+V = read($3);
+
+R = W/(U%*%t(V))^2;
+
+write(R, $4);

http://git-wip-us.apache.org/repos/asf/incubator-systemml/blob/d70c4524/src/test_suites/java/com/ibm/bi/dml/test/integration/functions/quaternary/ZPackageSuite.java
----------------------------------------------------------------------
diff --git a/src/test_suites/java/com/ibm/bi/dml/test/integration/functions/quaternary/ZPackageSuite.java b/src/test_suites/java/com/ibm/bi/dml/test/integration/functions/quaternary/ZPackageSuite.java
index 5b7a32f..1d5782e 100644
--- a/src/test_suites/java/com/ibm/bi/dml/test/integration/functions/quaternary/ZPackageSuite.java
+++ b/src/test_suites/java/com/ibm/bi/dml/test/integration/functions/quaternary/ZPackageSuite.java
@@ -28,7 +28,8 @@ import org.junit.runners.Suite;
 	WeightedCrossEntropyTest.class,
 	WeightedDivMatrixMultTest.class,
 	WeightedSquaredLossTest.class,
-	WeightedSigmoidTest.class
+	WeightedSigmoidTest.class,
+	WeightedUnaryMatrixMultTest.class
 })