in src/main/java/org/apache/sysds/runtime/instructions/InstructionUtils.java [718:860]
public static ScalarOperator parseScalarBinaryOperator(String opcode, boolean arg1IsScalar, double constant)
{
// TODO add Multithreaded threads to Scalar operations.
//commutative operators
if ( opcode.equalsIgnoreCase(Opcodes.PLUS.toString()) ){
return new RightScalarOperator(Plus.getPlusFnObject(), constant);
}
else if ( opcode.equalsIgnoreCase(Opcodes.MULT.toString()) ) {
return new RightScalarOperator(Multiply.getMultiplyFnObject(), constant);
}
//non-commutative operators
else if ( opcode.equalsIgnoreCase(Opcodes.MINUS.toString()) ) {
if(arg1IsScalar)
return new LeftScalarOperator(Minus.getMinusFnObject(), constant);
else return new RightScalarOperator(Minus.getMinusFnObject(), constant);
}
else if ( opcode.equalsIgnoreCase(Opcodes.MINUS_NZ.toString()) ) {
//no support for left scalar yet
return new RightScalarOperator(MinusNz.getMinusNzFnObject(), constant);
}
else if ( opcode.equalsIgnoreCase(Opcodes.DIV.toString()) ) {
if(arg1IsScalar)
return new LeftScalarOperator(Divide.getDivideFnObject(), constant);
else return new RightScalarOperator(Divide.getDivideFnObject(), constant);
}
else if ( opcode.equalsIgnoreCase(Opcodes.MODULUS.toString()) ) {
if(arg1IsScalar)
return new LeftScalarOperator(Modulus.getFnObject(), constant);
else return new RightScalarOperator(Modulus.getFnObject(), constant);
}
else if ( opcode.equalsIgnoreCase(Opcodes.INTDIV.toString()) ) {
if(arg1IsScalar)
return new LeftScalarOperator(IntegerDivide.getFnObject(), constant);
else return new RightScalarOperator(IntegerDivide.getFnObject(), constant);
}
else if ( opcode.equalsIgnoreCase(Opcodes.POW.toString()) ){
if(arg1IsScalar)
return new LeftScalarOperator(Power.getPowerFnObject(), constant);
else return new RightScalarOperator(Power.getPowerFnObject(), constant);
}
else if ( opcode.equalsIgnoreCase(Opcodes.MAX.toString()) ) {
return new RightScalarOperator(Builtin.getBuiltinFnObject("max"), constant);
}
else if ( opcode.equalsIgnoreCase(Opcodes.MIN.toString()) ) {
return new RightScalarOperator(Builtin.getBuiltinFnObject("min"), constant);
}
else if ( opcode.equalsIgnoreCase(Opcodes.LOG.toString()) || opcode.equalsIgnoreCase(Opcodes.LOGNZ.toString()) ){
if( arg1IsScalar )
return new LeftScalarOperator(Builtin.getBuiltinFnObject(opcode), constant);
return new RightScalarOperator(Builtin.getBuiltinFnObject(opcode), constant);
}
else if ( opcode.equalsIgnoreCase(Opcodes.GREATER.toString()) ) {
if(arg1IsScalar)
return new LeftScalarOperator(GreaterThan.getGreaterThanFnObject(), constant);
return new RightScalarOperator(GreaterThan.getGreaterThanFnObject(), constant);
}
else if ( opcode.equalsIgnoreCase(Opcodes.GREATEREQUAL.toString()) ) {
if(arg1IsScalar)
return new LeftScalarOperator(GreaterThanEquals.getGreaterThanEqualsFnObject(), constant);
return new RightScalarOperator(GreaterThanEquals.getGreaterThanEqualsFnObject(), constant);
}
else if ( opcode.equalsIgnoreCase(Opcodes.LESS.toString()) ) {
if(arg1IsScalar)
return new LeftScalarOperator(LessThan.getLessThanFnObject(), constant);
return new RightScalarOperator(LessThan.getLessThanFnObject(), constant);
}
else if ( opcode.equalsIgnoreCase(Opcodes.LESSEQUAL.toString()) ) {
if(arg1IsScalar)
return new LeftScalarOperator(LessThanEquals.getLessThanEqualsFnObject(), constant);
return new RightScalarOperator(LessThanEquals.getLessThanEqualsFnObject(), constant);
}
else if ( opcode.equalsIgnoreCase(Opcodes.EQUAL.toString()) ) {
if(arg1IsScalar)
return new LeftScalarOperator(Equals.getEqualsFnObject(), constant);
return new RightScalarOperator(Equals.getEqualsFnObject(), constant);
}
else if ( opcode.equalsIgnoreCase(Opcodes.NOTEQUAL.toString()) ) {
if(arg1IsScalar)
return new LeftScalarOperator(NotEquals.getNotEqualsFnObject(), constant);
return new RightScalarOperator(NotEquals.getNotEqualsFnObject(), constant);
}
else if ( opcode.equalsIgnoreCase(Opcodes.AND.toString()) ) {
return arg1IsScalar ?
new LeftScalarOperator(And.getAndFnObject(), constant) :
new RightScalarOperator(And.getAndFnObject(), constant);
}
else if ( opcode.equalsIgnoreCase(Opcodes.OR.toString()) ) {
return arg1IsScalar ?
new LeftScalarOperator(Or.getOrFnObject(), constant) :
new RightScalarOperator(Or.getOrFnObject(), constant);
}
else if ( opcode.equalsIgnoreCase(Opcodes.XOR.toString()) ) {
return arg1IsScalar ?
new LeftScalarOperator(Xor.getXorFnObject(), constant) :
new RightScalarOperator(Xor.getXorFnObject(), constant);
}
else if ( opcode.equalsIgnoreCase(Opcodes.BITWAND.toString()) ) {
return arg1IsScalar ?
new LeftScalarOperator(BitwAnd.getBitwAndFnObject(), constant) :
new RightScalarOperator(BitwAnd.getBitwAndFnObject(), constant);
}
else if ( opcode.equalsIgnoreCase(Opcodes.BITWOR.toString()) ) {
return arg1IsScalar ?
new LeftScalarOperator(BitwOr.getBitwOrFnObject(), constant) :
new RightScalarOperator(BitwOr.getBitwOrFnObject(), constant);
}
else if ( opcode.equalsIgnoreCase(Opcodes.BITWXOR.toString()) ) {
return arg1IsScalar ?
new LeftScalarOperator(BitwXor.getBitwXorFnObject(), constant) :
new RightScalarOperator(BitwXor.getBitwXorFnObject(), constant);
}
else if ( opcode.equalsIgnoreCase(Opcodes.BITWSHIFTL.toString()) ) {
return arg1IsScalar ?
new LeftScalarOperator(BitwShiftL.getBitwShiftLFnObject(), constant) :
new RightScalarOperator(BitwShiftL.getBitwShiftLFnObject(), constant);
}
else if ( opcode.equalsIgnoreCase(Opcodes.BITWSHIFTR.toString()) ) {
return arg1IsScalar ?
new LeftScalarOperator(BitwShiftR.getBitwShiftRFnObject(), constant) :
new RightScalarOperator(BitwShiftR.getBitwShiftRFnObject(), constant);
}
//operations that only exist for performance purposes (all unary or commutative operators)
else if ( opcode.equalsIgnoreCase(Opcodes.MULT2.toString()) ) {
return new RightScalarOperator(Multiply2.getMultiply2FnObject(), constant);
}
else if ( opcode.equalsIgnoreCase(Opcodes.POW2.toString()) ){
return new RightScalarOperator(Power2.getPower2FnObject(), constant);
}
else if ( opcode.equalsIgnoreCase(Opcodes.MINUS1_MULT.toString()) ) {
return new RightScalarOperator(Minus1Multiply.getMinus1MultiplyFnObject(), constant);
}
//operations that only exist in mr
else if ( opcode.equalsIgnoreCase("s-r") ) {
return new LeftScalarOperator(Minus.getMinusFnObject(), constant);
}
else if ( opcode.equalsIgnoreCase("so") ) {
return new LeftScalarOperator(Divide.getDivideFnObject(), constant);
}
throw new RuntimeException("Unknown binary opcode " + opcode);
}