/* * 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.sysml.runtime.instructions; import java.util.HashMap; import org.apache.sysml.lops.Checkpoint; import org.apache.sysml.lops.Compression; import org.apache.sysml.lops.DataGen; import org.apache.sysml.lops.WeightedCrossEntropy; import org.apache.sysml.lops.WeightedCrossEntropyR; import org.apache.sysml.lops.WeightedDivMM; import org.apache.sysml.lops.WeightedDivMMR; import org.apache.sysml.lops.WeightedSigmoid; import org.apache.sysml.lops.WeightedSigmoidR; import org.apache.sysml.lops.WeightedSquaredLoss; import org.apache.sysml.lops.WeightedSquaredLossR; import org.apache.sysml.lops.WeightedUnaryMM; import org.apache.sysml.lops.WeightedUnaryMMR; import org.apache.sysml.runtime.DMLRuntimeException; import org.apache.sysml.runtime.instructions.spark.AggregateTernarySPInstruction; import org.apache.sysml.runtime.instructions.spark.AggregateUnarySPInstruction; import org.apache.sysml.runtime.instructions.spark.AppendGAlignedSPInstruction; import org.apache.sysml.runtime.instructions.spark.AppendGSPInstruction; import org.apache.sysml.runtime.instructions.spark.AppendMSPInstruction; import org.apache.sysml.runtime.instructions.spark.AppendRSPInstruction; import org.apache.sysml.runtime.instructions.spark.ArithmeticBinarySPInstruction; import org.apache.sysml.runtime.instructions.spark.BinUaggChainSPInstruction; import org.apache.sysml.runtime.instructions.spark.BuiltinBinarySPInstruction; import org.apache.sysml.runtime.instructions.spark.BuiltinUnarySPInstruction; import org.apache.sysml.runtime.instructions.spark.CSVReblockSPInstruction; import org.apache.sysml.runtime.instructions.spark.CastSPInstruction; import org.apache.sysml.runtime.instructions.spark.CentralMomentSPInstruction; import org.apache.sysml.runtime.instructions.spark.CheckpointSPInstruction; import org.apache.sysml.runtime.instructions.spark.CompressionSPInstruction; import org.apache.sysml.runtime.instructions.spark.ConvolutionSPInstruction; import org.apache.sysml.runtime.instructions.spark.CovarianceSPInstruction; import org.apache.sysml.runtime.instructions.spark.CpmmSPInstruction; import org.apache.sysml.runtime.instructions.spark.CumulativeAggregateSPInstruction; import org.apache.sysml.runtime.instructions.spark.CumulativeOffsetSPInstruction; import org.apache.sysml.runtime.instructions.spark.IndexingSPInstruction; import org.apache.sysml.runtime.instructions.spark.MapmmChainSPInstruction; import org.apache.sysml.runtime.instructions.spark.MapmmSPInstruction; import org.apache.sysml.runtime.instructions.spark.MatrixReshapeSPInstruction; import org.apache.sysml.runtime.instructions.spark.MultiReturnParameterizedBuiltinSPInstruction; import org.apache.sysml.runtime.instructions.spark.PMapmmSPInstruction; import org.apache.sysml.runtime.instructions.spark.ParameterizedBuiltinSPInstruction; import org.apache.sysml.runtime.instructions.spark.PlusMultSPInstruction; import org.apache.sysml.runtime.instructions.spark.PmmSPInstruction; import org.apache.sysml.runtime.instructions.spark.QuantilePickSPInstruction; import org.apache.sysml.runtime.instructions.spark.QuaternarySPInstruction; import org.apache.sysml.runtime.instructions.spark.RandSPInstruction; import org.apache.sysml.runtime.instructions.spark.ReblockSPInstruction; import org.apache.sysml.runtime.instructions.spark.RelationalBinarySPInstruction; import org.apache.sysml.runtime.instructions.spark.ReorgSPInstruction; import org.apache.sysml.runtime.instructions.spark.RmmSPInstruction; import org.apache.sysml.runtime.instructions.spark.SPInstruction; import org.apache.sysml.runtime.instructions.spark.SPInstruction.SPINSTRUCTION_TYPE; import org.apache.sysml.runtime.instructions.spark.SpoofSPInstruction; import org.apache.sysml.runtime.instructions.spark.TernarySPInstruction; import org.apache.sysml.runtime.instructions.spark.Tsmm2SPInstruction; import org.apache.sysml.runtime.instructions.spark.TsmmSPInstruction; import org.apache.sysml.runtime.instructions.spark.QuantileSortSPInstruction; import org.apache.sysml.runtime.instructions.spark.UaggOuterChainSPInstruction; import org.apache.sysml.runtime.instructions.spark.WriteSPInstruction; import org.apache.sysml.runtime.instructions.spark.ZipmmSPInstruction; public class SPInstructionParser extends InstructionParser { public static final HashMap<String, SPINSTRUCTION_TYPE> String2SPInstructionType; static { String2SPInstructionType = new HashMap<String, SPInstruction.SPINSTRUCTION_TYPE>(); //unary aggregate operators String2SPInstructionType.put( "uak+" , SPINSTRUCTION_TYPE.AggregateUnary); String2SPInstructionType.put( "uark+" , SPINSTRUCTION_TYPE.AggregateUnary); String2SPInstructionType.put( "uack+" , SPINSTRUCTION_TYPE.AggregateUnary); String2SPInstructionType.put( "uasqk+" , SPINSTRUCTION_TYPE.AggregateUnary); String2SPInstructionType.put( "uarsqk+" , SPINSTRUCTION_TYPE.AggregateUnary); String2SPInstructionType.put( "uacsqk+" , SPINSTRUCTION_TYPE.AggregateUnary); String2SPInstructionType.put( "uamean" , SPINSTRUCTION_TYPE.AggregateUnary); String2SPInstructionType.put( "uarmean" , SPINSTRUCTION_TYPE.AggregateUnary); String2SPInstructionType.put( "uacmean" , SPINSTRUCTION_TYPE.AggregateUnary); String2SPInstructionType.put( "uavar" , SPINSTRUCTION_TYPE.AggregateUnary); String2SPInstructionType.put( "uarvar" , SPINSTRUCTION_TYPE.AggregateUnary); String2SPInstructionType.put( "uacvar" , SPINSTRUCTION_TYPE.AggregateUnary); String2SPInstructionType.put( "uamax" , SPINSTRUCTION_TYPE.AggregateUnary); String2SPInstructionType.put( "uarmax" , SPINSTRUCTION_TYPE.AggregateUnary); String2SPInstructionType.put( "uarimax", SPINSTRUCTION_TYPE.AggregateUnary); String2SPInstructionType.put( "uacmax" , SPINSTRUCTION_TYPE.AggregateUnary); String2SPInstructionType.put( "uamin" , SPINSTRUCTION_TYPE.AggregateUnary); String2SPInstructionType.put( "uarmin" , SPINSTRUCTION_TYPE.AggregateUnary); String2SPInstructionType.put( "uarimin" , SPINSTRUCTION_TYPE.AggregateUnary); String2SPInstructionType.put( "uacmin" , SPINSTRUCTION_TYPE.AggregateUnary); String2SPInstructionType.put( "ua+" , SPINSTRUCTION_TYPE.AggregateUnary); String2SPInstructionType.put( "uar+" , SPINSTRUCTION_TYPE.AggregateUnary); String2SPInstructionType.put( "uac+" , SPINSTRUCTION_TYPE.AggregateUnary); String2SPInstructionType.put( "ua*" , SPINSTRUCTION_TYPE.AggregateUnary); String2SPInstructionType.put( "uatrace" , SPINSTRUCTION_TYPE.AggregateUnary); String2SPInstructionType.put( "uaktrace", SPINSTRUCTION_TYPE.AggregateUnary); //binary aggregate operators (matrix multiplication operators) String2SPInstructionType.put( "mapmm" , SPINSTRUCTION_TYPE.MAPMM); String2SPInstructionType.put( "mapmmchain" , SPINSTRUCTION_TYPE.MAPMMCHAIN); String2SPInstructionType.put( "tsmm" , SPINSTRUCTION_TYPE.TSMM); //single-pass tsmm String2SPInstructionType.put( "tsmm2" , SPINSTRUCTION_TYPE.TSMM2); //multi-pass tsmm String2SPInstructionType.put( "cpmm" , SPINSTRUCTION_TYPE.CPMM); String2SPInstructionType.put( "rmm" , SPINSTRUCTION_TYPE.RMM); String2SPInstructionType.put( "pmm" , SPINSTRUCTION_TYPE.PMM); String2SPInstructionType.put( "zipmm" , SPINSTRUCTION_TYPE.ZIPMM); String2SPInstructionType.put( "pmapmm" , SPINSTRUCTION_TYPE.PMAPMM); String2SPInstructionType.put( "uaggouterchain", SPINSTRUCTION_TYPE.UaggOuterChain); //ternary aggregate operators String2SPInstructionType.put( "tak+*" , SPINSTRUCTION_TYPE.AggregateTernary); String2SPInstructionType.put( "tack+*" , SPINSTRUCTION_TYPE.AggregateTernary); // Neural network operators String2SPInstructionType.put( "conv2d", SPINSTRUCTION_TYPE.Convolution); String2SPInstructionType.put( "conv2d_bias_add", SPINSTRUCTION_TYPE.Convolution); String2SPInstructionType.put( "maxpooling", SPINSTRUCTION_TYPE.Convolution); String2SPInstructionType.put( "relu_maxpooling", SPINSTRUCTION_TYPE.Convolution); String2SPInstructionType.put( "rangeReIndex" , SPINSTRUCTION_TYPE.MatrixIndexing); String2SPInstructionType.put( "leftIndex" , SPINSTRUCTION_TYPE.MatrixIndexing); String2SPInstructionType.put( "mapLeftIndex" , SPINSTRUCTION_TYPE.MatrixIndexing); // Reorg Instruction Opcodes (repositioning of existing values) String2SPInstructionType.put( "r'" , SPINSTRUCTION_TYPE.Reorg); String2SPInstructionType.put( "rev" , SPINSTRUCTION_TYPE.Reorg); String2SPInstructionType.put( "rdiag" , SPINSTRUCTION_TYPE.Reorg); String2SPInstructionType.put( "rshape" , SPINSTRUCTION_TYPE.MatrixReshape); String2SPInstructionType.put( "rsort" , SPINSTRUCTION_TYPE.Reorg); String2SPInstructionType.put( "+" , SPINSTRUCTION_TYPE.ArithmeticBinary); String2SPInstructionType.put( "-" , SPINSTRUCTION_TYPE.ArithmeticBinary); String2SPInstructionType.put( "*" , SPINSTRUCTION_TYPE.ArithmeticBinary); String2SPInstructionType.put( "/" , SPINSTRUCTION_TYPE.ArithmeticBinary); String2SPInstructionType.put( "%%" , SPINSTRUCTION_TYPE.ArithmeticBinary); String2SPInstructionType.put( "%/%" , SPINSTRUCTION_TYPE.ArithmeticBinary); String2SPInstructionType.put( "1-*" , SPINSTRUCTION_TYPE.ArithmeticBinary); String2SPInstructionType.put( "^" , SPINSTRUCTION_TYPE.ArithmeticBinary); String2SPInstructionType.put( "^2" , SPINSTRUCTION_TYPE.ArithmeticBinary); String2SPInstructionType.put( "*2" , SPINSTRUCTION_TYPE.ArithmeticBinary); String2SPInstructionType.put( "+*" , SPINSTRUCTION_TYPE.ArithmeticBinary); String2SPInstructionType.put( "-*" , SPINSTRUCTION_TYPE.ArithmeticBinary); String2SPInstructionType.put( "map+" , SPINSTRUCTION_TYPE.ArithmeticBinary); String2SPInstructionType.put( "map-" , SPINSTRUCTION_TYPE.ArithmeticBinary); String2SPInstructionType.put( "map*" , SPINSTRUCTION_TYPE.ArithmeticBinary); String2SPInstructionType.put( "map/" , SPINSTRUCTION_TYPE.ArithmeticBinary); String2SPInstructionType.put( "map%%" , SPINSTRUCTION_TYPE.ArithmeticBinary); String2SPInstructionType.put( "map%/%" , SPINSTRUCTION_TYPE.ArithmeticBinary); String2SPInstructionType.put( "map1-*" , SPINSTRUCTION_TYPE.ArithmeticBinary); String2SPInstructionType.put( "map^" , SPINSTRUCTION_TYPE.ArithmeticBinary); String2SPInstructionType.put( "map+*" , SPINSTRUCTION_TYPE.ArithmeticBinary); String2SPInstructionType.put( "map-*" , SPINSTRUCTION_TYPE.ArithmeticBinary); String2SPInstructionType.put( "map>" , SPINSTRUCTION_TYPE.RelationalBinary); String2SPInstructionType.put( "map>=" , SPINSTRUCTION_TYPE.RelationalBinary); String2SPInstructionType.put( "map<" , SPINSTRUCTION_TYPE.RelationalBinary); String2SPInstructionType.put( "map<=" , SPINSTRUCTION_TYPE.RelationalBinary); String2SPInstructionType.put( "map==" , SPINSTRUCTION_TYPE.RelationalBinary); String2SPInstructionType.put( "map!=" , SPINSTRUCTION_TYPE.RelationalBinary); // Relational Instruction Opcodes String2SPInstructionType.put( "==" , SPINSTRUCTION_TYPE.RelationalBinary); String2SPInstructionType.put( "!=" , SPINSTRUCTION_TYPE.RelationalBinary); String2SPInstructionType.put( "<" , SPINSTRUCTION_TYPE.RelationalBinary); String2SPInstructionType.put( ">" , SPINSTRUCTION_TYPE.RelationalBinary); String2SPInstructionType.put( "<=" , SPINSTRUCTION_TYPE.RelationalBinary); String2SPInstructionType.put( ">=" , SPINSTRUCTION_TYPE.RelationalBinary); // REBLOCK Instruction Opcodes String2SPInstructionType.put( "rblk" , SPINSTRUCTION_TYPE.Reblock); String2SPInstructionType.put( "csvrblk", SPINSTRUCTION_TYPE.CSVReblock); // Spark-specific instructions String2SPInstructionType.put( Checkpoint.OPCODE, SPINSTRUCTION_TYPE.Checkpoint); String2SPInstructionType.put( Compression.OPCODE, SPINSTRUCTION_TYPE.Compression); // Builtin Instruction Opcodes String2SPInstructionType.put( "log" , SPINSTRUCTION_TYPE.Builtin); String2SPInstructionType.put( "log_nz" , SPINSTRUCTION_TYPE.Builtin); String2SPInstructionType.put( "max" , SPINSTRUCTION_TYPE.BuiltinBinary); String2SPInstructionType.put( "min" , SPINSTRUCTION_TYPE.BuiltinBinary); String2SPInstructionType.put( "mapmax" , SPINSTRUCTION_TYPE.BuiltinBinary); String2SPInstructionType.put( "mapmin" , SPINSTRUCTION_TYPE.BuiltinBinary); String2SPInstructionType.put( "exp" , SPINSTRUCTION_TYPE.BuiltinUnary); String2SPInstructionType.put( "abs" , SPINSTRUCTION_TYPE.BuiltinUnary); String2SPInstructionType.put( "sin" , SPINSTRUCTION_TYPE.BuiltinUnary); String2SPInstructionType.put( "cos" , SPINSTRUCTION_TYPE.BuiltinUnary); String2SPInstructionType.put( "tan" , SPINSTRUCTION_TYPE.BuiltinUnary); String2SPInstructionType.put( "asin" , SPINSTRUCTION_TYPE.BuiltinUnary); String2SPInstructionType.put( "acos" , SPINSTRUCTION_TYPE.BuiltinUnary); String2SPInstructionType.put( "atan" , SPINSTRUCTION_TYPE.BuiltinUnary); String2SPInstructionType.put( "sign" , SPINSTRUCTION_TYPE.BuiltinUnary); String2SPInstructionType.put( "sqrt" , SPINSTRUCTION_TYPE.BuiltinUnary); String2SPInstructionType.put( "plogp" , SPINSTRUCTION_TYPE.BuiltinUnary); String2SPInstructionType.put( "round" , SPINSTRUCTION_TYPE.BuiltinUnary); String2SPInstructionType.put( "ceil" , SPINSTRUCTION_TYPE.BuiltinUnary); String2SPInstructionType.put( "floor" , SPINSTRUCTION_TYPE.BuiltinUnary); String2SPInstructionType.put( "sprop", SPINSTRUCTION_TYPE.BuiltinUnary); String2SPInstructionType.put( "sigmoid", SPINSTRUCTION_TYPE.BuiltinUnary); String2SPInstructionType.put( "sel+", SPINSTRUCTION_TYPE.BuiltinUnary); // Parameterized Builtin Functions String2SPInstructionType.put( "groupedagg" , SPINSTRUCTION_TYPE.ParameterizedBuiltin); String2SPInstructionType.put( "mapgroupedagg", SPINSTRUCTION_TYPE.ParameterizedBuiltin); String2SPInstructionType.put( "rmempty" , SPINSTRUCTION_TYPE.ParameterizedBuiltin); String2SPInstructionType.put( "replace" , SPINSTRUCTION_TYPE.ParameterizedBuiltin); String2SPInstructionType.put( "rexpand" , SPINSTRUCTION_TYPE.ParameterizedBuiltin); String2SPInstructionType.put( "transform" , SPINSTRUCTION_TYPE.ParameterizedBuiltin); String2SPInstructionType.put( "transformapply",SPINSTRUCTION_TYPE.ParameterizedBuiltin); String2SPInstructionType.put( "transformdecode",SPINSTRUCTION_TYPE.ParameterizedBuiltin); String2SPInstructionType.put( "transformencode",SPINSTRUCTION_TYPE.MultiReturnBuiltin); String2SPInstructionType.put( "mappend", SPINSTRUCTION_TYPE.MAppend); String2SPInstructionType.put( "rappend", SPINSTRUCTION_TYPE.RAppend); String2SPInstructionType.put( "gappend", SPINSTRUCTION_TYPE.GAppend); String2SPInstructionType.put( "galignedappend", SPINSTRUCTION_TYPE.GAlignedAppend); String2SPInstructionType.put( DataGen.RAND_OPCODE , SPINSTRUCTION_TYPE.Rand); String2SPInstructionType.put( DataGen.SEQ_OPCODE , SPINSTRUCTION_TYPE.Rand); String2SPInstructionType.put( DataGen.SAMPLE_OPCODE, SPINSTRUCTION_TYPE.Rand); //ternary instruction opcodes String2SPInstructionType.put( "ctable", SPINSTRUCTION_TYPE.Ternary); String2SPInstructionType.put( "ctableexpand", SPINSTRUCTION_TYPE.Ternary); //quaternary instruction opcodes String2SPInstructionType.put( WeightedSquaredLoss.OPCODE, SPINSTRUCTION_TYPE.Quaternary); String2SPInstructionType.put( WeightedSquaredLossR.OPCODE, SPINSTRUCTION_TYPE.Quaternary); String2SPInstructionType.put( WeightedSigmoid.OPCODE, SPINSTRUCTION_TYPE.Quaternary); String2SPInstructionType.put( WeightedSigmoidR.OPCODE, SPINSTRUCTION_TYPE.Quaternary); String2SPInstructionType.put( WeightedDivMM.OPCODE, SPINSTRUCTION_TYPE.Quaternary); String2SPInstructionType.put( WeightedDivMMR.OPCODE, SPINSTRUCTION_TYPE.Quaternary); String2SPInstructionType.put( WeightedCrossEntropy.OPCODE, SPINSTRUCTION_TYPE.Quaternary); String2SPInstructionType.put( WeightedCrossEntropyR.OPCODE,SPINSTRUCTION_TYPE.Quaternary); String2SPInstructionType.put( WeightedUnaryMM.OPCODE, SPINSTRUCTION_TYPE.Quaternary); String2SPInstructionType.put( WeightedUnaryMMR.OPCODE, SPINSTRUCTION_TYPE.Quaternary); //cumsum/cumprod/cummin/cummax String2SPInstructionType.put( "ucumack+" , SPINSTRUCTION_TYPE.CumsumAggregate); String2SPInstructionType.put( "ucumac*" , SPINSTRUCTION_TYPE.CumsumAggregate); String2SPInstructionType.put( "ucumacmin" , SPINSTRUCTION_TYPE.CumsumAggregate); String2SPInstructionType.put( "ucumacmax" , SPINSTRUCTION_TYPE.CumsumAggregate); String2SPInstructionType.put( "bcumoffk+" , SPINSTRUCTION_TYPE.CumsumOffset); String2SPInstructionType.put( "bcumoff*" , SPINSTRUCTION_TYPE.CumsumOffset); String2SPInstructionType.put( "bcumoffmin", SPINSTRUCTION_TYPE.CumsumOffset); String2SPInstructionType.put( "bcumoffmax", SPINSTRUCTION_TYPE.CumsumOffset); //central moment, covariance, quantiles (sort/pick) String2SPInstructionType.put( "cm" , SPINSTRUCTION_TYPE.CentralMoment); String2SPInstructionType.put( "cov" , SPINSTRUCTION_TYPE.Covariance); String2SPInstructionType.put( "qsort" , SPINSTRUCTION_TYPE.QSort); String2SPInstructionType.put( "qpick" , SPINSTRUCTION_TYPE.QPick); String2SPInstructionType.put( "binuaggchain", SPINSTRUCTION_TYPE.BinUaggChain); String2SPInstructionType.put( "write" , SPINSTRUCTION_TYPE.Write); String2SPInstructionType.put( "castdtm" , SPINSTRUCTION_TYPE.Cast); String2SPInstructionType.put( "castdtf" , SPINSTRUCTION_TYPE.Cast); String2SPInstructionType.put( "spoof" , SPINSTRUCTION_TYPE.SpoofFused); } public static SPInstruction parseSingleInstruction (String str ) throws DMLRuntimeException { if ( str == null || str.isEmpty() ) return null; SPINSTRUCTION_TYPE cptype = InstructionUtils.getSPType(str); if ( cptype == null ) // return null; throw new DMLRuntimeException("Invalid SP Instruction Type: " + str); SPInstruction spinst = parseSingleInstruction(cptype, str); if ( spinst == null ) throw new DMLRuntimeException("Unable to parse instruction: " + str); return spinst; } public static SPInstruction parseSingleInstruction ( SPINSTRUCTION_TYPE sptype, String str ) throws DMLRuntimeException { if ( str == null || str.isEmpty() ) return null; String [] parts = null; switch(sptype) { // matrix multiplication instructions case CPMM: return CpmmSPInstruction.parseInstruction(str); case RMM: return RmmSPInstruction.parseInstruction(str); case MAPMM: return MapmmSPInstruction.parseInstruction(str); case MAPMMCHAIN: return MapmmChainSPInstruction.parseInstruction(str); case TSMM: return TsmmSPInstruction.parseInstruction(str); case TSMM2: return Tsmm2SPInstruction.parseInstruction(str); case PMM: return PmmSPInstruction.parseInstruction(str); case ZIPMM: return ZipmmSPInstruction.parseInstruction(str); case PMAPMM: return PMapmmSPInstruction.parseInstruction(str); case UaggOuterChain: return UaggOuterChainSPInstruction.parseInstruction(str); case AggregateUnary: return AggregateUnarySPInstruction.parseInstruction(str); case AggregateTernary: return AggregateTernarySPInstruction.parseInstruction(str); case Convolution: return ConvolutionSPInstruction.parseInstruction(str); case MatrixIndexing: return IndexingSPInstruction.parseInstruction(str); case Reorg: return ReorgSPInstruction.parseInstruction(str); case ArithmeticBinary: String opcode = InstructionUtils.getOpCode(str); if( opcode.equals("+*") || opcode.equals("-*") ) return PlusMultSPInstruction.parseInstruction(str); else return ArithmeticBinarySPInstruction.parseInstruction(str); case RelationalBinary: return RelationalBinarySPInstruction.parseInstruction(str); //ternary instructions case Ternary: return TernarySPInstruction.parseInstruction(str); //quaternary instructions case Quaternary: return QuaternarySPInstruction.parseInstruction(str); // Reblock instructions case Reblock: return ReblockSPInstruction.parseInstruction(str); case CSVReblock: return CSVReblockSPInstruction.parseInstruction(str); case Builtin: parts = InstructionUtils.getInstructionPartsWithValueType(str); if ( parts[0].equals("log") || parts[0].equals("log_nz") ) { if ( parts.length == 3 ) { // B=log(A), y=log(x) return BuiltinUnarySPInstruction.parseInstruction(str); } else if ( parts.length == 4 ) { // B=log(A,10), y=log(x,10) return BuiltinBinarySPInstruction.parseInstruction(str); } } else { throw new DMLRuntimeException("Invalid Builtin Instruction: " + str ); } case BuiltinBinary: return BuiltinBinarySPInstruction.parseInstruction(str); case BuiltinUnary: return BuiltinUnarySPInstruction.parseInstruction(str); case ParameterizedBuiltin: return ParameterizedBuiltinSPInstruction.parseInstruction(str); case MultiReturnBuiltin: return MultiReturnParameterizedBuiltinSPInstruction.parseInstruction(str); case MatrixReshape: return MatrixReshapeSPInstruction.parseInstruction(str); case MAppend: //matrix/frame return AppendMSPInstruction.parseInstruction(str); case RAppend: //matrix/frame return AppendRSPInstruction.parseInstruction(str); case GAppend: return AppendGSPInstruction.parseInstruction(str); case GAlignedAppend: return AppendGAlignedSPInstruction.parseInstruction(str); case Rand: return RandSPInstruction.parseInstruction(str); case QSort: return QuantileSortSPInstruction.parseInstruction(str); case QPick: return QuantilePickSPInstruction.parseInstruction(str); case Write: return WriteSPInstruction.parseInstruction(str); case CumsumAggregate: return CumulativeAggregateSPInstruction.parseInstruction(str); case CumsumOffset: return CumulativeOffsetSPInstruction.parseInstruction(str); case CentralMoment: return CentralMomentSPInstruction.parseInstruction(str); case Covariance: return CovarianceSPInstruction.parseInstruction(str); case BinUaggChain: return BinUaggChainSPInstruction.parseInstruction(str); case Checkpoint: return CheckpointSPInstruction.parseInstruction(str); case Compression: return CompressionSPInstruction.parseInstruction(str); case SpoofFused: return SpoofSPInstruction.parseInstruction(str); case Cast: return CastSPInstruction.parseInstruction(str); case INVALID: default: throw new DMLRuntimeException("Invalid SP Instruction Type: " + sptype ); } } }