package org.cloudbus.cloudsim; import java.io.BufferedReader; import java.io.FileReader; import java.io.IOException; /** * Defines the resource utilization model based on * a <a href="https://www.planet-lab.org">PlanetLab</a> * datacenter trace file. */ public class UtilizationModelPlanetLabInMemory implements UtilizationModel { /** The scheduling interval. */ private double schedulingInterval; /** The data (5 min * 288 = 24 hours). */ private final double[] data; /** * Instantiates a new PlanetLab resource utilization model from a trace file. * * @param inputPath The path of a PlanetLab datacenter trace. * @param schedulingInterval * @throws NumberFormatException the number format exception * @throws IOException Signals that an I/O exception has occurred. */ public UtilizationModelPlanetLabInMemory(String inputPath, double schedulingInterval) throws NumberFormatException, IOException { data = new double[289]; setSchedulingInterval(schedulingInterval); BufferedReader input = new BufferedReader(new FileReader(inputPath)); int n = data.length; for (int i = 0; i < n - 1; i++) { data[i] = Integer.valueOf(input.readLine()) / 100.0; } data[n - 1] = data[n - 2]; input.close(); } /** * Instantiates a new PlanetLab resource utilization model with variable data samples * from a trace file. * * @param inputPath The path of a PlanetLab datacenter trace. * @param dataSamples number of samples in the file * @throws NumberFormatException the number format exception * @throws IOException Signals that an I/O exception has occurred. */ public UtilizationModelPlanetLabInMemory(String inputPath, double schedulingInterval, int dataSamples) throws NumberFormatException, IOException { setSchedulingInterval(schedulingInterval); data = new double[dataSamples]; BufferedReader input = new BufferedReader(new FileReader(inputPath)); int n = data.length; for (int i = 0; i < n - 1; i++) { data[i] = Integer.valueOf(input.readLine()) / 100.0; } data[n - 1] = data[n - 2]; input.close(); } @Override public double getUtilization(double time) { if (time % getSchedulingInterval() == 0) { return data[(int) time / (int) getSchedulingInterval()]; } int time1 = (int) Math.floor(time / getSchedulingInterval()); int time2 = (int) Math.ceil(time / getSchedulingInterval()); double utilization1 = data[time1]; double utilization2 = data[time2]; double delta = (utilization2 - utilization1) / ((time2 - time1) * getSchedulingInterval()); double utilization = utilization1 + delta * (time - time1 * getSchedulingInterval()); return utilization; } /** * Sets the scheduling interval. * * @param schedulingInterval the new scheduling interval */ public void setSchedulingInterval(double schedulingInterval) { this.schedulingInterval = schedulingInterval; } /** * Gets the scheduling interval. * * @return the scheduling interval */ public double getSchedulingInterval() { return schedulingInterval; } public double[] getData(){ return data; } }