blob: b1d184c4267422092cf08f2c6e5ed3cb0c386678 [file] [log] [blame]
/*
* 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.codegen;
import java.io.File;
import java.util.HashMap;
import org.junit.Assert;
import org.junit.Test;
import org.apache.sysds.common.Types.ExecMode;
import org.apache.sysds.hops.OptimizerUtils;
import org.apache.sysds.lops.LopProperties.ExecType;
import org.apache.sysds.runtime.matrix.data.MatrixValue.CellIndex;
import org.apache.sysds.test.AutomatedTestBase;
import org.apache.sysds.test.TestConfiguration;
import org.apache.sysds.test.TestUtils;
public class CellwiseTmplTest extends AutomatedTestBase
{
private static final String TEST_NAME = "cellwisetmpl";
private static final String TEST_NAME1 = TEST_NAME+1;
private static final String TEST_NAME2 = TEST_NAME+2;
private static final String TEST_NAME3 = TEST_NAME+3;
private static final String TEST_NAME4 = TEST_NAME+4;
private static final String TEST_NAME5 = TEST_NAME+5;
private static final String TEST_NAME6 = TEST_NAME+6;
private static final String TEST_NAME7 = TEST_NAME+7;
private static final String TEST_NAME8 = TEST_NAME+8;
private static final String TEST_NAME9 = TEST_NAME+9; //sum((X + 7 * Y)^2)
private static final String TEST_NAME10 = TEST_NAME+10; //min/max(X + 7 * Y)
private static final String TEST_NAME11 = TEST_NAME+11; //replace((0 / (X - 500))+1, 0/0, 7)
private static final String TEST_NAME12 = TEST_NAME+12; //((X/3) %% 0.6) + ((X/3) %/% 0.6)
private static final String TEST_NAME13 = TEST_NAME+13; //min(X + 7 * Y) large
private static final String TEST_NAME14 = TEST_NAME+14; //-2 * X + t(Y); t(Y) is rowvector
private static final String TEST_NAME15 = TEST_NAME+15; //colMins(2*log(X))
private static final String TEST_NAME16 = TEST_NAME+16; //colSums(2*log(X));
private static final String TEST_NAME17 = TEST_NAME+17; //xor operation
private static final String TEST_NAME18 = TEST_NAME+18; //sum(ifelse(X,Y,Z))
private static final String TEST_NAME19 = TEST_NAME+19; //sum(ifelse(true,Y,Z))+sum(ifelse(false,Y,Z))
private static final String TEST_NAME20 = TEST_NAME+20; //bitwAnd() operation
private static final String TEST_NAME21 = TEST_NAME+21; //relu operation, (X>0)*dout
private static final String TEST_NAME22 = TEST_NAME+22; //sum(X * seq(1,N) + t(seq(M,1)))
private static final String TEST_NAME23 = TEST_NAME+23; //sum(min(X,Y,Z))
private static final String TEST_NAME24 = TEST_NAME+24; //min(X, Y, Z, 3, 7)
private static final String TEST_NAME25 = TEST_NAME+25; //bias_add
private static final String TEST_NAME26 = TEST_NAME+26; //bias_mult
private static final String TEST_NAME27 = TEST_NAME+27; //outer < +7 negative
private static final String TEST_DIR = "functions/codegen/";
private static final String TEST_CLASS_DIR = TEST_DIR + CellwiseTmplTest.class.getSimpleName() + "/";
private final static String TEST_CONF6 = "SystemDS-config-codegen6.xml";
private final static String TEST_CONF7 = "SystemDS-config-codegen.xml";
private static String TEST_CONF = TEST_CONF7;
private static final double eps = Math.pow(10, -10);
@Override
public void setUp() {
TestUtils.clearAssertionInformation();
for( int i=1; i<=27; i++ ) {
addTestConfiguration( TEST_NAME+i, new TestConfiguration(
TEST_CLASS_DIR, TEST_NAME+i, new String[] {String.valueOf(i)}) );
}
}
@Test
public void testCodegenCellwiseRewrite1() {
testCodegenIntegration( TEST_NAME1, true, ExecType.CP );
}
@Test
public void testCodegenCellwiseRewrite2() {
testCodegenIntegration( TEST_NAME2, true, ExecType.CP );
}
@Test
public void testCodegenCellwiseRewrite3() {
testCodegenIntegration( TEST_NAME3, true, ExecType.CP );
}
@Test
public void testCodegenCellwiseRewrite4()
{
testCodegenIntegration( TEST_NAME4, true, ExecType.CP );
}
@Test
public void testCodegenCellwiseRewrite5() {
testCodegenIntegration( TEST_NAME5, true, ExecType.CP );
}
@Test
public void testCodegenCellwiseRewrite6() {
testCodegenIntegration( TEST_NAME6, true, ExecType.CP );
}
@Test
public void testCodegenCellwiseRewrite7() {
testCodegenIntegration( TEST_NAME7, true, ExecType.CP );
}
@Test
public void testCodegenCellwiseRewrite8() {
testCodegenIntegration( TEST_NAME8, true, ExecType.CP );
}
@Test
public void testCodegenCellwiseRewrite9() {
testCodegenIntegration( TEST_NAME9, true, ExecType.CP );
}
@Test
public void testCodegenCellwiseRewrite10() {
testCodegenIntegration( TEST_NAME10, true, ExecType.CP );
}
@Test
public void testCodegenCellwiseRewrite11() {
testCodegenIntegration( TEST_NAME11, true, ExecType.CP );
}
@Test
public void testCodegenCellwiseRewrite12() {
testCodegenIntegration( TEST_NAME12, true, ExecType.CP );
}
@Test
public void testCodegenCellwiseRewrite13() {
testCodegenIntegration( TEST_NAME13, true, ExecType.CP );
}
@Test
public void testCodegenCellwiseRewrite14() {
testCodegenIntegration( TEST_NAME14, true, ExecType.CP );
}
@Test
public void testCodegenCellwise1() {
testCodegenIntegration( TEST_NAME1, false, ExecType.CP );
}
@Test
public void testCodegenCellwise2() {
testCodegenIntegration( TEST_NAME2, false, ExecType.CP );
}
@Test
public void testCodegenCellwise3() {
testCodegenIntegration( TEST_NAME3, false, ExecType.CP );
}
@Test
public void testCodegenCellwise4()
{
testCodegenIntegration( TEST_NAME4, false, ExecType.CP );
}
@Test
public void testCodegenCellwise5() {
testCodegenIntegration( TEST_NAME5, false, ExecType.CP );
}
@Test
public void testCodegenCellwise6() {
testCodegenIntegration( TEST_NAME6, false, ExecType.CP );
}
@Test
public void testCodegenCellwise7() {
testCodegenIntegration( TEST_NAME7, false, ExecType.CP );
}
@Test
public void testCodegenCellwise8() {
testCodegenIntegration( TEST_NAME8, false, ExecType.CP );
}
@Test
public void testCodegenCellwise9() {
testCodegenIntegration( TEST_NAME9, false, ExecType.CP );
}
@Test
public void testCodegenCellwise10() {
testCodegenIntegration( TEST_NAME10, false, ExecType.CP );
}
@Test
public void testCodegenCellwise11() {
testCodegenIntegration( TEST_NAME11, false, ExecType.CP );
}
@Test
public void testCodegenCellwise12() {
testCodegenIntegration( TEST_NAME12, false, ExecType.CP );
}
@Test
public void testCodegenCellwise13() {
testCodegenIntegration( TEST_NAME13, false, ExecType.CP );
}
@Test
public void testCodegenCellwise14() {
testCodegenIntegration( TEST_NAME14, false, ExecType.CP );
}
@Test
public void testCodegenCellwiseRewrite1_sp() {
testCodegenIntegration( TEST_NAME1, true, ExecType.SPARK );
}
@Test
public void testCodegenCellwiseRewrite7_sp() {
testCodegenIntegration( TEST_NAME7, true, ExecType.SPARK );
}
@Test
public void testCodegenCellwiseRewrite8_sp() {
testCodegenIntegration( TEST_NAME8, true, ExecType.SPARK );
}
@Test
public void testCodegenCellwiseRewrite9_sp() {
testCodegenIntegration( TEST_NAME9, true, ExecType.SPARK );
}
@Test
public void testCodegenCellwiseRewrite10_sp() {
testCodegenIntegration( TEST_NAME10, true, ExecType.SPARK );
}
@Test
public void testCodegenCellwiseRewrite11_sp() {
testCodegenIntegration( TEST_NAME11, true, ExecType.SPARK );
}
@Test
public void testCodegenCellwiseRewrite12_sp() {
testCodegenIntegration( TEST_NAME12, true, ExecType.SPARK );
}
@Test
public void testCodegenCellwiseRewrite13_sp() {
testCodegenIntegration( TEST_NAME13, true, ExecType.SPARK );
}
@Test
public void testCodegenCellwiseRewrite14_sp() {
testCodegenIntegration( TEST_NAME14, true, ExecType.SPARK );
}
@Test
public void testCodegenCellwiseRewrite15() {
testCodegenIntegration( TEST_NAME15, true, ExecType.CP );
}
@Test
public void testCodegenCellwise15() {
testCodegenIntegration( TEST_NAME15, false, ExecType.CP );
}
@Test
public void testCodegenCellwiseRewrite15_sp() {
testCodegenIntegration( TEST_NAME15, true, ExecType.SPARK );
}
@Test
public void testCodegenCellwiseRewrite16() {
testCodegenIntegration( TEST_NAME16, true, ExecType.CP );
}
@Test
public void testCodegenCellwise16() {
testCodegenIntegration( TEST_NAME16, false, ExecType.CP );
}
@Test
public void testCodegenCellwiseRewrite16_sp() {
testCodegenIntegration( TEST_NAME16, true, ExecType.SPARK );
}
@Test
public void testCodegenCellwiseRewrite17() {
testCodegenIntegration( TEST_NAME17, true, ExecType.CP );
}
@Test
public void testCodegenCellwise17() {
testCodegenIntegration( TEST_NAME17, false, ExecType.CP );
}
@Test
public void testCodegenCellwiseRewrite17_sp() {
testCodegenIntegration( TEST_NAME17, true, ExecType.SPARK );
}
@Test
public void testCodegenCellwiseRewrite18() {
testCodegenIntegration( TEST_NAME18, true, ExecType.CP );
}
@Test
public void testCodegenCellwise18() {
testCodegenIntegration( TEST_NAME18, false, ExecType.CP );
}
@Test
public void testCodegenCellwiseRewrite18_sp() {
testCodegenIntegration( TEST_NAME18, true, ExecType.SPARK );
}
@Test
public void testCodegenCellwiseRewrite19() {
testCodegenIntegration( TEST_NAME19, true, ExecType.CP );
}
@Test
public void testCodegenCellwise19() {
testCodegenIntegration( TEST_NAME19, false, ExecType.CP );
}
@Test
public void testCodegenCellwiseRewrite19_sp() {
testCodegenIntegration( TEST_NAME19, true, ExecType.SPARK );
}
@Test
public void testCodegenCellwiseRewrite20() {
testCodegenIntegration( TEST_NAME20, true, ExecType.CP );
}
@Test
public void testCodegenCellwise20() {
testCodegenIntegration( TEST_NAME20, false, ExecType.CP );
}
@Test
public void testCodegenCellwiseRewrite20_sp() {
testCodegenIntegration( TEST_NAME20, true, ExecType.SPARK );
}
@Test
public void testCodegenCellwiseRewrite21() {
testCodegenIntegration( TEST_NAME21, true, ExecType.CP );
}
@Test
public void testCodegenCellwise21() {
testCodegenIntegration( TEST_NAME21, false, ExecType.CP );
}
@Test
public void testCodegenCellwiseRewrite21_sp() {
testCodegenIntegration( TEST_NAME21, true, ExecType.SPARK );
}
@Test
public void testCodegenCellwiseRewrite22() {
testCodegenIntegration( TEST_NAME22, true, ExecType.CP );
}
@Test
public void testCodegenCellwise22() {
testCodegenIntegration( TEST_NAME22, false, ExecType.CP );
}
@Test
public void testCodegenCellwiseRewrite22_sp() {
testCodegenIntegration( TEST_NAME22, true, ExecType.SPARK );
}
@Test
public void testCodegenCellwiseRewrite23() {
testCodegenIntegration( TEST_NAME23, true, ExecType.CP );
}
@Test
public void testCodegenCellwise23() {
testCodegenIntegration( TEST_NAME23, false, ExecType.CP );
}
@Test
public void testCodegenCellwiseRewrite23_sp() {
testCodegenIntegration( TEST_NAME23, true, ExecType.SPARK );
}
@Test
public void testCodegenCellwiseRewrite24() {
testCodegenIntegration( TEST_NAME24, true, ExecType.CP );
}
@Test
public void testCodegenCellwise24() {
testCodegenIntegration( TEST_NAME24, false, ExecType.CP );
}
@Test
public void testCodegenCellwiseRewrite24_sp() {
testCodegenIntegration( TEST_NAME24, true, ExecType.SPARK );
}
@Test
public void testCodegenCellwiseRewrite25() {
testCodegenIntegration( TEST_NAME25, true, ExecType.CP );
}
@Test
public void testCodegenCellwise25() {
testCodegenIntegration( TEST_NAME25, false, ExecType.CP );
}
@Test //TODO handling of global col index
public void testCodegenCellwiseRewrite25_sp() {
testCodegenIntegration( TEST_NAME25, true, ExecType.SPARK );
}
@Test
public void testCodegenCellwiseRewrite26() {
testCodegenIntegration( TEST_NAME26, true, ExecType.CP );
}
@Test
public void testCodegenCellwise26() {
testCodegenIntegration( TEST_NAME26, false, ExecType.CP );
}
@Test //TODO handling of global col index
public void testCodegenCellwiseRewrite26_sp() {
testCodegenIntegration( TEST_NAME26, true, ExecType.SPARK );
}
@Test
public void testCodegenCellwiseRewrite27() {
testCodegenIntegration( TEST_NAME27, true, ExecType.CP );
}
@Test
public void testCodegenCellwise27() {
testCodegenIntegration( TEST_NAME27, false, ExecType.CP );
}
public void testCodegenCellwiseRewrite27_sp() {
testCodegenIntegration( TEST_NAME27, true, ExecType.SPARK );
}
private void testCodegenIntegration( String testname, boolean rewrites, ExecType instType )
{
boolean oldRewrites = OptimizerUtils.ALLOW_ALGEBRAIC_SIMPLIFICATION;
String oldTestConf = TEST_CONF;
ExecMode platformOld = setExecMode(instType);
if( testname.equals(TEST_NAME9) )
TEST_CONF = TEST_CONF6;
try
{
TestConfiguration config = getTestConfiguration(testname);
loadTestConfiguration(config);
String HOME = SCRIPT_DIR + TEST_DIR;
fullDMLScriptName = HOME + testname + ".dml";
programArgs = new String[]{"-stats", "-args", output("S") };
fullRScriptName = HOME + testname + ".R";
rCmd = getRCmd(inputDir(), expectedDir());
OptimizerUtils.ALLOW_ALGEBRAIC_SIMPLIFICATION = rewrites;
runTest(true, false, null, -1);
runRScript(true);
if(testname.equals(TEST_NAME6) || testname.equals(TEST_NAME7)
|| testname.equals(TEST_NAME9) || testname.equals(TEST_NAME10)) {
//compare scalars
HashMap<CellIndex, Double> dmlfile = readDMLScalarFromHDFS("S");
HashMap<CellIndex, Double> rfile = readRScalarFromFS("S");
TestUtils.compareScalars((Double) dmlfile.values().toArray()[0], (Double) rfile.values().toArray()[0],0);
}
else {
//compare matrices
HashMap<CellIndex, Double> dmlfile = readDMLMatrixFromHDFS("S");
HashMap<CellIndex, Double> rfile = readRMatrixFromFS("S");
TestUtils.compareMatrices(dmlfile, rfile, eps, "Stat-DML", "Stat-R");
}
if( !(rewrites && (testname.equals(TEST_NAME2)
|| testname.equals(TEST_NAME19))) && !testname.equals(TEST_NAME27) )
Assert.assertTrue(heavyHittersContainsSubString(
"spoofCell", "sp_spoofCell", "spoofMA", "sp_spoofMA"));
if( testname.equals(TEST_NAME7) ) //ensure matrix mult is fused
Assert.assertTrue(!heavyHittersContainsSubString("tsmm"));
else if( testname.equals(TEST_NAME10) ) //ensure min/max is fused
Assert.assertTrue(!heavyHittersContainsSubString("uamin","uamax"));
else if( testname.equals(TEST_NAME11) ) //ensure replace is fused
Assert.assertTrue(!heavyHittersContainsSubString("replace"));
else if( testname.equals(TEST_NAME15) )
Assert.assertTrue(!heavyHittersContainsSubString("uacmin"));
else if( testname.equals(TEST_NAME16) )
Assert.assertTrue(!heavyHittersContainsSubString("uack+"));
else if( testname.equals(TEST_NAME17) )
Assert.assertTrue(!heavyHittersContainsSubString("xor"));
else if( testname.equals(TEST_NAME22) )
Assert.assertTrue(!heavyHittersContainsSubString("seq"));
else if( testname.equals(TEST_NAME23) || testname.equals(TEST_NAME24) )
Assert.assertTrue(!heavyHittersContainsSubString("min","nmin"));
}
finally {
resetExecMode(platformOld);
OptimizerUtils.ALLOW_ALGEBRAIC_SIMPLIFICATION = oldRewrites;
OptimizerUtils.ALLOW_AUTO_VECTORIZATION = true;
OptimizerUtils.ALLOW_OPERATOR_FUSION = true;
TEST_CONF = oldTestConf;
}
}
/**
* Override default configuration with custom test configuration to ensure
* scratch space and local temporary directory locations are also updated.
*/
@Override
protected File getConfigTemplateFile() {
// Instrumentation in this test's output log to show custom configuration file used for template.
File TEST_CONF_FILE = new File(SCRIPT_DIR + TEST_DIR, TEST_CONF);
System.out.println("This test case overrides default configuration with " + TEST_CONF_FILE.getPath());
return TEST_CONF_FILE;
}
}