/* * 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.spark; import org.apache.sysml.hops.AggBinaryOp.SparkAggType; import org.apache.sysml.lops.LeftIndex.LixCacheType; import org.apache.sysml.parser.Expression.DataType; import org.apache.sysml.runtime.DMLRuntimeException; import org.apache.sysml.runtime.instructions.InstructionUtils; import org.apache.sysml.runtime.instructions.cp.CPOperand; import org.apache.sysml.runtime.matrix.operators.Operator; import org.apache.sysml.runtime.matrix.operators.SimpleOperator; public abstract class IndexingSPInstruction extends UnarySPInstruction { /* * This class implements the matrix indexing functionality inside Spark. * Example instructions: * rangeReIndex:mVar1:Var2:Var3:Var4:Var5:mVar6 * input=mVar1, output=mVar6, * bounds = (Var2,Var3,Var4,Var5) * rowindex_lower: Var2, rowindex_upper: Var3 * colindex_lower: Var4, colindex_upper: Var5 * leftIndex:mVar1:mVar2:Var3:Var4:Var5:Var6:mVar7 * triggered by "mVar1[Var3:Var4, Var5:Var6] = mVar2" * the result is stored in mVar7 * */ protected CPOperand rowLower, rowUpper, colLower, colUpper; protected SparkAggType _aggType = null; public IndexingSPInstruction(Operator op, CPOperand in, CPOperand rl, CPOperand ru, CPOperand cl, CPOperand cu, CPOperand out, SparkAggType aggtype, String opcode, String istr) { super(op, in, out, opcode, istr); rowLower = rl; rowUpper = ru; colLower = cl; colUpper = cu; _aggType = aggtype; } public IndexingSPInstruction(Operator op, CPOperand lhsInput, CPOperand rhsInput, CPOperand rl, CPOperand ru, CPOperand cl, CPOperand cu, CPOperand out, String opcode, String istr) { super(op, lhsInput, rhsInput, out, opcode, istr); rowLower = rl; rowUpper = ru; colLower = cl; colUpper = cu; } public static IndexingSPInstruction parseInstruction ( String str ) throws DMLRuntimeException { String[] parts = InstructionUtils.getInstructionPartsWithValueType(str); String opcode = parts[0]; if ( opcode.equalsIgnoreCase("rangeReIndex") ) { if ( parts.length == 8 ) { // Example: rangeReIndex:mVar1:Var2:Var3:Var4:Var5:mVar6 CPOperand in = new CPOperand(parts[1]); CPOperand rl = new CPOperand(parts[2]); CPOperand ru = new CPOperand(parts[3]); CPOperand cl = new CPOperand(parts[4]); CPOperand cu = new CPOperand(parts[5]); CPOperand out = new CPOperand(parts[6]); SparkAggType aggtype = SparkAggType.valueOf(parts[7]); if( in.getDataType()==DataType.MATRIX ) return new MatrixIndexingSPInstruction(new SimpleOperator(null), in, rl, ru, cl, cu, out, aggtype, opcode, str); else return new FrameIndexingSPInstruction(new SimpleOperator(null), in, rl, ru, cl, cu, out, aggtype, opcode, str); } else { throw new DMLRuntimeException("Invalid number of operands in instruction: " + str); } } else if ( opcode.equalsIgnoreCase("leftIndex") || opcode.equalsIgnoreCase("mapLeftIndex")) { if ( parts.length == 9 ) { // Example: leftIndex:mVar1:mvar2:Var3:Var4:Var5:Var6:mVar7 CPOperand lhsInput = new CPOperand(parts[1]); CPOperand rhsInput = new CPOperand(parts[2]); CPOperand rl = new CPOperand(parts[3]); CPOperand ru = new CPOperand(parts[4]); CPOperand cl = new CPOperand(parts[5]); CPOperand cu = new CPOperand(parts[6]); CPOperand out = new CPOperand(parts[7]); LixCacheType lixtype = LixCacheType.valueOf(parts[8]); if( lhsInput.getDataType()==DataType.MATRIX ) return new MatrixIndexingSPInstruction(new SimpleOperator(null), lhsInput, rhsInput, rl, ru, cl, cu, out, lixtype, opcode, str); else return new FrameIndexingSPInstruction(new SimpleOperator(null), lhsInput, rhsInput, rl, ru, cl, cu, out, opcode, str); } else { throw new DMLRuntimeException("Invalid number of operands in instruction: " + str); } } else { throw new DMLRuntimeException("Unknown opcode while parsing a IndexingSPInstruction: " + str); } } }