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;
}
}