You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@systemds.apache.org by mb...@apache.org on 2024/07/27 16:33:33 UTC

(systemds) branch main updated: [SYSTEMDS-3704] Add new tests for operator scheduling implementations

This is an automated email from the ASF dual-hosted git repository.

mboehm7 pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/systemds.git


The following commit(s) were added to refs/heads/main by this push:
     new 9d24b94d24 [SYSTEMDS-3704] Add new tests for operator scheduling implementations
9d24b94d24 is described below

commit 9d24b94d2447ae2576867fd124e672836da4476c
Author: Anton Pötzsch <60...@users.noreply.github.com>
AuthorDate: Sat Jul 27 18:24:59 2024 +0200

    [SYSTEMDS-3704] Add new tests for operator scheduling implementations
    
    This commit adds new tests to ILinearizeTest. Each new test loads a
    config file with a different linearization order and checks that the
    order is set correctly and also that the results are correct.
    
    Closes #2048.
---
 .../functions/linearization/ILinearizeTest.java    | 148 ++++++++++++++++-----
 .../functions/linearization/LinearizationTest.R    |  36 +++++
 .../functions/linearization/LinearizationTest.dml  |  32 +++++
 3 files changed, 182 insertions(+), 34 deletions(-)

diff --git a/src/test/java/org/apache/sysds/test/functions/linearization/ILinearizeTest.java b/src/test/java/org/apache/sysds/test/functions/linearization/ILinearizeTest.java
index bf1fa0fcfe..2b2e179217 100644
--- a/src/test/java/org/apache/sysds/test/functions/linearization/ILinearizeTest.java
+++ b/src/test/java/org/apache/sysds/test/functions/linearization/ILinearizeTest.java
@@ -1,35 +1,39 @@
 /*
-* 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.
-*/
+ * 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.sysds.test.functions.linearization;
 
+import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.fail;
 
+import java.io.File;
 import java.util.ArrayList;
 import java.util.List;
 import java.util.HashMap;
 import java.util.Map;
 import java.util.Arrays;
 
+import org.apache.sysds.runtime.matrix.data.MatrixValue;
 import org.apache.sysds.test.AutomatedTestBase;
 import org.apache.sysds.test.TestConfiguration;
 import org.apache.sysds.test.TestUtils;
+import org.junit.Assert;
 import org.junit.Test;
 
 //additional imports
@@ -38,6 +42,7 @@ import org.apache.sysds.common.Types.OpOp2;
 import org.apache.sysds.common.Types.ValueType;
 import org.apache.sysds.lops.compile.linearization.IDagLinearizer;
 import org.apache.sysds.lops.compile.linearization.IDagLinearizerFactory;
+import org.apache.sysds.lops.compile.linearization.IDagLinearizerFactory.DagLinearizer;
 import org.apache.sysds.lops.Lop;
 import org.apache.sysds.conf.ConfigurationManager;
 import org.apache.sysds.conf.DMLConfig;
