blob: 42c5f648f1865dc6ae11cec60d9aab19d9355243 [file]
/*
* 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.hops.fedplanner;
import org.apache.sysds.hops.FunctionOp;
import org.apache.sysds.hops.Hop;
import org.apache.sysds.parser.FunctionStatement;
import org.apache.sysds.runtime.DMLRuntimeException;
import org.apache.sysds.runtime.controlprogram.LocalVariableMap;
import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
import java.util.Map;
/**
* Utility class for federated planners.
*/
public class FederatedPlannerUtils {
/**
* Get transient inputs from either paramMap or transientWrites.
* Inputs from paramMap has higher priority than inputs from transientWrites.
* @param currentHop hop for which inputs are read from maps
* @param paramMap of local parameters
* @param transientWrites map of transient writes
* @param localVariableMap map of local variables
* @return inputs of currentHop
*/
public static ArrayList<Hop> getTransientInputs(Hop currentHop, Map<String, Hop> paramMap,
Map<String,Hop> transientWrites, LocalVariableMap localVariableMap){
Hop tWriteHop = null;
if ( paramMap != null)
tWriteHop = paramMap.get(currentHop.getName());
if ( tWriteHop == null )
tWriteHop = transientWrites.get(currentHop.getName());
if ( tWriteHop == null ) {
if(localVariableMap.get(currentHop.getName()) != null)
return null;
else
throw new DMLRuntimeException("Transient write not found for " + currentHop);
}
else
return new ArrayList<>(Collections.singletonList(tWriteHop));
}
/**
* Return parameter map containing the mapping from parameter name to input hop
* for all parameters of the function hop.
* @param funcOp hop for which the mapping of parameter names to input hops are made
* @return parameter map or empty map if function has no parameters
*/
public static Map<String,Hop> getParamMap(FunctionOp funcOp){
String[] inputNames = funcOp.getInputVariableNames();
Map<String,Hop> paramMap = new HashMap<>();
if ( inputNames != null ){
for ( int i = 0; i < funcOp.getInput().size(); i++ )
paramMap.put(inputNames[i],funcOp.getInput(i));
}
return paramMap;
}
/**
* Saves the HOPs (TWrite) of the function return values for
* the variable name used when calling the function.
*
* Example:
* <code>
* f = function() return (matrix[double] model) {a = rand(1, 1);}
* b = f();
* </code>
* This function saves the HOP writing to <code>a</code> for identifier <code>b</code>.
*
* @param sbHop The <code>FunctionOp</code> for the call
* @param funcStatement The <code>FunctionStatement</code> of the called function
* @param transientWrites map of transient writes
*/
public static void mapFunctionOutputs(FunctionOp sbHop, FunctionStatement funcStatement, Map<String,Hop> transientWrites) {
for (int i = 0; i < sbHop.getOutputVariableNames().length; ++i) {
Hop outputWrite = transientWrites.get(funcStatement.getOutputParams().get(i).getName());
transientWrites.put(sbHop.getOutputVariableNames()[i], outputWrite);
}
}
}