package org.cloudbus.cloudsim.container.vmSelectionPolicies;
import org.cloudbus.cloudsim.container.core.ContainerVm;
import org.cloudbus.cloudsim.container.core.PowerContainerHost;
import org.cloudbus.cloudsim.container.core.PowerContainerHostUtilizationHistory;
import org.cloudbus.cloudsim.container.core.PowerContainerVm;
import org.cloudbus.cloudsim.container.utils.Correlation;
import org.cloudbus.cloudsim.Log;
import java.util.List;
/**
* Created by sareh on 16/11/15.
*/
public class PowerContainerVMSelectionPolicyCor extends PowerContainerVmSelectionPolicy {
/**
* The fallback policy.
*/
private PowerContainerVmSelectionPolicy fallbackPolicy;
/**
* Instantiates a new power vm selection policy maximum correlation.
*
* @param fallbackPolicy the fallback policy
*/
public PowerContainerVMSelectionPolicyCor(final PowerContainerVmSelectionPolicy fallbackPolicy) {
super();
setFallbackPolicy(fallbackPolicy);
}
/*
* (non-Javadoc)
*
* @see org.cloudbus.cloudsim.experiments.power.PowerVmSelectionPolicy#
* getVmsToMigrate(org.cloudbus .cloudsim.power.PowerHost)
*/
@Override
public ContainerVm getVmToMigrate(final PowerContainerHost host) {
List<PowerContainerVm> migratableVMs = getMigratableVms(host);
if (migratableVMs.isEmpty()) {
return null;
}
ContainerVm vm = getContainerVM(migratableVMs, host);
migratableVMs.clear();
if (vm != null) {
// Log.printConcatLine("We have to migrate the container with ID", container.getId());
return vm;
} else {
return getFallbackPolicy().getVmToMigrate(host);
}
}
/**
* Gets the fallback policy.
*
* @return the fallback policy
*/
public PowerContainerVmSelectionPolicy getFallbackPolicy() {
return fallbackPolicy;
}
/**
* Sets the fallback policy.
*
* @param fallbackPolicy the new fallback policy
*/
public void setFallbackPolicy(final PowerContainerVmSelectionPolicy fallbackPolicy) {
this.fallbackPolicy = fallbackPolicy;
}
public ContainerVm getContainerVM(List<PowerContainerVm> migratableContainerVMs, PowerContainerHost host) {
double[] corResult = new double[migratableContainerVMs.size()];
Correlation correlation = new Correlation();
int i = 0;
double maxValue = -2;
int id = -1;
if (host instanceof PowerContainerHostUtilizationHistory) {
double[] hostUtilization = ((PowerContainerHostUtilizationHistory) host).getUtilizationHistory();
for (ContainerVm vm : migratableContainerVMs) {
double[] containerUtilization = ((PowerContainerVm) vm).getUtilizationHistoryList();
double cor = correlation.getCor(hostUtilization, containerUtilization);
if (Double.isNaN(cor)) {
cor = -3;
}
corResult[i] = cor;
if(corResult[i] > maxValue) {
maxValue = corResult[i];
id = i;
}
i++;
}
}
if (id == -1) {
Log.printConcatLine("Problem with correlation list.");
}
return migratableContainerVMs.get(id);
}
}