blob: 698e739e8461e0e83bca941b4897bb0fbe6503da [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.lops;
import java.util.HashMap;
import java.util.Map.Entry;
import org.apache.sysds.lops.LopProperties.ExecType;
import org.apache.sysds.common.Types.DataType;
import org.apache.sysds.common.Types.ParamBuiltinOp;
import org.apache.sysds.common.Types.ValueType;
/**
* Defines a LOP for functions.
*
*/
public class ParameterizedBuiltin extends Lop
{
private ParamBuiltinOp _operation;
private HashMap<String, Lop> _inputParams;
private boolean _bRmEmptyBC;
//cp-specific parameters
private int _numThreads = 1;
public ParameterizedBuiltin(HashMap<String, Lop> paramLops, ParamBuiltinOp op, DataType dt, ValueType vt, ExecType et) {
this(paramLops, op, dt, vt, et, 1);
}
public ParameterizedBuiltin(HashMap<String, Lop> paramLops, ParamBuiltinOp op, DataType dt, ValueType vt, ExecType et, int k) {
super(Lop.Type.ParameterizedBuiltin, dt, vt);
_operation = op;
for (Lop lop : paramLops.values()) {
addInput(lop);
lop.addOutput(this);
}
_inputParams = paramLops;
_numThreads = k;
lps.setProperties(inputs, et);
}
public ParameterizedBuiltin(HashMap<String, Lop> paramLops, ParamBuiltinOp op, DataType dt, ValueType vt, ExecType et, boolean bRmEmptyBC) {
this(paramLops, op, dt, vt, et);
_bRmEmptyBC = bRmEmptyBC;
}
public ParamBuiltinOp getOp() {
return _operation;
}
public int getInputIndex(String name) {
Lop n = _inputParams.get(name);
for(int i=0; i<getInputs().size(); i++)
if(getInputs().get(i) == n)
return i;
return -1;
}
public Lop getNamedInput(String name) {
return _inputParams.get(name);
}
@Override
public String getInstructions(String output)
{
StringBuilder sb = new StringBuilder();
sb.append( getExecType() );
sb.append( Lop.OPERAND_DELIMITOR );
switch(_operation)
{
case CDF:
case INVCDF:
sb.append( (_operation == ParamBuiltinOp.CDF ? "cdf" : "invcdf") );
sb.append( OPERAND_DELIMITOR );
for ( String s : _inputParams.keySet() )
{
sb.append( s );
sb.append( NAME_VALUE_SEPARATOR );
// get the value/label of the scalar input associated with name "s"
Lop iLop = _inputParams.get(s);
sb.append( iLop.prepScalarLabel() );
sb.append( OPERAND_DELIMITOR );
}
break;
case RMEMPTY:
sb.append("rmempty");
sb.append(OPERAND_DELIMITOR);
for ( String s : _inputParams.keySet() ) {
sb.append(s);
sb.append(NAME_VALUE_SEPARATOR);
// get the value/label of the scalar input associated with name "s"
// (offset and maxdim only apply to exec type spark)
Lop iLop = _inputParams.get(s);
if( s.equals( "target") || s.equals( "select") || getExecType()==ExecType.SPARK )
sb.append( iLop.getOutputParameters().getLabel());
else
sb.append( iLop.prepScalarLabel() );
sb.append(OPERAND_DELIMITOR);
}
break;
case REPLACE: {
sb.append( "replace" );
sb.append( OPERAND_DELIMITOR );
sb.append(compileGenericParamMap(_inputParams));
break;
}
case LOWER_TRI: {
sb.append( "lowertri" );
sb.append( OPERAND_DELIMITOR );
sb.append(compileGenericParamMap(_inputParams));
break;
}
case UPPER_TRI: {
sb.append( "uppertri" );
sb.append( OPERAND_DELIMITOR );
sb.append(compileGenericParamMap(_inputParams));
break;
}
case REXPAND:
sb.append("rexpand");
sb.append(OPERAND_DELIMITOR);
for ( String s : _inputParams.keySet() ) {
sb.append(s);
sb.append(NAME_VALUE_SEPARATOR);
// get the value/label of the scalar input associated with name "s"
// (offset and maxdim only apply to exec type spark)
Lop iLop = _inputParams.get(s);
if( s.equals( "target") || getExecType()==ExecType.SPARK )
sb.append( iLop.getOutputParameters().getLabel());
else
sb.append( iLop.prepScalarLabel() );
sb.append(OPERAND_DELIMITOR);
}
break;
case TRANSFORMAPPLY:
case TRANSFORMDECODE:
case TRANSFORMCOLMAP:
case TRANSFORMMETA:{
sb.append(_operation.name().toLowerCase()); //opcode
sb.append(OPERAND_DELIMITOR);
sb.append(compileGenericParamMap(_inputParams));
break;
}
case LIST: {
sb.append("nvlist"); //opcode
sb.append(OPERAND_DELIMITOR);
sb.append(compileGenericParamMap(_inputParams));
break;
}
case TOSTRING: {
sb.append("toString"); //opcode
sb.append(OPERAND_DELIMITOR);
sb.append(compileGenericParamMap(_inputParams));
break;
}
case PARAMSERV: {
sb.append("paramserv");
sb.append(OPERAND_DELIMITOR);
sb.append(compileGenericParamMap(_inputParams));
break;
}
default:
throw new LopsException(this.printErrorLocation() + "In ParameterizedBuiltin Lop, Unknown operation: " + _operation);
}
if (_operation == ParamBuiltinOp.RMEMPTY) {
sb.append("bRmEmptyBC");
sb.append(NAME_VALUE_SEPARATOR);
sb.append( _bRmEmptyBC );
sb.append(OPERAND_DELIMITOR);
}
if( getExecType()==ExecType.CP && _operation == ParamBuiltinOp.REXPAND ) {
sb.append( "k" );
sb.append( Lop.NAME_VALUE_SEPARATOR );
sb.append( _numThreads );
sb.append(OPERAND_DELIMITOR);
}
sb.append(prepOutputOperand(output));
return sb.toString();
}
@Override
public String toString() {
StringBuilder sb = new StringBuilder();
sb.append(_operation.toString());
if( !getInputs().isEmpty() )
sb.append("(");
for (Lop cur : getInputs()) {
sb.append(cur.toString());
}
if( !getInputs().isEmpty() )
sb.append(") ");
sb.append(" ; num_rows=" + this.getOutputParameters().getNumRows());
sb.append(" ; num_cols=" + this.getOutputParameters().getNumCols());
sb.append(" ; format=" + this.getOutputParameters().getFormat());
sb.append(" ; blocked=" + this.getOutputParameters().isBlocked());
return sb.toString();
}
private static String compileGenericParamMap(HashMap<String, Lop> params) {
StringBuilder sb = new StringBuilder();
for ( Entry<String, Lop> e : params.entrySet() ) {
sb.append(e.getKey());
sb.append(NAME_VALUE_SEPARATOR);
if( e.getValue().getDataType() != DataType.SCALAR )
sb.append( e.getValue().getOutputParameters().getLabel());
else
sb.append( e.getValue().prepScalarLabel() );
sb.append(OPERAND_DELIMITOR);
}
return sb.toString();
}
}