blob: 4e153f8ba2c099f1bcd5d3115c04f4da29e6b98e [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.component.codegen;
import java.lang.reflect.Method;
import org.junit.Test;
import org.apache.sysds.common.Types.OpOp2;
import org.apache.sysds.hops.codegen.cplan.CNodeBinary.BinType;
import org.apache.sysds.hops.codegen.cplan.CNodeUnary.UnaryType;
import org.apache.sysds.runtime.codegen.LibSpoofPrimitives;
import org.apache.sysds.runtime.functionobjects.Builtin;
import org.apache.sysds.runtime.instructions.InstructionUtils;
import org.apache.sysds.runtime.matrix.data.MatrixBlock;
import org.apache.sysds.runtime.matrix.operators.BinaryOperator;
import org.apache.sysds.runtime.matrix.operators.ScalarOperator;
import org.apache.sysds.runtime.matrix.operators.UnaryOperator;
import org.apache.sysds.runtime.util.DataConverter;
import org.apache.sysds.test.AutomatedTestBase;
import org.apache.sysds.test.TestUtils;
import org.apache.hadoop.util.StringUtils;
public class CPlanVectorPrimitivesTest extends AutomatedTestBase
{
private static final int m = 3;
private static final int n = 1191;
private static final double sparsity1 = 0.9;
private static final double sparsity2 = 0.09;
private static final double eps = Math.pow(10, -10);
private enum InputType {
SCALAR,
VECTOR_DENSE,
VECTOR_SPARSE,
}
@Override
public void setUp() {
TestUtils.clearAssertionInformation();
}
//support aggregate vector primitives
@Test
public void testVectorSumDense() {
testVectorAggPrimitive(UnaryType.ROW_SUMS, InputType.VECTOR_DENSE);
}
@Test
public void testVectorSumSparse() {
testVectorAggPrimitive(UnaryType.ROW_SUMS, InputType.VECTOR_SPARSE);
}
@Test
public void testVectorMinDense() {
testVectorAggPrimitive(UnaryType.ROW_MINS, InputType.VECTOR_DENSE);
}
@Test
public void testVectorMinSparse() {
testVectorAggPrimitive(UnaryType.ROW_MINS, InputType.VECTOR_SPARSE);
}
@Test
public void testVectorMaxDense() {
testVectorAggPrimitive(UnaryType.ROW_MAXS, InputType.VECTOR_DENSE);
}
@Test
public void testVectorMaxSparse() {
testVectorAggPrimitive(UnaryType.ROW_MAXS, InputType.VECTOR_SPARSE);
}
@Test
public void testVectorMeansDense() {
testVectorAggPrimitive(UnaryType.ROW_MEANS, InputType.VECTOR_DENSE);
}
@Test
public void testVectorMeansSparse() {
testVectorAggPrimitive(UnaryType.ROW_MEANS, InputType.VECTOR_SPARSE);
}
//support unary vector primitives (pow2/mult2 current excluded because not unary)
@Test
public void testVectorExpDense() {
testVectorUnaryPrimitive(UnaryType.VECT_EXP, InputType.VECTOR_DENSE);
}
@Test
public void testVectorExpSparse() {
testVectorUnaryPrimitive(UnaryType.VECT_EXP, InputType.VECTOR_SPARSE);
}
@Test
public void testVectorSqrtDense() {
testVectorUnaryPrimitive(UnaryType.VECT_SQRT, InputType.VECTOR_DENSE);
}
@Test
public void testVectorSqrtSparse() {
testVectorUnaryPrimitive(UnaryType.VECT_SQRT, InputType.VECTOR_SPARSE);
}
@Test
public void testVectorLogDense() {
testVectorUnaryPrimitive(UnaryType.VECT_LOG, InputType.VECTOR_DENSE);
}
@Test
public void testVectorLogSparse() {
testVectorUnaryPrimitive(UnaryType.VECT_LOG, InputType.VECTOR_SPARSE);
}
@Test
public void testVectorAbsDense() {
testVectorUnaryPrimitive(UnaryType.VECT_ABS, InputType.VECTOR_DENSE);
}
@Test
public void testVectorAbsSparse() {
testVectorUnaryPrimitive(UnaryType.VECT_ABS, InputType.VECTOR_SPARSE);
}
@Test
public void testVectorRoundDense() {
testVectorUnaryPrimitive(UnaryType.VECT_ROUND, InputType.VECTOR_DENSE);
}
@Test
public void testVectorRoundSparse() {
testVectorUnaryPrimitive(UnaryType.VECT_ROUND, InputType.VECTOR_SPARSE);
}
@Test
public void testVectorCeilDense() {
testVectorUnaryPrimitive(UnaryType.VECT_CEIL, InputType.VECTOR_DENSE);
}
@Test
public void testVectorCeilSparse() {
testVectorUnaryPrimitive(UnaryType.VECT_CEIL, InputType.VECTOR_SPARSE);
}
@Test
public void testVectorFloorDense() {
testVectorUnaryPrimitive(UnaryType.VECT_FLOOR, InputType.VECTOR_DENSE);
}
@Test
public void testVectorFloorSparse() {
testVectorUnaryPrimitive(UnaryType.VECT_FLOOR, InputType.VECTOR_SPARSE);
}
@Test
public void testVectorSinDense() {
testVectorUnaryPrimitive(UnaryType.VECT_SIN, InputType.VECTOR_DENSE);
}
@Test
public void testVectorSinSparse() {
testVectorUnaryPrimitive(UnaryType.VECT_SIN, InputType.VECTOR_SPARSE);
}
@Test
public void testVectorCosDense() {
testVectorUnaryPrimitive(UnaryType.VECT_COS, InputType.VECTOR_DENSE);
}
@Test
public void testVectorCosSparse() {
testVectorUnaryPrimitive(UnaryType.VECT_COS, InputType.VECTOR_SPARSE);
}
@Test
public void testVectorTanDense() {
testVectorUnaryPrimitive(UnaryType.VECT_TAN, InputType.VECTOR_DENSE);
}
@Test
public void testVectorTanSparse() {
testVectorUnaryPrimitive(UnaryType.VECT_TAN, InputType.VECTOR_SPARSE);
}
@Test
public void testVectorASinDense() {
testVectorUnaryPrimitive(UnaryType.VECT_ASIN, InputType.VECTOR_DENSE);
}
@Test
public void testVectorASinSparse() {
testVectorUnaryPrimitive(UnaryType.VECT_ASIN, InputType.VECTOR_SPARSE);
}
@Test
public void testVectorACosDense() {
testVectorUnaryPrimitive(UnaryType.VECT_ACOS, InputType.VECTOR_DENSE);
}
@Test
public void testVectorACosSparse() {
testVectorUnaryPrimitive(UnaryType.VECT_ACOS, InputType.VECTOR_SPARSE);
}
@Test
public void testVectorATanDense() {
testVectorUnaryPrimitive(UnaryType.VECT_ATAN, InputType.VECTOR_DENSE);
}
@Test
public void testVectorATanSparse() {
testVectorUnaryPrimitive(UnaryType.VECT_ATAN, InputType.VECTOR_SPARSE);
}
@Test
public void testVectorSinHDense() {
testVectorUnaryPrimitive(UnaryType.VECT_SINH, InputType.VECTOR_DENSE);
}
@Test
public void testVectorSinHSparse() {
testVectorUnaryPrimitive(UnaryType.VECT_SINH, InputType.VECTOR_SPARSE);
}
@Test
public void testVectorCosHDense() {
testVectorUnaryPrimitive(UnaryType.VECT_COSH, InputType.VECTOR_DENSE);
}
@Test
public void testVectorCosHSparse() {
testVectorUnaryPrimitive(UnaryType.VECT_COSH, InputType.VECTOR_SPARSE);
}
@Test
public void testVectorTanHDense() {
testVectorUnaryPrimitive(UnaryType.VECT_TANH, InputType.VECTOR_DENSE);
}
@Test
public void testVectorTanHSparse() {
testVectorUnaryPrimitive(UnaryType.VECT_TANH, InputType.VECTOR_SPARSE);
}
@Test
public void testVectorSignDense() {
testVectorUnaryPrimitive(UnaryType.VECT_SIGN, InputType.VECTOR_DENSE);
}
@Test
public void testVectorSignSparse() {
testVectorUnaryPrimitive(UnaryType.VECT_SIGN, InputType.VECTOR_SPARSE);
}
//support unary vector primitives (pow currently only on vector-scalars)
@Test
public void testVectorScalarMultDense() {
testVectorBinaryPrimitive(BinType.VECT_MULT_SCALAR, InputType.VECTOR_DENSE, InputType.SCALAR);
}
@Test
public void testVectorScalarMultSparse() {
testVectorBinaryPrimitive(BinType.VECT_MULT_SCALAR, InputType.VECTOR_SPARSE, InputType.SCALAR);
}
@Test
public void testScalarVectorMultDense() {
testVectorBinaryPrimitive(BinType.VECT_MULT_SCALAR, InputType.SCALAR, InputType.VECTOR_DENSE);
}
@Test
public void testScalarVectorMultSparse() {
testVectorBinaryPrimitive(BinType.VECT_MULT_SCALAR, InputType.SCALAR, InputType.VECTOR_SPARSE);
}
@Test
public void testVectorVectorMultDenseDense() {
testVectorBinaryPrimitive(BinType.VECT_MULT, InputType.VECTOR_DENSE, InputType.VECTOR_DENSE);
}
@Test
public void testVectorVectorMultSparseDense() {
testVectorBinaryPrimitive(BinType.VECT_MULT, InputType.VECTOR_SPARSE, InputType.VECTOR_DENSE);
}
@Test
public void testVectorScalarDivDense() {
testVectorBinaryPrimitive(BinType.VECT_DIV_SCALAR, InputType.VECTOR_DENSE, InputType.SCALAR);
}
@Test
public void testVectorScalarDivSparse() {
testVectorBinaryPrimitive(BinType.VECT_DIV_SCALAR, InputType.VECTOR_SPARSE, InputType.SCALAR);
}
@Test
public void testScalarVectorDivDense() {
testVectorBinaryPrimitive(BinType.VECT_DIV_SCALAR, InputType.SCALAR, InputType.VECTOR_DENSE);
}
@Test
public void testScalarVectorDivSparse() {
testVectorBinaryPrimitive(BinType.VECT_DIV_SCALAR, InputType.SCALAR, InputType.VECTOR_SPARSE);
}
@Test
public void testVectorVectorDivDenseDense() {
testVectorBinaryPrimitive(BinType.VECT_DIV, InputType.VECTOR_DENSE, InputType.VECTOR_DENSE);
}
@Test
public void testVectorVectorDivSparseDense() {
testVectorBinaryPrimitive(BinType.VECT_DIV, InputType.VECTOR_SPARSE, InputType.VECTOR_DENSE);
}
@Test
public void testVectorScalarPlusDense() {
testVectorBinaryPrimitive(BinType.VECT_PLUS_SCALAR, InputType.VECTOR_DENSE, InputType.SCALAR);
}
@Test
public void testVectorScalarPlusSparse() {
testVectorBinaryPrimitive(BinType.VECT_PLUS_SCALAR, InputType.VECTOR_SPARSE, InputType.SCALAR);
}
@Test
public void testScalarVectorPlusDense() {
testVectorBinaryPrimitive(BinType.VECT_PLUS_SCALAR, InputType.SCALAR, InputType.VECTOR_DENSE);
}
@Test
public void testScalarVectorPlusSparse() {
testVectorBinaryPrimitive(BinType.VECT_PLUS_SCALAR, InputType.SCALAR, InputType.VECTOR_SPARSE);
}
@Test
public void testVectorVectorPlusDenseDense() {
testVectorBinaryPrimitive(BinType.VECT_PLUS, InputType.VECTOR_DENSE, InputType.VECTOR_DENSE);
}
@Test
public void testVectorVectorPlusSparseDense() {
testVectorBinaryPrimitive(BinType.VECT_PLUS, InputType.VECTOR_SPARSE, InputType.VECTOR_DENSE);
}
@Test
public void testVectorScalarMinusDense() {
testVectorBinaryPrimitive(BinType.VECT_MINUS_SCALAR, InputType.VECTOR_DENSE, InputType.SCALAR);
}
@Test
public void testVectorScalarMinusSparse() {
testVectorBinaryPrimitive(BinType.VECT_MINUS_SCALAR, InputType.VECTOR_SPARSE, InputType.SCALAR);
}
@Test
public void testScalarVectorMinusDense() {
testVectorBinaryPrimitive(BinType.VECT_MINUS_SCALAR, InputType.SCALAR, InputType.VECTOR_DENSE);
}
@Test
public void testScalarVectorMinusSparse() {
testVectorBinaryPrimitive(BinType.VECT_MINUS_SCALAR, InputType.SCALAR, InputType.VECTOR_SPARSE);
}
@Test
public void testVectorVectorMinusDenseDense() {
testVectorBinaryPrimitive(BinType.VECT_MINUS, InputType.VECTOR_DENSE, InputType.VECTOR_DENSE);
}
@Test
public void testVectorVectorMinusSparseDense() {
testVectorBinaryPrimitive(BinType.VECT_MINUS, InputType.VECTOR_SPARSE, InputType.VECTOR_DENSE);
}
@Test
public void testVectorScalarMinDense() {
testVectorBinaryPrimitive(BinType.VECT_MIN_SCALAR, InputType.VECTOR_DENSE, InputType.SCALAR);
}
@Test
public void testVectorScalarMinSparse() {
testVectorBinaryPrimitive(BinType.VECT_MIN_SCALAR, InputType.VECTOR_SPARSE, InputType.SCALAR);
}
@Test
public void testScalarVectorMinDense() {
testVectorBinaryPrimitive(BinType.VECT_MIN_SCALAR, InputType.SCALAR, InputType.VECTOR_DENSE);
}
@Test
public void testScalarVectorMinSparse() {
testVectorBinaryPrimitive(BinType.VECT_MIN_SCALAR, InputType.SCALAR, InputType.VECTOR_SPARSE);
}
@Test
public void testVectorVectorMinDenseDense() {
testVectorBinaryPrimitive(BinType.VECT_MIN, InputType.VECTOR_DENSE, InputType.VECTOR_DENSE);
}
@Test
public void testVectorVectorMinSparseDense() {
testVectorBinaryPrimitive(BinType.VECT_MIN, InputType.VECTOR_SPARSE, InputType.VECTOR_DENSE);
}
@Test
public void testVectorScalarMaxDense() {
testVectorBinaryPrimitive(BinType.VECT_MAX_SCALAR, InputType.VECTOR_DENSE, InputType.SCALAR);
}
@Test
public void testVectorScalarMaxSparse() {
testVectorBinaryPrimitive(BinType.VECT_MAX_SCALAR, InputType.VECTOR_SPARSE, InputType.SCALAR);
}
@Test
public void testScalarVectorMaxDense() {
testVectorBinaryPrimitive(BinType.VECT_MAX_SCALAR, InputType.SCALAR, InputType.VECTOR_DENSE);
}
@Test
public void testScalarVectorMaxSparse() {
testVectorBinaryPrimitive(BinType.VECT_MAX_SCALAR, InputType.SCALAR, InputType.VECTOR_SPARSE);
}
@Test
public void testVectorVectorMaxDenseDense() {
testVectorBinaryPrimitive(BinType.VECT_MAX, InputType.VECTOR_DENSE, InputType.VECTOR_DENSE);
}
@Test
public void testVectorVectorMaxSparseDense() {
testVectorBinaryPrimitive(BinType.VECT_MAX, InputType.VECTOR_SPARSE, InputType.VECTOR_DENSE);
}
@Test
public void testVectorScalarPowDense() {
testVectorBinaryPrimitive(BinType.VECT_POW_SCALAR, InputType.VECTOR_DENSE, InputType.SCALAR);
}
@Test
public void testVectorScalarPowSparse() {
testVectorBinaryPrimitive(BinType.VECT_POW_SCALAR, InputType.VECTOR_SPARSE, InputType.SCALAR);
}
@Test
public void testScalarVectorPowDense() {
testVectorBinaryPrimitive(BinType.VECT_POW_SCALAR, InputType.SCALAR, InputType.VECTOR_DENSE);
}
@Test
public void testScalarVectorPowSparse() {
testVectorBinaryPrimitive(BinType.VECT_POW_SCALAR, InputType.SCALAR, InputType.VECTOR_SPARSE);
}
//TODO pow vector-vector operations
@Test
public void testVectorScalarEqualDense() {
testVectorBinaryPrimitive(BinType.VECT_EQUAL_SCALAR, InputType.VECTOR_DENSE, InputType.SCALAR);
}
@Test
public void testVectorScalarEqualSparse() {
testVectorBinaryPrimitive(BinType.VECT_EQUAL_SCALAR, InputType.VECTOR_SPARSE, InputType.SCALAR);
}
@Test
public void testScalarVectorEqualDense() {
testVectorBinaryPrimitive(BinType.VECT_EQUAL_SCALAR, InputType.SCALAR, InputType.VECTOR_DENSE);
}
@Test
public void testScalarVectorEqualSparse() {
testVectorBinaryPrimitive(BinType.VECT_EQUAL_SCALAR, InputType.SCALAR, InputType.VECTOR_SPARSE);
}
@Test
public void testVectorVectorEqualDenseDense() {
testVectorBinaryPrimitive(BinType.VECT_EQUAL, InputType.VECTOR_DENSE, InputType.VECTOR_DENSE);
}
@Test
public void testVectorVectorEqualSparseDense() {
testVectorBinaryPrimitive(BinType.VECT_EQUAL, InputType.VECTOR_SPARSE, InputType.VECTOR_DENSE);
}
@Test
public void testVectorScalarNotEqualDense() {
testVectorBinaryPrimitive(BinType.VECT_NOTEQUAL_SCALAR, InputType.VECTOR_DENSE, InputType.SCALAR);
}
@Test
public void testVectorScalarNotEqualSparse() {
testVectorBinaryPrimitive(BinType.VECT_NOTEQUAL_SCALAR, InputType.VECTOR_SPARSE, InputType.SCALAR);
}
@Test
public void testScalarVectorNotEqualDense() {
testVectorBinaryPrimitive(BinType.VECT_NOTEQUAL_SCALAR, InputType.SCALAR, InputType.VECTOR_DENSE);
}
@Test
public void testScalarVectorNotEqualSparse() {
testVectorBinaryPrimitive(BinType.VECT_NOTEQUAL_SCALAR, InputType.SCALAR, InputType.VECTOR_SPARSE);
}
@Test
public void testVectorVectorNotEqualDenseDense() {
testVectorBinaryPrimitive(BinType.VECT_NOTEQUAL, InputType.VECTOR_DENSE, InputType.VECTOR_DENSE);
}
@Test
public void testVectorVectorNotEqualSparseDense() {
testVectorBinaryPrimitive(BinType.VECT_NOTEQUAL, InputType.VECTOR_SPARSE, InputType.VECTOR_DENSE);
}
@Test
public void testVectorScalarLessDense() {
testVectorBinaryPrimitive(BinType.VECT_LESS_SCALAR, InputType.VECTOR_DENSE, InputType.SCALAR);
}
@Test
public void testVectorScalarLessSparse() {
testVectorBinaryPrimitive(BinType.VECT_LESS_SCALAR, InputType.VECTOR_SPARSE, InputType.SCALAR);
}
@Test
public void testScalarVectorLessDense() {
testVectorBinaryPrimitive(BinType.VECT_LESS_SCALAR, InputType.SCALAR, InputType.VECTOR_DENSE);
}
@Test
public void testScalarVectorLessSparse() {
testVectorBinaryPrimitive(BinType.VECT_LESS_SCALAR, InputType.SCALAR, InputType.VECTOR_SPARSE);
}
@Test
public void testVectorVectorLessDenseDense() {
testVectorBinaryPrimitive(BinType.VECT_LESS, InputType.VECTOR_DENSE, InputType.VECTOR_DENSE);
}
@Test
public void testVectorVectorLessSparseDense() {
testVectorBinaryPrimitive(BinType.VECT_LESS, InputType.VECTOR_SPARSE, InputType.VECTOR_DENSE);
}
@Test
public void testVectorScalarLessEqualDense() {
testVectorBinaryPrimitive(BinType.VECT_LESSEQUAL_SCALAR, InputType.VECTOR_DENSE, InputType.SCALAR);
}
@Test
public void testVectorScalarLessEqualSparse() {
testVectorBinaryPrimitive(BinType.VECT_LESSEQUAL_SCALAR, InputType.VECTOR_SPARSE, InputType.SCALAR);
}
@Test
public void testScalarVectorLessEqualDense() {
testVectorBinaryPrimitive(BinType.VECT_LESSEQUAL_SCALAR, InputType.SCALAR, InputType.VECTOR_DENSE);
}
@Test
public void testScalarVectorLessEqualSparse() {
testVectorBinaryPrimitive(BinType.VECT_LESSEQUAL_SCALAR, InputType.SCALAR, InputType.VECTOR_SPARSE);
}
@Test
public void testVectorVectorLessEqualDenseDense() {
testVectorBinaryPrimitive(BinType.VECT_LESSEQUAL, InputType.VECTOR_DENSE, InputType.VECTOR_DENSE);
}
@Test
public void testVectorVectorLessEqualSparseDense() {
testVectorBinaryPrimitive(BinType.VECT_LESSEQUAL, InputType.VECTOR_SPARSE, InputType.VECTOR_DENSE);
}
@Test
public void testVectorScalarGreaterDense() {
testVectorBinaryPrimitive(BinType.VECT_GREATER_SCALAR, InputType.VECTOR_DENSE, InputType.SCALAR);
}
@Test
public void testVectorScalarGreaterSparse() {
testVectorBinaryPrimitive(BinType.VECT_GREATER_SCALAR, InputType.VECTOR_SPARSE, InputType.SCALAR);
}
@Test
public void testScalarVectorGreaterDense() {
testVectorBinaryPrimitive(BinType.VECT_GREATER_SCALAR, InputType.SCALAR, InputType.VECTOR_DENSE);
}
@Test
public void testScalarVectorGreaterSparse() {
testVectorBinaryPrimitive(BinType.VECT_GREATER_SCALAR, InputType.SCALAR, InputType.VECTOR_SPARSE);
}
@Test
public void testVectorVectorGreaterDenseDense() {
testVectorBinaryPrimitive(BinType.VECT_GREATER, InputType.VECTOR_DENSE, InputType.VECTOR_DENSE);
}
@Test
public void testVectorVectorGreaterSparseDense() {
testVectorBinaryPrimitive(BinType.VECT_GREATER, InputType.VECTOR_SPARSE, InputType.VECTOR_DENSE);
}
@Test
public void testVectorScalarGreaterEqualDense() {
testVectorBinaryPrimitive(BinType.VECT_GREATEREQUAL_SCALAR, InputType.VECTOR_DENSE, InputType.SCALAR);
}
@Test
public void testVectorScalarGreaterEqualSparse() {
testVectorBinaryPrimitive(BinType.VECT_GREATEREQUAL_SCALAR, InputType.VECTOR_SPARSE, InputType.SCALAR);
}
@Test
public void testScalarVectorGreaterEqualDense() {
testVectorBinaryPrimitive(BinType.VECT_GREATEREQUAL_SCALAR, InputType.SCALAR, InputType.VECTOR_DENSE);
}
@Test
public void testScalarVectorGreaterEqualSparse() {
testVectorBinaryPrimitive(BinType.VECT_GREATEREQUAL_SCALAR, InputType.SCALAR, InputType.VECTOR_SPARSE);
}
@Test
public void testVectorVectorGreaterEqualDenseDense() {
testVectorBinaryPrimitive(BinType.VECT_GREATEREQUAL, InputType.VECTOR_DENSE, InputType.VECTOR_DENSE);
}
@Test
public void testVectorVectorGreaterEqualSparseDense() {
testVectorBinaryPrimitive(BinType.VECT_GREATEREQUAL, InputType.VECTOR_SPARSE, InputType.VECTOR_DENSE);
}
@Test
public void testScalarVectorXorDense() {
testVectorBinaryPrimitive(BinType.VECT_XOR_SCALAR, InputType.SCALAR, InputType.VECTOR_DENSE);
}
@Test
public void testVectorScalarXorDense() {
testVectorBinaryPrimitive(BinType.VECT_XOR_SCALAR, InputType.VECTOR_DENSE, InputType.VECTOR_DENSE);
}
@Test
public void testVectorVectorXorDenseDense() {
testVectorBinaryPrimitive(BinType.VECT_XOR, InputType.VECTOR_DENSE, InputType.VECTOR_DENSE);
}
@Test
public void testVectorScalarXorSparse() {
testVectorBinaryPrimitive(BinType.VECT_XOR_SCALAR, InputType.VECTOR_SPARSE, InputType.SCALAR);
}
@Test
public void testScalarVectorXorSparse() {
testVectorBinaryPrimitive(BinType.VECT_XOR_SCALAR, InputType.SCALAR, InputType.VECTOR_SPARSE);
}
@Test
public void testVectorVectorXorSparseDense() {
testVectorBinaryPrimitive(BinType.VECT_XOR, InputType.VECTOR_SPARSE, InputType.VECTOR_DENSE);
}
//***************** Logical Bitwise Operators ********************//
@Test //1.
public void testVectorScalarBitwAndDense() {
testVectorBinaryPrimitive(BinType.VECT_BITWAND_SCALAR, InputType.VECTOR_DENSE, InputType.SCALAR);
}
@Test //2.
public void testScalarVectorBitwAndDense() {
testVectorBinaryPrimitive(BinType.VECT_BITWAND_SCALAR, InputType.SCALAR, InputType.VECTOR_DENSE);
}
@Test //3.
public void testVectorVectorBitwAndDenseDense() {
testVectorBinaryPrimitive(BinType.VECT_BITWAND, InputType.VECTOR_DENSE, InputType.VECTOR_DENSE);
}
@Test //4.
public void testVectorScalarBitwAndSparse() {
testVectorBinaryPrimitive(BinType.VECT_BITWAND, InputType.VECTOR_SPARSE, InputType.SCALAR);
}
@Test //5.
public void testScalarVectorBitwAndSparse() {
testVectorBinaryPrimitive(BinType.VECT_BITWAND, InputType.SCALAR, InputType.VECTOR_SPARSE);
}
@Test //6.
public void testVectorVectorBitwAndSparseDense() {
testVectorBinaryPrimitive(BinType.VECT_BITWAND, InputType.VECTOR_SPARSE, InputType.VECTOR_DENSE);
}
@SuppressWarnings("incomplete-switch")
private static void testVectorAggPrimitive(UnaryType aggtype, InputType type1)
{
try {
//generate input data
double sparsity = (type1 == InputType.VECTOR_DENSE) ? sparsity1 : sparsity2;
MatrixBlock in = MatrixBlock.randOperations(m, n, sparsity, -1, 1, "uniform", 7);
//get vector primitive via reflection
String tmp = StringUtils.camelize(aggtype.name().split("_")[1]);
String meName = "vect"+tmp.substring(0, tmp.length()-1);
Method me = (type1 == InputType.VECTOR_DENSE) ?
LibSpoofPrimitives.class.getMethod(meName, new Class[]{double[].class, int.class, int.class}) :
LibSpoofPrimitives.class.getMethod(meName, new Class[]{double[].class, int[].class, int.class, int.class, int.class});
for( int i=0; i<m; i++ ) {
//execute vector primitive via reflection
Double ret1 = (Double) ((type1 == InputType.VECTOR_DENSE) ?
me.invoke(null, in.getDenseBlockValues(), i*n, n) :
me.invoke(null, in.getSparseBlock().values(i), in.getSparseBlock().indexes(i),
in.getSparseBlock().pos(i), in.getSparseBlock().size(i), n));
//execute comparison operation
MatrixBlock in2 = in.slice(i, i, 0, n-1, new MatrixBlock());
Double ret2 = -1d;
switch( aggtype ) {
case ROW_SUMS: ret2 = in2.sum(); break;
case ROW_MAXS: ret2 = in2.max(); break;
case ROW_MINS: ret2 = in2.min(); break;
case ROW_MEANS: ret2 = in2.mean(); break;
}
//compare results
TestUtils.compareCellValue(ret1, ret2, eps, false);
}
}
catch( Exception ex ) {
throw new RuntimeException(ex);
}
}
private static void testVectorUnaryPrimitive(UnaryType utype, InputType type1)
{
try {
//generate input data
double sparsity = (type1 == InputType.VECTOR_DENSE) ? sparsity1 : sparsity2;
MatrixBlock in = MatrixBlock.randOperations(m, n, sparsity, -1, 1, "uniform", 7);
//get vector primitive via reflection
String meName = "vect"+StringUtils.camelize(utype.name().split("_")[1])+"Write";
Method me = (type1 == InputType.VECTOR_DENSE) ?
LibSpoofPrimitives.class.getMethod(meName, new Class[]{double[].class, int.class, int.class}) :
LibSpoofPrimitives.class.getMethod(meName, new Class[]{double[].class, int[].class, int.class, int.class, int.class});
for( int i=0; i<m; i++ ) {
//execute vector primitive via reflection
double[] ret1 = (double[]) ((type1 == InputType.VECTOR_DENSE) ?
me.invoke(null, in.getDenseBlockValues(), i*n, n) :
me.invoke(null, in.getSparseBlock().values(i), in.getSparseBlock().indexes(i),
in.getSparseBlock().pos(i), in.getSparseBlock().size(i), n));
//execute comparison operation
String opcode = utype.name().split("_")[1].toLowerCase();
UnaryOperator uop = new UnaryOperator(Builtin.getBuiltinFnObject(opcode));
double[] ret2 = DataConverter.convertToDoubleVector(
in.slice(i, i, 0, n-1, new MatrixBlock())
.unaryOperations(uop, new MatrixBlock()), false);
//compare results
TestUtils.compareMatrices(ret1, ret2, eps);
}
}
catch( Exception ex ) {
throw new RuntimeException(ex);
}
}
private static void testVectorBinaryPrimitive(BinType bintype, InputType type1, InputType type2)
{
try {
//generate input data (scalar later derived if needed)
double sparsityA = (type1 == InputType.VECTOR_DENSE) ? sparsity1 : sparsity2;
MatrixBlock inA = MatrixBlock.randOperations(m, n, sparsityA, -5, 5, "uniform", 3);
double sparsityB = (type2 == InputType.VECTOR_DENSE) ? sparsity1 : sparsity2;
MatrixBlock inB = MatrixBlock.randOperations(m, n, sparsityB, -5, 5, "uniform", 7);
//get vector primitive via reflection
String meName = "vect"+StringUtils.camelize(bintype.name().split("_")[1])+"Write";
Method me = null;
if( type1==InputType.SCALAR && type2==InputType.VECTOR_DENSE )
me = LibSpoofPrimitives.class.getMethod(meName, new Class[]{double.class, double[].class, int.class, int.class});
else if( type1==InputType.VECTOR_DENSE && type2==InputType.SCALAR )
me = LibSpoofPrimitives.class.getMethod(meName, new Class[]{double[].class, double.class, int.class, int.class});
else if( type1==InputType.VECTOR_DENSE && type2==InputType.VECTOR_DENSE )
me = LibSpoofPrimitives.class.getMethod(meName, new Class[]{double[].class, double[].class, int.class, int.class, int.class});
else if( type1==InputType.VECTOR_SPARSE && type2==InputType.SCALAR )
me = LibSpoofPrimitives.class.getMethod(meName, new Class[]{double[].class, double.class, int[].class, int.class, int.class, int.class});
else if( type1==InputType.SCALAR && type2==InputType.VECTOR_SPARSE )
me = LibSpoofPrimitives.class.getMethod(meName, new Class[]{double.class, double[].class, int[].class, int.class, int.class, int.class});
else if( type1==InputType.VECTOR_SPARSE && type2==InputType.VECTOR_DENSE )
me = LibSpoofPrimitives.class.getMethod(meName, new Class[]{double[].class, double[].class, int[].class, int.class, int.class, int.class, int.class});
for( int i=0; i<m; i++ ) {
//execute vector primitive via reflection
double[] ret1 = null;
if( type1==InputType.SCALAR && type2==InputType.VECTOR_DENSE )
ret1 = (double[]) me.invoke(null, inA.max(), inB.getDenseBlockValues(), i*n, n);
else if( type1==InputType.VECTOR_DENSE && type2==InputType.SCALAR )
ret1 = (double[]) me.invoke(null, inA.getDenseBlockValues(), inB.max(), i*n, n);
else if( type1==InputType.VECTOR_DENSE && type2==InputType.VECTOR_DENSE )
ret1 = (double[]) me.invoke(null, inA.getDenseBlockValues(), inB.getDenseBlockValues(), i*n, i*n, n);
else if( type1==InputType.VECTOR_SPARSE && type2==InputType.SCALAR )
ret1 = (double[]) me.invoke(null, inA.getSparseBlock().values(i), inB.max(), inA.getSparseBlock().indexes(i),
inA.getSparseBlock().pos(i), inA.getSparseBlock().size(i), n);
else if( type1==InputType.SCALAR && type2==InputType.VECTOR_SPARSE )
ret1 = (double[]) me.invoke(null, inA.max(), inB.getSparseBlock().values(i),
inB.getSparseBlock().indexes(i), inB.getSparseBlock().pos(i), inB.getSparseBlock().size(i), n);
else if( type1==InputType.VECTOR_SPARSE && type2==InputType.VECTOR_DENSE )
ret1 = (double[]) me.invoke(null, inA.getSparseBlock().values(i), inB.getDenseBlockValues(),
inA.getSparseBlock().indexes(i), inA.getSparseBlock().pos(i), i*n, inA.getSparseBlock().size(i), n);
//execute comparison operation
String opcode = OpOp2.valueOf(bintype.name().split("_")[1]).toString();
MatrixBlock in1 = inA.slice(i, i, 0, n-1, new MatrixBlock());
MatrixBlock in2 = inB.slice(i, i, 0, n-1, new MatrixBlock());
double[] ret2 = null;
if( type1 == InputType.SCALAR ) {
ScalarOperator bop = InstructionUtils.parseScalarBinaryOperator(opcode, true);
bop = bop.setConstant(inA.max());
ret2 = DataConverter.convertToDoubleVector(
in2.scalarOperations(bop, new MatrixBlock()), false);
}
else if( type2 == InputType.SCALAR ) {
ScalarOperator bop = InstructionUtils.parseScalarBinaryOperator(opcode, false);
bop = bop.setConstant(inB.max());
ret2 = DataConverter.convertToDoubleVector(
in1.scalarOperations(bop, new MatrixBlock()), false);
}
else { //vector-vector
BinaryOperator bop = InstructionUtils.parseBinaryOperator(opcode);
ret2 = DataConverter.convertToDoubleVector(
in1.binaryOperations(bop, in2, new MatrixBlock()), false);
}
//compare results
TestUtils.compareMatrices(ret1, ret2, eps);
}
}
catch( Exception ex ) {
throw new RuntimeException(ex);
}
}
}