@@ -46,32 +51,48 @@ import org.apache.sysds.lops.Data;
 
 public class ILinearizeTest extends AutomatedTestBase {
 
-	private final String testDir = "functions/linearization/";
-	private final String configFile = "SystemDS-config-pipeline-depth-first.xml";
+	private final static String TEST_DIR = "functions/linearization/";
+	private final static String TEST_CLASS_DIR = TEST_DIR + ILinearizeTest.class.getSimpleName() + "/";
+	private final static String TEST_NAME = "LinearizationTest";
+	private static String CONF_FILE = "";
 
-	private String getConfPath() {
-		return SCRIPT_DIR + "/" + testDir + configFile;
+	enum Config {
+		BREADTH_FIRST("SystemDS-config-breadth-first.xml"),
+		DEPTH_FIRST("SystemDS-config-depth-first.xml"),
+		MIN_INTERMEDIATE("SystemDS-config-min-intermediate.xml"),
+		MAX_PARALLELIZE("SystemDS-config-max-parallelize.xml"),
+		PIPELINE_DEPTH_FIRST("SystemDS-config-pipeline-depth-first.xml");
+
+		public final String filePath;
+
+		Config(String filePath) {
+			this.filePath = filePath;
+		}
+	}
+
+	private String getConfPath(Config config) {
+		return SCRIPT_DIR + TEST_DIR + config.filePath;
 	}
 
 	@Override
 	public void setUp() {
 		setOutputBuffering(true);
-		disableConfigFile = true;
 		TestUtils.clearAssertionInformation();
-		addTestConfiguration("test", new TestConfiguration(testDir, "test"));
+		addTestConfiguration(TEST_NAME, new TestConfiguration(TEST_CLASS_DIR, TEST_NAME, new String[] {"R"}));
 	}
 
 	@Test
 	public void testLinearize_Pipeline() {
 
 		try {
-			DMLConfig dmlconf = DMLConfig.readConfigurationFile(getConfPath());
+			DMLConfig dmlconf = DMLConfig.readConfigurationFile(getConfPath(Config.PIPELINE_DEPTH_FIRST));
 			ConfigurationManager.setGlobalConfig(dmlconf);
-			System.out.print(ConfigurationManager.getLinearizationOrder());
-		} catch (Exception e) {
+			Assert.assertTrue(ConfigurationManager.getLinearizationOrder()==DagLinearizer.PIPELINE_DEPTH_FIRST);
+		}
+		catch(Exception e) {
 			e.printStackTrace();
 		}
-		
+
 		// Set up Test example
 		// For testing we don't build a runnable programm
 		// We only want to know, whether the assignement of pipeline ids work as intended
@@ -95,7 +116,7 @@ public class ILinearizeTest extends AutomatedTestBase {
 		//		y3  |
 		//		 \ /
 		//		 y6
-		
+
 		List<Lop> lops = new ArrayList<>();
 		// Dummy inputs for filling the inputs of the lops
 		// Needed for the constructors
@@ -114,7 +135,7 @@ public class ILinearizeTest extends AutomatedTestBase {
 		lops.add(n3);
 		lops.add(n4);
 		lops.add(n5);
-		
+
 		// First pipeline (after step 1)
 		Lop o1 = new BinaryScalar(d1, d2, OpOp2.PLUS, DataType.SCALAR, ValueType.INT32);
 		Lop o2 = new BinaryScalar(o1, d2, OpOp2.PLUS, DataType.SCALAR, ValueType.INT32);
@@ -146,12 +167,15 @@ public class ILinearizeTest extends AutomatedTestBase {
 		lops.add(y5);
 
 		// Remove dummy inputs
-		lops.forEach(l -> {l.getInputs().remove(d1); l.getInputs().remove(d2);});
+		lops.forEach(l -> {
+			l.getInputs().remove(d1);
+			l.getInputs().remove(d2);
+		});
 
 		// RUN LINEARIZATION
 		IDagLinearizer dl = IDagLinearizerFactory.createDagLinearizer();
 		dl.linearize(lops); //TODO results
-		
+
 		// Set up expected pipelines
 		Map<Integer, List<Lop>> pipelineMap = new HashMap<>();
 		pipelineMap.put(4, Arrays.asList(n1, n2, n3, n4, n5, o1, o2));
@@ -159,8 +183,64 @@ public class ILinearizeTest extends AutomatedTestBase {
 		pipelineMap.put(5, Arrays.asList(y1, y2, y3, y4, y5));
 
 		// Check if all lops are in the correct pipeline
-		pipelineMap.get(4).forEach(l -> {if (l.getPipelineID() != 4) fail("Pipeline ID not set correctly");});
-		pipelineMap.get(3).forEach(l -> {if (l.getPipelineID() != 3) fail("Pipeline ID not set correctly");});
-		pipelineMap.get(5).forEach(l -> {if (l.getPipelineID() != 5) fail("Pipeline ID not set correctly");});
+		pipelineMap.get(4).forEach(l -> {
+			if(l.getPipelineID() != 4)
+				fail("Pipeline ID not set correctly");
+		});
+		pipelineMap.get(3).forEach(l -> {
+			if(l.getPipelineID() != 3)
+				fail("Pipeline ID not set correctly");
+		});
+		pipelineMap.get(5).forEach(l -> {
+			if(l.getPipelineID() != 5)
+				fail("Pipeline ID not set correctly");
+		});
+	}
+
+	@Test
+	public void testBreadthFirstLinearization() {
+		runLinearizationTest(Config.BREADTH_FIRST);
+	}
+
+	@Test
+	public void testDepthFirstLinearization() {
+		runLinearizationTest(Config.DEPTH_FIRST);
+	}
+
+	@Test
+	public void testMinIntermediateLinearization() {
+		runLinearizationTest(Config.MIN_INTERMEDIATE);
+	}
+
+	private void runLinearizationTest(Config config) {
+		//load config
+		CONF_FILE = getConfPath(config);
+
+		TestConfiguration testConfiguration = getTestConfiguration(TEST_NAME);
+		loadTestConfiguration(testConfiguration);
+
+		//generate paths and commands
+		String HOME = SCRIPT_DIR + TEST_DIR;
+		fullDMLScriptName = HOME + TEST_NAME + ".dml";
+		programArgs = new String[] {"-args", output("R")};
+		fullRScriptName = HOME + TEST_NAME + ".R";
+		rCmd = "Rscript" + " " + fullRScriptName + " " + expectedDir();
+
+		//run test
+		runTest(true, false, null, -1);
+		runRScript(true);
+
+		//check that the correct linearization order is used
+		assertEquals(config.toString(), ConfigurationManager.getLinearizationOrder().toString());
+
+		//compare matrices
+		HashMap<MatrixValue.CellIndex, Double> dmlFile = readDMLMatrixFromOutputDir("R");
+		HashMap<MatrixValue.CellIndex, Double> rFile = readRMatrixFromExpectedDir("R");
+		TestUtils.compareMatrices(dmlFile, rFile, 0, "Stat-DML", "Stat-R");
+	}
+
+	@Override
+	protected File getConfigTemplateFile() {
+		return new File(CONF_FILE);
 	}
 }
diff --git a/src/test/scripts/functions/linearization/LinearizationTest.R b/src/test/scripts/functions/linearization/LinearizationTest.R
new file mode 100644
index 0000000000..944385b335
--- /dev/null
+++ b/src/test/scripts/functions/linearization/LinearizationTest.R
@@ -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.
+#
+#-------------------------------------------------------------
+
+
+args <- commandArgs(TRUE)
+options(digits=22)
+library("Matrix")
+
+A = matrix(1, nrow=10, ncol=2);
+B = matrix(2, nrow=2, ncol=1);
+C = matrix(3, nrow=10, ncol=10);
+D = matrix(4, nrow=10, ncol=10);
+E = matrix(5, nrow=10, ncol=20);
+F = matrix(6, nrow=20, ncol=1);
+
+RESULT = t(A %*% B) %*% C %*% D %*% (E %*% F);
+
+writeMM(as(RESULT, "CsparseMatrix"), paste(args[1], "R", sep=""));
diff --git a/src/test/scripts/functions/linearization/LinearizationTest.dml b/src/test/scripts/functions/linearization/LinearizationTest.dml
new file mode 100644
index 0000000000..655e60cf2d
--- /dev/null
+++ b/src/test/scripts/functions/linearization/LinearizationTest.dml
@@ -0,0 +1,32 @@
+#-------------------------------------------------------------
+#
+# 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 = matrix(1, rows=10, cols=2);
+B = matrix(2, rows=2, cols=1);
+C = matrix(3, rows=10, cols=10);
+D = matrix(4, rows=10, cols=10);
+E = matrix(5, rows=10, cols=20);
+F = matrix(6, rows=20, cols=1);
+
+RESULT = t(A %*% B) %*% C %*% D %*% (E %*% F);
+
+write(RESULT, $1);