blob: 0024b78eb6de827312b54473abf0da651d675879 [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.wayang.profiler.log;
import java.util.ArrayList;
import java.util.Collection;
import java.util.HashSet;
import org.apache.wayang.core.api.Configuration;
import org.apache.wayang.core.optimizer.cardinality.CardinalityEstimate;
import org.apache.wayang.core.optimizer.costs.EstimationContext;
import org.apache.wayang.core.optimizer.costs.LoadProfile;
import org.apache.wayang.core.optimizer.costs.LoadProfileEstimator;
/**
* Adjustable {@link LoadProfileEstimator} implementation.
*/
public class DynamicLoadProfileEstimator implements LoadProfileEstimator {
/**
* Number of expected input/output {@link CardinalityEstimate}s.
*/
private final int numInputs, numOutputs;
/**
* {@link DynamicLoadEstimator}s for the several estimated metrics.
*/
private final DynamicLoadEstimator cpuEstimator, ramEstimator, diskEstimator, networkEstimator;
/**
* All {@link Variable}s employed by this instance and its {@link DynamicLoadEstimator}s.
*/
private final Collection<Variable> employedVariables = new HashSet<>();
private final Collection<LoadProfileEstimator> nestedEstimators = new ArrayList<>(4);
/**
* {@link Configuration} key of this instance.
*/
private final String configKey;
/**
* Creates a new instance.
*
* @param numInputs the number of input {@link CardinalityEstimate}s to the new instance
* @param numOutputs the number of output {@link CardinalityEstimate}s to the new instance
* @param cpuEstimator a {@link DynamicLoadEstimator} to estimate CPU load
*/
public DynamicLoadProfileEstimator(String configKey, int numInputs, int numOutputs, DynamicLoadEstimator cpuEstimator) {
this(configKey, numInputs, numOutputs, cpuEstimator, DynamicLoadEstimator.zeroLoad, DynamicLoadEstimator.zeroLoad);
}
/**
* Creates a new instance.
*
* @param configKey with which this instance should be associated in a {@link Configuration}.
* @param numInputs the number of input {@link CardinalityEstimate}s to the new instance
* @param numOutputs the number of output {@link CardinalityEstimate}s to the new instance
* @param cpuEstimator a {@link DynamicLoadEstimator} to estimate CPU load
* @param diskEstimator a {@link DynamicLoadEstimator} to estimate disk load
* @param networkEstimator a {@link DynamicLoadEstimator} to estimate network load
*/
public DynamicLoadProfileEstimator(String configKey,
int numInputs,
int numOutputs,
DynamicLoadEstimator cpuEstimator,
DynamicLoadEstimator diskEstimator,
DynamicLoadEstimator networkEstimator) {
this.configKey = configKey;
this.numInputs = numInputs;
this.numOutputs = numOutputs;
this.cpuEstimator = cpuEstimator;
this.ramEstimator = DynamicLoadEstimator.zeroLoad;
this.diskEstimator = diskEstimator;
this.networkEstimator = networkEstimator;
this.employedVariables.addAll(this.cpuEstimator.getEmployedVariables());
this.employedVariables.addAll(this.ramEstimator.getEmployedVariables());
this.employedVariables.addAll(this.diskEstimator.getEmployedVariables());
this.employedVariables.addAll(this.networkEstimator.getEmployedVariables());
}
@Override
public LoadProfile estimate(EstimationContext estimationContext) {
return new LoadProfile(
this.cpuEstimator.calculate(estimationContext),
this.ramEstimator.calculate(estimationContext),
this.diskEstimator.calculate(estimationContext),
this.networkEstimator.calculate(estimationContext)
);
}
@Override
public void nest(LoadProfileEstimator loadProfileEstimator) {
this.nestedEstimators.add(loadProfileEstimator);
}
@Override
public Collection<LoadProfileEstimator> getNestedEstimators() {
return this.nestedEstimators;
}
@Override
public String getConfigurationKey() {
return this.configKey;
}
/**
* Creates a JSON representation of this instance that can be plugged into a properties file.
*
* @param individual provides parameterization of this instance
* @return the JSON configuration representation
*/
public String toJsonConfig(Individual individual) {
StringBuilder sb = new StringBuilder();
sb.append(this.configKey).append(" = {\\\n");
sb.append(" \"type\":\"mathex\",\\\n");
sb.append(" \"in\":").append(this.numInputs).append(",\\\n");
sb.append(" \"out\":").append(this.numOutputs).append(",\\\n");
sb.append(" \"cpu\":\"").append(this.cpuEstimator.toMathEx(individual)).append("\",\\\n");
sb.append(" \"ram\":\"").append(this.ramEstimator.toMathEx(individual)).append("\",\\\n");
sb.append(" \"disk\":\"").append(this.diskEstimator.toMathEx(individual)).append("\",\\\n");
sb.append(" \"net\":\"").append(this.networkEstimator.toMathEx(individual)).append("\",\\\n");
sb.append(" \"p\":0.9\\\n");
sb.append("}");
return sb.toString();
}
public Collection<Variable> getEmployedVariables() {
return this.employedVariables;
}
}