/* * 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.AppendCP; import org.apache.sysml.lops.DataGen; import org.apache.sysml.lops.LopProperties.ExecType; import org.apache.sysml.lops.UnaryCP; import org.apache.sysml.runtime.DMLRuntimeException; import org.apache.sysml.runtime.instructions.cp.AggregateBinaryCPInstruction; import org.apache.sysml.runtime.instructions.cp.AggregateTernaryCPInstruction; import org.apache.sysml.runtime.instructions.cp.AggregateUnaryCPInstruction; import org.apache.sysml.runtime.instructions.cp.AppendCPInstruction; import org.apache.sysml.runtime.instructions.cp.ArithmeticBinaryCPInstruction; import org.apache.sysml.runtime.instructions.cp.BooleanBinaryCPInstruction; import org.apache.sysml.runtime.instructions.cp.BooleanUnaryCPInstruction; import org.apache.sysml.runtime.instructions.cp.BuiltinBinaryCPInstruction; import org.apache.sysml.runtime.instructions.cp.BuiltinMultipleCPInstruction; import org.apache.sysml.runtime.instructions.cp.BuiltinUnaryCPInstruction; import org.apache.sysml.runtime.instructions.cp.CPInstruction; import org.apache.sysml.runtime.instructions.cp.CPInstruction.CPINSTRUCTION_TYPE; import org.apache.sysml.runtime.instructions.cp.CentralMomentCPInstruction; import org.apache.sysml.runtime.instructions.cp.CompressionCPInstruction; import org.apache.sysml.runtime.instructions.cp.ConvolutionCPInstruction; import org.apache.sysml.runtime.instructions.cp.CovarianceCPInstruction; import org.apache.sysml.runtime.instructions.cp.DataGenCPInstruction; import org.apache.sysml.runtime.instructions.cp.DataPartitionCPInstruction; import org.apache.sysml.runtime.instructions.cp.FileCPInstruction; import org.apache.sysml.runtime.instructions.cp.FunctionCallCPInstruction; import org.apache.sysml.runtime.instructions.cp.IndexingCPInstruction; import org.apache.sysml.runtime.instructions.cp.MMChainCPInstruction; import org.apache.sysml.runtime.instructions.cp.MMTSJCPInstruction; import org.apache.sysml.runtime.instructions.cp.MatrixReshapeCPInstruction; import org.apache.sysml.runtime.instructions.cp.MultiReturnBuiltinCPInstruction; import org.apache.sysml.runtime.instructions.cp.MultiReturnParameterizedBuiltinCPInstruction; import org.apache.sysml.runtime.instructions.cp.PMMJCPInstruction; import org.apache.sysml.runtime.instructions.cp.ParameterizedBuiltinCPInstruction; import org.apache.sysml.runtime.instructions.cp.PlusMultCPInstruction; import org.apache.sysml.runtime.instructions.cp.QuantilePickCPInstruction; import org.apache.sysml.runtime.instructions.cp.QuantileSortCPInstruction; import org.apache.sysml.runtime.instructions.cp.QuaternaryCPInstruction; import org.apache.sysml.runtime.instructions.cp.RelationalBinaryCPInstruction; import org.apache.sysml.runtime.instructions.cp.ReorgCPInstruction; import org.apache.sysml.runtime.instructions.cp.SpoofCPInstruction; import org.apache.sysml.runtime.instructions.cp.StringInitCPInstruction; import org.apache.sysml.runtime.instructions.cp.TernaryCPInstruction; import org.apache.sysml.runtime.instructions.cp.UaggOuterChainCPInstruction; import org.apache.sysml.runtime.instructions.cp.VariableCPInstruction; import org.apache.sysml.runtime.instructions.cpfile.MatrixIndexingCPFileInstruction; import org.apache.sysml.runtime.instructions.cpfile.ParameterizedBuiltinCPFileInstruction; public class CPInstructionParser extends InstructionParser { public static final HashMap<String, CPINSTRUCTION_TYPE> String2CPInstructionType; public static final HashMap<String, CPINSTRUCTION_TYPE> String2CPFileInstructionType; static { String2CPInstructionType = new HashMap<String, CPINSTRUCTION_TYPE>(); String2CPInstructionType.put( "ba+*" , CPINSTRUCTION_TYPE.AggregateBinary); String2CPInstructionType.put( "tak+*" , CPINSTRUCTION_TYPE.AggregateTernary); String2CPInstructionType.put( "tack+*" , CPINSTRUCTION_TYPE.AggregateTernary); String2CPInstructionType.put( "uak+" , CPINSTRUCTION_TYPE.AggregateUnary); String2CPInstructionType.put( "uark+" , CPINSTRUCTION_TYPE.AggregateUnary); String2CPInstructionType.put( "uack+" , CPINSTRUCTION_TYPE.AggregateUnary); String2CPInstructionType.put( "uasqk+" , CPINSTRUCTION_TYPE.AggregateUnary); String2CPInstructionType.put( "uarsqk+" , CPINSTRUCTION_TYPE.AggregateUnary); String2CPInstructionType.put( "uacsqk+" , CPINSTRUCTION_TYPE.AggregateUnary); String2CPInstructionType.put( "uamean" , CPINSTRUCTION_TYPE.AggregateUnary); String2CPInstructionType.put( "uarmean" , CPINSTRUCTION_TYPE.AggregateUnary); String2CPInstructionType.put( "uacmean" , CPINSTRUCTION_TYPE.AggregateUnary); String2CPInstructionType.put( "uavar" , CPINSTRUCTION_TYPE.AggregateUnary); String2CPInstructionType.put( "uarvar" , CPINSTRUCTION_TYPE.AggregateUnary); String2CPInstructionType.put( "uacvar" , CPINSTRUCTION_TYPE.AggregateUnary); String2CPInstructionType.put( "uamax" , CPINSTRUCTION_TYPE.AggregateUnary); String2CPInstructionType.put( "uarmax" , CPINSTRUCTION_TYPE.AggregateUnary); String2CPInstructionType.put( "uarimax", CPINSTRUCTION_TYPE.AggregateUnary); String2CPInstructionType.put( "uacmax" , CPINSTRUCTION_TYPE.AggregateUnary); String2CPInstructionType.put( "uamin" , CPINSTRUCTION_TYPE.AggregateUnary); String2CPInstructionType.put( "uarmin" , CPINSTRUCTION_TYPE.AggregateUnary); String2CPInstructionType.put( "uarimin" , CPINSTRUCTION_TYPE.AggregateUnary); String2CPInstructionType.put( "uacmin" , CPINSTRUCTION_TYPE.AggregateUnary); String2CPInstructionType.put( "ua+" , CPINSTRUCTION_TYPE.AggregateUnary); String2CPInstructionType.put( "uar+" , CPINSTRUCTION_TYPE.AggregateUnary); String2CPInstructionType.put( "uac+" , CPINSTRUCTION_TYPE.AggregateUnary); String2CPInstructionType.put( "ua*" , CPINSTRUCTION_TYPE.AggregateUnary); String2CPInstructionType.put( "uatrace" , CPINSTRUCTION_TYPE.AggregateUnary); String2CPInstructionType.put( "uaktrace", CPINSTRUCTION_TYPE.AggregateUnary); String2CPInstructionType.put( "nrow" ,CPINSTRUCTION_TYPE.AggregateUnary); String2CPInstructionType.put( "ncol" ,CPINSTRUCTION_TYPE.AggregateUnary); String2CPInstructionType.put( "length" ,CPINSTRUCTION_TYPE.AggregateUnary); String2CPInstructionType.put( "uaggouterchain", CPINSTRUCTION_TYPE.UaggOuterChain); // Arithmetic Instruction Opcodes String2CPInstructionType.put( "+" , CPINSTRUCTION_TYPE.ArithmeticBinary); String2CPInstructionType.put( "-" , CPINSTRUCTION_TYPE.ArithmeticBinary); String2CPInstructionType.put( "*" , CPINSTRUCTION_TYPE.ArithmeticBinary); String2CPInstructionType.put( "/" , CPINSTRUCTION_TYPE.ArithmeticBinary); String2CPInstructionType.put( "%%" , CPINSTRUCTION_TYPE.ArithmeticBinary); String2CPInstructionType.put( "%/%" , CPINSTRUCTION_TYPE.ArithmeticBinary); String2CPInstructionType.put( "^" , CPINSTRUCTION_TYPE.ArithmeticBinary); String2CPInstructionType.put( "1-*" , CPINSTRUCTION_TYPE.ArithmeticBinary); //special * case String2CPInstructionType.put( "^2" , CPINSTRUCTION_TYPE.ArithmeticBinary); //special ^ case String2CPInstructionType.put( "*2" , CPINSTRUCTION_TYPE.ArithmeticBinary); //special * case String2CPInstructionType.put( "-nz" , CPINSTRUCTION_TYPE.ArithmeticBinary); //special - case String2CPInstructionType.put( "+*" , CPINSTRUCTION_TYPE.ArithmeticBinary); String2CPInstructionType.put( "-*" , CPINSTRUCTION_TYPE.ArithmeticBinary); // Boolean Instruction Opcodes String2CPInstructionType.put( "&&" , CPINSTRUCTION_TYPE.BooleanBinary); String2CPInstructionType.put( "||" , CPINSTRUCTION_TYPE.BooleanBinary); String2CPInstructionType.put( "!" , CPINSTRUCTION_TYPE.BooleanUnary); // Relational Instruction Opcodes String2CPInstructionType.put( "==" , CPINSTRUCTION_TYPE.RelationalBinary); String2CPInstructionType.put( "!=" , CPINSTRUCTION_TYPE.RelationalBinary); String2CPInstructionType.put( "<" , CPINSTRUCTION_TYPE.RelationalBinary); String2CPInstructionType.put( ">" , CPINSTRUCTION_TYPE.RelationalBinary); String2CPInstructionType.put( "<=" , CPINSTRUCTION_TYPE.RelationalBinary); String2CPInstructionType.put( ">=" , CPINSTRUCTION_TYPE.RelationalBinary); // File Instruction Opcodes String2CPInstructionType.put( "rm" , CPINSTRUCTION_TYPE.File); String2CPInstructionType.put( "mv" , CPINSTRUCTION_TYPE.File); // Builtin Instruction Opcodes String2CPInstructionType.put( "log" , CPINSTRUCTION_TYPE.Builtin); String2CPInstructionType.put( "log_nz" , CPINSTRUCTION_TYPE.Builtin); String2CPInstructionType.put( "max" , CPINSTRUCTION_TYPE.BuiltinBinary); String2CPInstructionType.put( "min" , CPINSTRUCTION_TYPE.BuiltinBinary); String2CPInstructionType.put( "solve" , CPINSTRUCTION_TYPE.BuiltinBinary); String2CPInstructionType.put( "exp" , CPINSTRUCTION_TYPE.BuiltinUnary); String2CPInstructionType.put( "abs" , CPINSTRUCTION_TYPE.BuiltinUnary); String2CPInstructionType.put( "sin" , CPINSTRUCTION_TYPE.BuiltinUnary); String2CPInstructionType.put( "cos" , CPINSTRUCTION_TYPE.BuiltinUnary); String2CPInstructionType.put( "tan" , CPINSTRUCTION_TYPE.BuiltinUnary); String2CPInstructionType.put( "asin" , CPINSTRUCTION_TYPE.BuiltinUnary); String2CPInstructionType.put( "acos" , CPINSTRUCTION_TYPE.BuiltinUnary); String2CPInstructionType.put( "atan" , CPINSTRUCTION_TYPE.BuiltinUnary); String2CPInstructionType.put( "sign" , CPINSTRUCTION_TYPE.BuiltinUnary); String2CPInstructionType.put( "sqrt" , CPINSTRUCTION_TYPE.BuiltinUnary); String2CPInstructionType.put( "plogp" , CPINSTRUCTION_TYPE.BuiltinUnary); String2CPInstructionType.put( "print" , CPINSTRUCTION_TYPE.BuiltinUnary); String2CPInstructionType.put( "round" , CPINSTRUCTION_TYPE.BuiltinUnary); String2CPInstructionType.put( "ceil" , CPINSTRUCTION_TYPE.BuiltinUnary); String2CPInstructionType.put( "floor" , CPINSTRUCTION_TYPE.BuiltinUnary); String2CPInstructionType.put( "ucumk+", CPINSTRUCTION_TYPE.BuiltinUnary); String2CPInstructionType.put( "ucum*" , CPINSTRUCTION_TYPE.BuiltinUnary); String2CPInstructionType.put( "ucummin", CPINSTRUCTION_TYPE.BuiltinUnary); String2CPInstructionType.put( "ucummax", CPINSTRUCTION_TYPE.BuiltinUnary); String2CPInstructionType.put( "stop" , CPINSTRUCTION_TYPE.BuiltinUnary); String2CPInstructionType.put( "inverse", CPINSTRUCTION_TYPE.BuiltinUnary); String2CPInstructionType.put( "cholesky",CPINSTRUCTION_TYPE.BuiltinUnary); String2CPInstructionType.put( "sprop", CPINSTRUCTION_TYPE.BuiltinUnary); String2CPInstructionType.put( "sigmoid", CPINSTRUCTION_TYPE.BuiltinUnary); String2CPInstructionType.put( "sel+", CPINSTRUCTION_TYPE.BuiltinUnary); String2CPInstructionType.put( "printf" , CPINSTRUCTION_TYPE.BuiltinMultiple); // Parameterized Builtin Functions String2CPInstructionType.put( "cdf" , CPINSTRUCTION_TYPE.ParameterizedBuiltin); String2CPInstructionType.put( "invcdf" , CPINSTRUCTION_TYPE.ParameterizedBuiltin); String2CPInstructionType.put( "groupedagg" , CPINSTRUCTION_TYPE.ParameterizedBuiltin); String2CPInstructionType.put( "rmempty" , CPINSTRUCTION_TYPE.ParameterizedBuiltin); String2CPInstructionType.put( "replace" , CPINSTRUCTION_TYPE.ParameterizedBuiltin); String2CPInstructionType.put( "rexpand" , CPINSTRUCTION_TYPE.ParameterizedBuiltin); String2CPInstructionType.put( "transform" , CPINSTRUCTION_TYPE.ParameterizedBuiltin); String2CPInstructionType.put( "transformapply",CPINSTRUCTION_TYPE.ParameterizedBuiltin); String2CPInstructionType.put( "transformdecode",CPINSTRUCTION_TYPE.ParameterizedBuiltin); String2CPInstructionType.put( "transformencode",CPINSTRUCTION_TYPE.MultiReturnParameterizedBuiltin); String2CPInstructionType.put( "transformmeta",CPINSTRUCTION_TYPE.ParameterizedBuiltin); String2CPInstructionType.put( "toString" , CPINSTRUCTION_TYPE.ParameterizedBuiltin); // Variable Instruction Opcodes String2CPInstructionType.put( "assignvar" , CPINSTRUCTION_TYPE.Variable); String2CPInstructionType.put( "cpvar" , CPINSTRUCTION_TYPE.Variable); String2CPInstructionType.put( "mvvar" , CPINSTRUCTION_TYPE.Variable); String2CPInstructionType.put( "rmvar" , CPINSTRUCTION_TYPE.Variable); String2CPInstructionType.put( "rmfilevar" , CPINSTRUCTION_TYPE.Variable); String2CPInstructionType.put( UnaryCP.CAST_AS_SCALAR_OPCODE, CPINSTRUCTION_TYPE.Variable); String2CPInstructionType.put( UnaryCP.CAST_AS_MATRIX_OPCODE, CPINSTRUCTION_TYPE.Variable); String2CPInstructionType.put( UnaryCP.CAST_AS_FRAME_OPCODE, CPINSTRUCTION_TYPE.Variable); String2CPInstructionType.put( UnaryCP.CAST_AS_DOUBLE_OPCODE, CPINSTRUCTION_TYPE.Variable); String2CPInstructionType.put( UnaryCP.CAST_AS_INT_OPCODE, CPINSTRUCTION_TYPE.Variable); String2CPInstructionType.put( UnaryCP.CAST_AS_BOOLEAN_OPCODE, CPINSTRUCTION_TYPE.Variable); String2CPInstructionType.put( "attachfiletovar" , CPINSTRUCTION_TYPE.Variable); String2CPInstructionType.put( "read" , CPINSTRUCTION_TYPE.Variable); String2CPInstructionType.put( "write" , CPINSTRUCTION_TYPE.Variable); String2CPInstructionType.put( "createvar" , CPINSTRUCTION_TYPE.Variable); // Reorg Instruction Opcodes (repositioning of existing values) String2CPInstructionType.put( "r'" , CPINSTRUCTION_TYPE.Reorg); String2CPInstructionType.put( "rev" , CPINSTRUCTION_TYPE.Reorg); String2CPInstructionType.put( "rdiag" , CPINSTRUCTION_TYPE.Reorg); String2CPInstructionType.put( "rshape" , CPINSTRUCTION_TYPE.MatrixReshape); String2CPInstructionType.put( "rsort" , CPINSTRUCTION_TYPE.Reorg); // Opcodes related to convolutions String2CPInstructionType.put( "relu_backward" , CPINSTRUCTION_TYPE.Convolution); String2CPInstructionType.put( "relu_maxpooling" , CPINSTRUCTION_TYPE.Convolution); String2CPInstructionType.put( "relu_maxpooling_backward" , CPINSTRUCTION_TYPE.Convolution); String2CPInstructionType.put( "maxpooling" , CPINSTRUCTION_TYPE.Convolution); String2CPInstructionType.put( "maxpooling_backward" , CPINSTRUCTION_TYPE.Convolution); String2CPInstructionType.put( "conv2d" , CPINSTRUCTION_TYPE.Convolution); String2CPInstructionType.put( "conv2d_bias_add" , CPINSTRUCTION_TYPE.Convolution); String2CPInstructionType.put( "conv2d_backward_filter" , CPINSTRUCTION_TYPE.Convolution); String2CPInstructionType.put( "conv2d_backward_data" , CPINSTRUCTION_TYPE.Convolution); String2CPInstructionType.put( "bias_add" , CPINSTRUCTION_TYPE.Convolution); String2CPInstructionType.put( "bias_multiply" , CPINSTRUCTION_TYPE.Convolution); // Quaternary instruction opcodes String2CPInstructionType.put( "wsloss" , CPINSTRUCTION_TYPE.Quaternary); String2CPInstructionType.put( "wsigmoid", CPINSTRUCTION_TYPE.Quaternary); String2CPInstructionType.put( "wdivmm" , CPINSTRUCTION_TYPE.Quaternary); String2CPInstructionType.put( "wcemm" , CPINSTRUCTION_TYPE.Quaternary); String2CPInstructionType.put( "wumm" , CPINSTRUCTION_TYPE.Quaternary); // User-defined function Opcodes String2CPInstructionType.put( "extfunct" , CPINSTRUCTION_TYPE.External); String2CPInstructionType.put( AppendCP.OPCODE, CPINSTRUCTION_TYPE.Append); // data generation opcodes String2CPInstructionType.put( DataGen.RAND_OPCODE , CPINSTRUCTION_TYPE.Rand); String2CPInstructionType.put( DataGen.SEQ_OPCODE , CPINSTRUCTION_TYPE.Rand); String2CPInstructionType.put( DataGen.SINIT_OPCODE , CPINSTRUCTION_TYPE.StringInit); String2CPInstructionType.put( DataGen.SAMPLE_OPCODE , CPINSTRUCTION_TYPE.Rand); String2CPInstructionType.put( "ctable", CPINSTRUCTION_TYPE.Ternary); String2CPInstructionType.put( "ctableexpand", CPINSTRUCTION_TYPE.Ternary); //central moment, covariance, quantiles (sort/pick) String2CPInstructionType.put( "cm" , CPINSTRUCTION_TYPE.CentralMoment); String2CPInstructionType.put( "cov" , CPINSTRUCTION_TYPE.Covariance); String2CPInstructionType.put( "qsort" , CPINSTRUCTION_TYPE.QSort); String2CPInstructionType.put( "qpick" , CPINSTRUCTION_TYPE.QPick); String2CPInstructionType.put( "rangeReIndex", CPINSTRUCTION_TYPE.MatrixIndexing); String2CPInstructionType.put( "leftIndex" , CPINSTRUCTION_TYPE.MatrixIndexing); String2CPInstructionType.put( "tsmm" , CPINSTRUCTION_TYPE.MMTSJ); String2CPInstructionType.put( "pmm" , CPINSTRUCTION_TYPE.PMMJ); String2CPInstructionType.put( "mmchain" , CPINSTRUCTION_TYPE.MMChain); String2CPInstructionType.put( "qr", CPINSTRUCTION_TYPE.MultiReturnBuiltin); String2CPInstructionType.put( "lu", CPINSTRUCTION_TYPE.MultiReturnBuiltin); String2CPInstructionType.put( "eigen", CPINSTRUCTION_TYPE.MultiReturnBuiltin); String2CPInstructionType.put( "partition", CPINSTRUCTION_TYPE.Partition); String2CPInstructionType.put( "compress", CPINSTRUCTION_TYPE.Compression); String2CPInstructionType.put( "spoof", CPINSTRUCTION_TYPE.SpoofFused); //CP FILE instruction String2CPFileInstructionType = new HashMap<String, CPINSTRUCTION_TYPE>(); String2CPFileInstructionType.put( "rmempty" , CPINSTRUCTION_TYPE.ParameterizedBuiltin); } public static CPInstruction parseSingleInstruction (String str ) throws DMLRuntimeException { if ( str == null || str.isEmpty() ) return null; CPINSTRUCTION_TYPE cptype = InstructionUtils.getCPType(str); if ( cptype == null ) throw new DMLRuntimeException("Unable derive cptype for instruction: " + str); CPInstruction cpinst = parseSingleInstruction(cptype, str); if ( cpinst == null ) throw new DMLRuntimeException("Unable to parse instruction: " + str); return cpinst; } public static CPInstruction parseSingleInstruction ( CPINSTRUCTION_TYPE cptype, String str ) throws DMLRuntimeException { ExecType execType = null; if ( str == null || str.isEmpty() ) return null; switch(cptype) { case AggregateUnary: return AggregateUnaryCPInstruction.parseInstruction(str); case AggregateBinary: return AggregateBinaryCPInstruction.parseInstruction(str); case AggregateTernary: return AggregateTernaryCPInstruction.parseInstruction(str); case ArithmeticBinary: String opcode = InstructionUtils.getOpCode(str); if( opcode.equals("+*") || opcode.equals("-*") ) return PlusMultCPInstruction.parseInstruction(str); else return ArithmeticBinaryCPInstruction.parseInstruction(str); case Ternary: return TernaryCPInstruction.parseInstruction(str); case Quaternary: return QuaternaryCPInstruction.parseInstruction(str); case BooleanBinary: return BooleanBinaryCPInstruction.parseInstruction(str); case BooleanUnary: return BooleanUnaryCPInstruction.parseInstruction(str); case BuiltinBinary: return BuiltinBinaryCPInstruction.parseInstruction(str); case BuiltinUnary: return BuiltinUnaryCPInstruction.parseInstruction(str); case BuiltinMultiple: return BuiltinMultipleCPInstruction.parseInstruction(str); case Reorg: return ReorgCPInstruction.parseInstruction(str); case Convolution: return ConvolutionCPInstruction.parseInstruction(str); case UaggOuterChain: return UaggOuterChainCPInstruction.parseInstruction(str); case MatrixReshape: return MatrixReshapeCPInstruction.parseInstruction(str); case Append: return AppendCPInstruction.parseInstruction(str); case RelationalBinary: return RelationalBinaryCPInstruction.parseInstruction(str); case File: return FileCPInstruction.parseInstruction(str); case Variable: return VariableCPInstruction.parseInstruction(str); case Rand: return DataGenCPInstruction.parseInstruction(str); case StringInit: return StringInitCPInstruction.parseInstruction(str); case External: return FunctionCallCPInstruction.parseInstruction(str); case ParameterizedBuiltin: execType = ExecType.valueOf( str.split(Instruction.OPERAND_DELIM)[0] ); if( execType == ExecType.CP ) return ParameterizedBuiltinCPInstruction.parseInstruction(str); else //exectype CP_FILE return ParameterizedBuiltinCPFileInstruction.parseInstruction(str); case MultiReturnParameterizedBuiltin: return MultiReturnParameterizedBuiltinCPInstruction.parseInstruction(str); case MultiReturnBuiltin: return MultiReturnBuiltinCPInstruction.parseInstruction(str); case QSort: return QuantileSortCPInstruction.parseInstruction(str); case QPick: return QuantilePickCPInstruction.parseInstruction(str); case MatrixIndexing: execType = ExecType.valueOf( str.split(Instruction.OPERAND_DELIM)[0] ); if( execType == ExecType.CP ) return IndexingCPInstruction.parseInstruction(str); else //exectype CP_FILE return MatrixIndexingCPFileInstruction.parseInstruction(str); case Builtin: String []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 BuiltinUnaryCPInstruction.parseInstruction(str); } else if ( parts.length == 4 ) { // B=log(A,10), y=log(x,10) return BuiltinBinaryCPInstruction.parseInstruction(str); } } else { throw new DMLRuntimeException("Invalid Builtin Instruction: " + str ); } case MMTSJ: return MMTSJCPInstruction.parseInstruction(str); case PMMJ: return PMMJCPInstruction.parseInstruction(str); case MMChain: return MMChainCPInstruction.parseInstruction(str); case Partition: return DataPartitionCPInstruction.parseInstruction(str); case CentralMoment: return CentralMomentCPInstruction.parseInstruction(str); case Covariance: return CovarianceCPInstruction.parseInstruction(str); case Compression: return (CPInstruction) CompressionCPInstruction.parseInstruction(str); case SpoofFused: return SpoofCPInstruction.parseInstruction(str); case INVALID: default: throw new DMLRuntimeException("Invalid CP Instruction Type: " + cptype ); } } }