package org.cloudbus.cloudsim.container.containerSelectionPolicies; import org.cloudbus.cloudsim.container.containerSelectionPolicies.PowerContainerSelectionPolicy; import org.cloudbus.cloudsim.container.core.Container; import org.cloudbus.cloudsim.container.core.PowerContainer; import org.cloudbus.cloudsim.container.core.PowerContainerHost; import org.cloudbus.cloudsim.container.core.PowerContainerHostUtilizationHistory; import org.cloudbus.cloudsim.container.utils.Correlation; import org.cloudbus.cloudsim.Log; import java.util.List; /** * Created by sareh on 7/08/15. */ public class PowerContainerSelectionPolicyCor extends PowerContainerSelectionPolicy { /** * The fallback policy. */ private PowerContainerSelectionPolicy fallbackPolicy; /** * Instantiates a new power container selection policy maximum correlation. * * @param fallbackPolicy the fallback policy */ public PowerContainerSelectionPolicyCor(final PowerContainerSelectionPolicy fallbackPolicy) { super(); setFallbackPolicy(fallbackPolicy); } /* * (non-Javadoc) * * @see PowerContainerSelectionPolicy#getContainerToMigrate */ @Override public Container getContainerToMigrate(final PowerContainerHost host) { List<PowerContainer> migratableContainers = getMigratableContainers(host); if (migratableContainers.isEmpty()) { return null; } Container container= getContainer(migratableContainers, host); migratableContainers.clear(); if (container!= null) { // Log.printConcatLine("We have to migrate the container with ID", container.getId()); return container; } else { return getFallbackPolicy().getContainerToMigrate(host); } } /** * Gets the fallback policy. * * @return the fallback policy */ public PowerContainerSelectionPolicy getFallbackPolicy() { return fallbackPolicy; } /** * Sets the fallback policy. * * @param fallbackPolicy the new fallback policy */ public void setFallbackPolicy(final PowerContainerSelectionPolicy fallbackPolicy) { this.fallbackPolicy = fallbackPolicy; } public Container getContainer(List<PowerContainer> migratableContainers, PowerContainerHost host) { double[] corResult = new double[migratableContainers.size()]; Correlation correlation = new Correlation(); int i = 0; double maxValue = -2.0; int id = -1; if (host instanceof PowerContainerHostUtilizationHistory) { double[] hostUtilization = ((PowerContainerHostUtilizationHistory) host).getUtilizationHistory(); for (Container container : migratableContainers) { double[] containerUtilization = ((PowerContainer) container).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 migratableContainers.get(id); } }