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
})