Sample application 5 used in IEEE Transactions on Intelligent Transportation Systems is added.
This commit is contained in:
@@ -0,0 +1 @@
|
||||
output
|
||||
@@ -0,0 +1 @@
|
||||
*.class
|
||||
@@ -0,0 +1,23 @@
|
||||
# Configure Simulation Settings
|
||||
|
||||
Firstly, edit config.json file in a way to declare the configuration of the simulation process used to collect training data
|
||||
|
||||
# Preparing Training Data
|
||||
|
||||
Invoke following command to convert collected data format for weka models
|
||||
|
||||
```
|
||||
./generate_training_data.sh
|
||||
```
|
||||
|
||||
This command creates *.arff files under the simulation results folder
|
||||
|
||||
# Generating Classification and Regression Models
|
||||
|
||||
Invoke following command to generate related weka models
|
||||
|
||||
```
|
||||
./generate_weka_models.sh
|
||||
```
|
||||
|
||||
This script creates weka model files under the simulation results folder. When you are done with training, you can move these files to ../config/weka/ folder
|
||||
@@ -0,0 +1,208 @@
|
||||
import java.io.FileReader;
|
||||
import java.text.DateFormat;
|
||||
import java.text.SimpleDateFormat;
|
||||
import java.util.Calendar;
|
||||
import java.util.Date;
|
||||
import java.util.concurrent.TimeUnit;
|
||||
|
||||
import org.json.simple.JSONObject;
|
||||
import org.json.simple.parser.JSONParser;
|
||||
|
||||
import weka.classifiers.Evaluation;
|
||||
import weka.classifiers.bayes.NaiveBayes;
|
||||
import weka.classifiers.functions.LinearRegression;
|
||||
import weka.classifiers.functions.MultilayerPerceptron;
|
||||
import weka.classifiers.functions.SMO;
|
||||
import weka.classifiers.functions.SMOreg;
|
||||
import weka.core.Instances;
|
||||
import weka.core.converters.ConverterUtils.DataSource;
|
||||
|
||||
public class WekaModelCreator {
|
||||
private static final String[] targets = {"edge","cloud_rsu","cloud_gsm"};
|
||||
|
||||
public static void main(String[] args) throws Exception {
|
||||
String dataPath = "";
|
||||
String classifier = "";
|
||||
String regressor = "";
|
||||
|
||||
JSONParser parser = new JSONParser();
|
||||
try
|
||||
{
|
||||
Object object = parser.parse(new FileReader(args[0]));
|
||||
|
||||
//convert Object to JSONObject
|
||||
JSONObject jsonObject = (JSONObject)object;
|
||||
|
||||
//Reading the String
|
||||
dataPath = (String) jsonObject.get("sim_result_folder");
|
||||
classifier = (String) jsonObject.get("classifier");
|
||||
regressor = (String) jsonObject.get("regressor");
|
||||
}
|
||||
catch(Exception e)
|
||||
{
|
||||
e.printStackTrace();
|
||||
System.exit(1);
|
||||
}
|
||||
|
||||
System.out.println("######### TRAINING FOR " + dataPath + " #########");
|
||||
for(int i=0; i<targets.length; i++) {
|
||||
handleClassify("train", targets[i], classifier, dataPath);
|
||||
handleRegression("train", targets[i], regressor, dataPath);
|
||||
}
|
||||
|
||||
System.out.println("######### EVALUATION FOR " + dataPath + " #########");
|
||||
for(int i=0; i<targets.length; i++) {
|
||||
handleClassify("evaluate", targets[i], classifier, dataPath);
|
||||
handleRegression("evaluate", targets[i], regressor, dataPath);
|
||||
}
|
||||
}
|
||||
|
||||
public static void handleRegression(String action, String target, String method, String dataFolder) throws Exception {
|
||||
if(action.equals("train")) {
|
||||
DateFormat df = new SimpleDateFormat("dd/MM/yyyy HH:mm:ss");
|
||||
Date startDate = Calendar.getInstance().getTime();
|
||||
String now = df.format(startDate);
|
||||
System.out.println("Training " + method + " for " + target + " started at " + now);
|
||||
|
||||
DataSource edgeRegressionSource = new DataSource(dataFolder + "/" + target + "_regression_train.arff");
|
||||
Instances edgeRegressionDataset = edgeRegressionSource.getDataSet();
|
||||
edgeRegressionDataset.setClassIndex(edgeRegressionDataset.numAttributes()-1);
|
||||
|
||||
if(method.equals("LinearRegression")) {
|
||||
LinearRegression lr = new LinearRegression();
|
||||
lr.buildClassifier(edgeRegressionDataset);
|
||||
weka.core.SerializationHelper.write(dataFolder + "/lr_" + target + ".model", lr);
|
||||
}
|
||||
else if(method.equals("SMOreg")) {
|
||||
SMOreg smoreg = new SMOreg();
|
||||
smoreg.buildClassifier(edgeRegressionDataset);
|
||||
weka.core.SerializationHelper.write(dataFolder + "/smoreg_" + target + ".model", smoreg);
|
||||
}
|
||||
|
||||
Date endDate = Calendar.getInstance().getTime();
|
||||
now = df.format(endDate);
|
||||
System.out.println("Training " + method + " for " + target + " fisished at " + now + ". It took " + getTimeDifference(startDate, endDate));
|
||||
}
|
||||
else if(action.equals("evaluate")) {
|
||||
System.out.println("Evaluation " + method + " for " + target + " started");
|
||||
|
||||
DataSource edgeRegressionSource = new DataSource(dataFolder + "/" + target + "_regression_test.arff");
|
||||
Instances edgeRegressionDataset = edgeRegressionSource.getDataSet();
|
||||
edgeRegressionDataset.setClassIndex(edgeRegressionDataset.numAttributes()-1);
|
||||
|
||||
if(method.equals("LinearRegression")) {
|
||||
LinearRegression lr = (LinearRegression) weka.core.SerializationHelper.read(dataFolder + "/lr_" + target + ".model");
|
||||
Evaluation lrEval = new Evaluation(edgeRegressionDataset);
|
||||
lrEval.evaluateModel(lr, edgeRegressionDataset);
|
||||
System.out.println("LinearRegression");
|
||||
System.out.println(lrEval.toSummaryString());
|
||||
}
|
||||
else if(method.equals("SMOreg")) {
|
||||
SMOreg smoreg = (SMOreg) weka.core.SerializationHelper.read(dataFolder + "/smoreg_" + target + ".model");
|
||||
Evaluation svmregEval = new Evaluation(edgeRegressionDataset);
|
||||
svmregEval.evaluateModel(smoreg, edgeRegressionDataset);
|
||||
System.out.println("SMOreg");
|
||||
System.out.println(svmregEval.toSummaryString());
|
||||
}
|
||||
|
||||
System.out.println("Evaluation " + method + " for " + target + " fisished");
|
||||
System.out.println("");
|
||||
}
|
||||
}
|
||||
|
||||
public static void handleClassify(String action, String target, String method, String dataFolder) throws Exception {
|
||||
if(action.equals("train")) {
|
||||
DateFormat df = new SimpleDateFormat("dd/MM/yyyy HH:mm:ss");
|
||||
Date startDate = Calendar.getInstance().getTime();
|
||||
String now = df.format(startDate);
|
||||
System.out.println("Training " + method + " for " + target + " started at " + now);
|
||||
|
||||
DataSource classifierSource = new DataSource(dataFolder + "/" + target + "_classifier_train.arff");
|
||||
Instances classifierDataset = classifierSource.getDataSet();
|
||||
classifierDataset.setClassIndex(classifierDataset.numAttributes()-1);
|
||||
|
||||
if(method.equals("NaiveBayes")) {
|
||||
NaiveBayes nb = new NaiveBayes();
|
||||
nb.buildClassifier(classifierDataset);
|
||||
weka.core.SerializationHelper.write(dataFolder + "/nb_" + target + ".model", nb);
|
||||
}
|
||||
else if(method.equals("SMO")) {
|
||||
SMO smo = new SMO();
|
||||
smo.buildClassifier(classifierDataset);
|
||||
weka.core.SerializationHelper.write(dataFolder + "/smo_" + target + ".model", smo);
|
||||
}
|
||||
else if(method.equals("MultilayerPerceptron")) {
|
||||
MultilayerPerceptron mlp = new MultilayerPerceptron();
|
||||
mlp.setLearningRate(0.1);
|
||||
//mlp.setMomentum(0.2);
|
||||
mlp.setTrainingTime(1000);
|
||||
//mlp.setHiddenLayers("3");
|
||||
mlp.buildClassifier(classifierDataset);
|
||||
weka.core.SerializationHelper.write(dataFolder + "/mlp_" + target + ".model", mlp);
|
||||
}
|
||||
|
||||
Date endDate = Calendar.getInstance().getTime();
|
||||
now = df.format(endDate);
|
||||
System.out.println("Training " + method + " for " + target + " fisished at " + now + ". It took " + getTimeDifference(startDate, endDate));
|
||||
}
|
||||
else if(action.equals("evaluate")) {
|
||||
System.out.println("Evaluation " + method + " for " + target + " started");
|
||||
|
||||
DataSource edgeClassifierSource = new DataSource(dataFolder + "/" + target + "_classifier_test.arff");
|
||||
Instances classifierDataset = edgeClassifierSource.getDataSet();
|
||||
classifierDataset.setClassIndex(classifierDataset.numAttributes()-1);
|
||||
|
||||
if(method.equals("NaiveBayes")) {
|
||||
NaiveBayes nb = (NaiveBayes) weka.core.SerializationHelper.read(dataFolder + "/nb_" + target + ".model");
|
||||
Evaluation nbEval = new Evaluation(classifierDataset);
|
||||
nbEval.evaluateModel(nb, classifierDataset);
|
||||
System.out.println(nbEval.toSummaryString());
|
||||
System.out.println(nbEval.toMatrixString());
|
||||
System.out.println(nbEval.toClassDetailsString());
|
||||
}
|
||||
else if(method.equals("SMO")) {
|
||||
SMO smo = (SMO) weka.core.SerializationHelper.read(dataFolder + "/smo_" + target + ".model");
|
||||
Evaluation smoEval = new Evaluation(classifierDataset);
|
||||
smoEval.evaluateModel(smo, classifierDataset);
|
||||
System.out.println(smoEval.toSummaryString());
|
||||
System.out.println(smoEval.toMatrixString());
|
||||
System.out.println(smoEval.toClassDetailsString());
|
||||
}
|
||||
else if(method.equals("MultilayerPerceptron")) {
|
||||
MultilayerPerceptron mlp = (MultilayerPerceptron) weka.core.SerializationHelper.read(dataFolder + "/mlp_" + target + ".model");
|
||||
Evaluation mlpEval = new Evaluation(classifierDataset);
|
||||
mlpEval.evaluateModel(mlp, classifierDataset);
|
||||
System.out.println(mlpEval.toSummaryString());
|
||||
System.out.println(mlpEval.toMatrixString());
|
||||
System.out.println(mlpEval.toClassDetailsString());
|
||||
}
|
||||
|
||||
System.out.println("Evaluation " + method + " for " + target + " fisished");
|
||||
System.out.println("");
|
||||
}
|
||||
}
|
||||
|
||||
private static String getTimeDifference(Date startDate, Date endDate){
|
||||
String result = "";
|
||||
long duration = endDate.getTime() - startDate.getTime();
|
||||
|
||||
long diffInMilli = TimeUnit.MILLISECONDS.toMillis(duration);
|
||||
long diffInSeconds = TimeUnit.MILLISECONDS.toSeconds(duration);
|
||||
long diffInMinutes = TimeUnit.MILLISECONDS.toMinutes(duration);
|
||||
long diffInHours = TimeUnit.MILLISECONDS.toHours(duration);
|
||||
long diffInDays = TimeUnit.MILLISECONDS.toDays(duration);
|
||||
|
||||
if(diffInDays>0)
|
||||
result += diffInDays + ((diffInDays>1 == true) ? " Days " : " Day ");
|
||||
if(diffInHours>0)
|
||||
result += diffInHours % 24 + ((diffInHours>1 == true) ? " Hours " : " Hour ");
|
||||
if(diffInMinutes>0)
|
||||
result += diffInMinutes % 60 + ((diffInMinutes>1 == true) ? " Minutes " : " Minute ");
|
||||
if(diffInSeconds>0)
|
||||
result += diffInSeconds % 60 + ((diffInSeconds>1 == true) ? " Seconds" : " Second");
|
||||
if(diffInMilli>0 && result.isEmpty())
|
||||
result += diffInMilli + ((diffInMilli>1 == true) ? " Milli Seconds" : " Milli Second");
|
||||
|
||||
return result;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,10 @@
|
||||
{
|
||||
"sim_result_folder": "/home/cagatay/Projects/git-repos/EdgeCloudSim/scripts/sample_app5/output/18-10-2019_21-16/default_config",
|
||||
"num_iterations": 10,
|
||||
"train_data_ratio": 80,
|
||||
"min_vehicle": 100,
|
||||
"max_vehicle": 2200,
|
||||
"vehicle_step_size": 100,
|
||||
"classifier": "MultilayerPerceptron",
|
||||
"regressor": "LinearRegression"
|
||||
}
|
||||
@@ -0,0 +1,133 @@
|
||||
import pandas as pd
|
||||
import json
|
||||
import sys
|
||||
|
||||
if len (sys.argv) != 5:
|
||||
print('invalid arguments. Usage:')
|
||||
print('python data_conventor.py config.json [edge|cloud_rsu|cloud_gsm] [classifier|regression] [train|test]')
|
||||
sys.exit(1)
|
||||
|
||||
with open(sys.argv[1]) as json_data_file:
|
||||
data = json.load(json_data_file)
|
||||
|
||||
target = sys.argv[2]
|
||||
method = sys.argv[3]
|
||||
datatype = sys.argv[4]
|
||||
|
||||
print("conversion started with args " + target + ", " + method + ", " + datatype)
|
||||
|
||||
sim_result_folder = data["sim_result_folder"]
|
||||
num_iterations = data["num_iterations"]
|
||||
train_data_ratio = data["train_data_ratio"]
|
||||
min_vehicle = data["min_vehicle"]
|
||||
max_vehicle = data["max_vehicle"]
|
||||
vehicle_step_size = data["vehicle_step_size"]
|
||||
|
||||
def getDecisionColumnName(target):
|
||||
if target == "edge":
|
||||
COLUMN_NAME = "EDGE"
|
||||
elif target == "cloud_rsu":
|
||||
COLUMN_NAME = "CLOUD_VIA_RSU"
|
||||
elif target == "cloud_gsm":
|
||||
COLUMN_NAME = "CLOUD_VIA_GSM"
|
||||
return COLUMN_NAME
|
||||
|
||||
def getClassifierColumns(target):
|
||||
if target == "edge":
|
||||
result = ["NumOffloadedTask", "TaskLength", "WLANUploadDelay", "WLANDownloadDelay", "AvgEdgeUtilization", "Result"]
|
||||
elif target == "cloud_rsu":
|
||||
result = ["NumOffloadedTask", "WANUploadDelay", "WANDownloadDelay", "Result"]
|
||||
elif target == "cloud_gsm":
|
||||
result = ["NumOffloadedTask", "GSMUploadDelay", "GSMDownloadDelay", "Result"]
|
||||
return result
|
||||
|
||||
def getRegressionColumns(target):
|
||||
if target == "edge":
|
||||
result = ["TaskLength", "AvgEdgeUtilization", "ServiceTime"]
|
||||
elif target == "cloud_rsu":
|
||||
result = ["TaskLength", "WANUploadDelay", "WANDownloadDelay", "ServiceTime"]
|
||||
elif target == "cloud_gsm":
|
||||
result = ["TaskLength", "GSMUploadDelay", "GSMDownloadDelay", "ServiceTime"]
|
||||
return result
|
||||
|
||||
def znorm(column):
|
||||
column = (column - column.mean()) / column.std()
|
||||
return column
|
||||
|
||||
data_set = []
|
||||
|
||||
testDataStartIndex = (train_data_ratio * num_iterations) / 100
|
||||
|
||||
for ite in range(num_iterations):
|
||||
for vehicle in range(min_vehicle, max_vehicle+1, vehicle_step_size):
|
||||
if (datatype == "train" and ite < testDataStartIndex) or (datatype == "test" and ite >= testDataStartIndex):
|
||||
file_name = sim_result_folder + "/ite" + str(ite + 1) + "/" + str(vehicle) + "_learnerOutputFile.cvs"
|
||||
df = [pd.read_csv(file_name, na_values = "?", comment='\t', sep=",")]
|
||||
df[0]['VehicleCount'] = vehicle
|
||||
#print(file_name)
|
||||
data_set += df
|
||||
|
||||
data_set = pd.concat(data_set, ignore_index=True)
|
||||
data_set = data_set[data_set['Decision'] == getDecisionColumnName(target)]
|
||||
|
||||
if method == "classifier":
|
||||
targetColumns = getClassifierColumns(target)
|
||||
else:
|
||||
targetColumns= getRegressionColumns(target)
|
||||
|
||||
if datatype == "train":
|
||||
print ("##############################################################")
|
||||
print ("Stats for " + target + " - " + method)
|
||||
print ("Please use relevant information from below table in java side:")
|
||||
train_stats = data_set[targetColumns].describe()
|
||||
train_stats = train_stats.transpose()
|
||||
print(train_stats)
|
||||
print ("##############################################################")
|
||||
|
||||
#print("balancing " + target + " for " + method)
|
||||
|
||||
#BALANCE DATA SET
|
||||
if method == "classifier":
|
||||
df0 = data_set[data_set['Result']=="fail"]
|
||||
df1 = data_set[data_set['Result']=="success"]
|
||||
|
||||
#size = min(len(df0[df0['VehicleCount']==max_vehicle]), len(df1[df1['VehicleCount']==min_vehicle]))
|
||||
|
||||
size = len(df0[df0['VehicleCount']==max_vehicle]) // 2
|
||||
|
||||
df1 = df1.groupby('VehicleCount').apply(lambda x: x if len(x) < size else x.sample(size))
|
||||
df0 = df0.groupby('VehicleCount').apply(lambda x: x if len(x) < size else x.sample(size))
|
||||
|
||||
data_set = pd.concat([df0, df1], ignore_index=True)
|
||||
else:
|
||||
data_set = data_set[data_set['Result'] == 'success']
|
||||
|
||||
#size = min(len(data_set[data_set['VehicleCount']==min_vehicle]), len(data_set[data_set['VehicleCount']==max_vehicle]))
|
||||
|
||||
size = len(data_set[data_set['VehicleCount']==max_vehicle]) // 3
|
||||
data_set = data_set.groupby('VehicleCount').apply(lambda x: x if len(x.index) < size else x.sample(size))
|
||||
|
||||
#EXTRACT RELATED ATTRIBUTES
|
||||
df = pd.DataFrame(columns=targetColumns)
|
||||
for column in targetColumns:
|
||||
if column == 'Result' or column == 'ServiceTime':
|
||||
df[column] = data_set[column]
|
||||
else:
|
||||
df[column] = znorm(data_set[column])
|
||||
|
||||
f = open(sim_result_folder + "/" + target + "_" + method + "_" + datatype + ".arff", 'w')
|
||||
f.write('@relation ' + target + '\n\n')
|
||||
for column in targetColumns:
|
||||
if column == 'Result':
|
||||
f.write('@attribute class {fail,success}\n')
|
||||
else:
|
||||
f.write('@attribute ' + column + ' REAL\n')
|
||||
f.write('\n@data\n')
|
||||
df.to_csv(f, header=False, index=False)
|
||||
f.close()
|
||||
|
||||
print ("##############################################################")
|
||||
print ("Operation completed!")
|
||||
print (".arff file is generated for weka.")
|
||||
print ("##############################################################")
|
||||
|
||||
@@ -0,0 +1,14 @@
|
||||
#!/bin/sh
|
||||
|
||||
python data_convertor.py config.json edge classifier train
|
||||
python data_convertor.py config.json edge classifier test
|
||||
python data_convertor.py config.json edge regression train
|
||||
python data_convertor.py config.json edge regression test
|
||||
python data_convertor.py config.json cloud_rsu classifier train
|
||||
python data_convertor.py config.json cloud_rsu classifier test
|
||||
python data_convertor.py config.json cloud_rsu regression train
|
||||
python data_convertor.py config.json cloud_rsu regression test
|
||||
python data_convertor.py config.json cloud_gsm classifier train
|
||||
python data_convertor.py config.json cloud_gsm classifier test
|
||||
python data_convertor.py config.json cloud_gsm regression train
|
||||
python data_convertor.py config.json cloud_gsm regression test
|
||||
@@ -0,0 +1,4 @@
|
||||
#!/bin/sh
|
||||
|
||||
javac -classpath "./json-simple-1.1.1.jar:../../../lib/weka.jar:../../../lib/mtj-1.0.4.jar" WekaModelCreator.java
|
||||
java -classpath ".:./json-simple-1.1.1.jar:../../../lib/weka.jar:../../../lib/mtj-1.0.4.jar" WekaModelCreator config.json
|
||||
Binary file not shown.
@@ -0,0 +1,4 @@
|
||||
#!/bin/sh
|
||||
rm -rf ../../bin
|
||||
mkdir ../../bin
|
||||
javac -classpath "../../lib/cloudsim-4.0.jar:../../lib/commons-math3-3.6.1.jar:../../lib/colt.jar:../../lib/weka.jar:../../lib/mtj-1.0.4.jar" -sourcepath ../../src ../../src/edu/boun/edgecloudsim/applications/vec_ai_app/VehicularMainApp.java -d ../../bin
|
||||
@@ -0,0 +1,51 @@
|
||||
<?xml version="1.0"?>
|
||||
<applications>
|
||||
<application name="TRAFFIC_MANAGEMENT">
|
||||
<usage_percentage>30</usage_percentage>
|
||||
<prob_cloud_selection>0</prob_cloud_selection>
|
||||
<delay_sensitivity>0.5</delay_sensitivity>
|
||||
<max_delay_requirement>0.5</max_delay_requirement>
|
||||
<poisson_interarrival>3</poisson_interarrival>
|
||||
<active_period>3600</active_period>
|
||||
<idle_period>1</idle_period>
|
||||
<data_upload>20</data_upload>
|
||||
<data_download>20</data_download>
|
||||
<task_length>3000</task_length>
|
||||
<required_core>1</required_core>
|
||||
<vm_utilization_on_edge>6</vm_utilization_on_edge>
|
||||
<vm_utilization_on_cloud>1.2</vm_utilization_on_cloud>
|
||||
<vm_utilization_on_mobile>0</vm_utilization_on_mobile>
|
||||
</application>
|
||||
<application name="DANGER_ASSESSMENT">
|
||||
<usage_percentage>35</usage_percentage>
|
||||
<prob_cloud_selection>0</prob_cloud_selection>
|
||||
<delay_sensitivity>0.8</delay_sensitivity>
|
||||
<max_delay_requirement>1</max_delay_requirement>
|
||||
<poisson_interarrival>5</poisson_interarrival>
|
||||
<active_period>3600</active_period>
|
||||
<idle_period>1</idle_period>
|
||||
<data_upload>40</data_upload>
|
||||
<data_download>20</data_download>
|
||||
<task_length>10000</task_length>
|
||||
<required_core>1</required_core>
|
||||
<vm_utilization_on_edge>20</vm_utilization_on_edge>
|
||||
<vm_utilization_on_cloud>4</vm_utilization_on_cloud>
|
||||
<vm_utilization_on_mobile>0</vm_utilization_on_mobile>
|
||||
</application>
|
||||
<application name="INFOTAINMENT">
|
||||
<usage_percentage>35</usage_percentage>
|
||||
<prob_cloud_selection>0</prob_cloud_selection>
|
||||
<delay_sensitivity>0.25</delay_sensitivity>
|
||||
<max_delay_requirement>1.5</max_delay_requirement>
|
||||
<poisson_interarrival>15</poisson_interarrival>
|
||||
<active_period>3600</active_period>
|
||||
<idle_period>1</idle_period>
|
||||
<data_upload>20</data_upload>
|
||||
<data_download>80</data_download>
|
||||
<task_length>20000</task_length>
|
||||
<required_core>1</required_core>
|
||||
<vm_utilization_on_edge>40</vm_utilization_on_edge>
|
||||
<vm_utilization_on_cloud>8</vm_utilization_on_cloud>
|
||||
<vm_utilization_on_mobile>0</vm_utilization_on_mobile>
|
||||
</application>
|
||||
</applications>
|
||||
@@ -0,0 +1,53 @@
|
||||
#default config file
|
||||
simulation_time=60
|
||||
warm_up_period=3
|
||||
file_log_enabled=true
|
||||
deep_file_log_enabled=false
|
||||
|
||||
#logging is disabled if it is 0
|
||||
vm_load_check_interval=0.025
|
||||
|
||||
#logging is disabled if it is 0
|
||||
location_check_interval=0.005
|
||||
|
||||
#logging is disabled if it is 0
|
||||
ap_delay_check_interval=0.1
|
||||
|
||||
min_number_of_mobile_devices=100
|
||||
max_number_of_mobile_devices=1800
|
||||
mobile_device_counter_size=100
|
||||
|
||||
wan_propogation_delay=0.15
|
||||
gsm_propogation_delay=0.16
|
||||
lan_internal_delay=0.01
|
||||
wlan_bandwidth=10
|
||||
man_bandwidth=1000
|
||||
wan_bandwidth=50
|
||||
gsm_bandwidth=20
|
||||
|
||||
#all the host on cloud runs on a single datacenter
|
||||
number_of_host_on_cloud_datacenter=1
|
||||
number_of_vm_on_cloud_host=20
|
||||
core_for_cloud_vm=2
|
||||
mips_for_cloud_vm=75000
|
||||
ram_for_cloud_vm=8000
|
||||
storage_for_cloud_vm=125000
|
||||
|
||||
#each mobile device has one host which serves one VM
|
||||
#all the host runs on a single datacenter due to the out of memory (oom) issue
|
||||
core_for_mobile_vm=1
|
||||
mips_for_mobile_vm=1000
|
||||
ram_for_mobile_vm=1800
|
||||
storage_for_mobile_vm=32000
|
||||
|
||||
#use ',' for multiple values
|
||||
#orchestrator_policies=AI_TRAINER,RANDOM,PREDICTIVE,MAB,AI_BASED
|
||||
orchestrator_policies=RANDOM,PREDICTIVE,GAME_THEORY,MAB,AI_BASED
|
||||
|
||||
#use ',' for multiple values
|
||||
simulation_scenarios=ITS_SCENARIO
|
||||
|
||||
#mean waiting time in seconds
|
||||
attractiveness_L1_mean_waiting_time=480
|
||||
attractiveness_L2_mean_waiting_time=240
|
||||
attractiveness_L3_mean_waiting_time=120
|
||||
File diff suppressed because it is too large
Load Diff
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
@@ -0,0 +1,60 @@
|
||||
%--------------------------------------------------------------
|
||||
%description
|
||||
% returns a value according to the given argumentssss
|
||||
%--------------------------------------------------------------
|
||||
function [ret_val] = getConfiguration(argType)
|
||||
if(argType == 1)
|
||||
ret_val = 'D:\sim_results';
|
||||
elseif(argType == 2)
|
||||
ret_val = 60; %simulation time (in minutes)
|
||||
elseif(argType == 3)
|
||||
ret_val = 2; %Number of iterations
|
||||
elseif(argType == 4)
|
||||
ret_val = 2; %x tick interval for number of mobile devices
|
||||
elseif(argType == 5)
|
||||
ret_val = {'AI_BASED','MAB','GAME_THEORY','PREDICTIVE','RANDOM'};
|
||||
elseif(argType == 6)
|
||||
ret_val = {'ML-based','MAB-based','Game-based','SMA-based','random'};
|
||||
elseif(argType == 7)
|
||||
ret_val=[6 3 11 11]; %position of figure
|
||||
%ret_val=[6 3 9 9]; %position of figure
|
||||
elseif(argType == 8)
|
||||
ret_val = [13 12 12]; %font fize for x/y label, lengend and x/y axis
|
||||
elseif(argType == 9)
|
||||
ret_val = 'Number of Vehicles'; %Common text for x axis
|
||||
elseif(argType == 10)
|
||||
ret_val = 100; %min number of mobile device
|
||||
elseif(argType == 11)
|
||||
ret_val = 100; %step size of mobile device count
|
||||
elseif(argType == 12)
|
||||
ret_val = 1800; %max number of mobile device
|
||||
elseif(argType == 17)
|
||||
ret_val = 0; %return 1 if you want to add 10^n text at x axis
|
||||
elseif(argType == 18)
|
||||
ret_val = 1; %return 1 if you want to save figure as pdf
|
||||
elseif(argType == 19)
|
||||
ret_val = 1; %return 1 if you want to plot errors
|
||||
elseif(argType == 20)
|
||||
ret_val=0; %return 1 if graph is plotted colerful
|
||||
elseif(argType == 21)
|
||||
ret_val=[0.55 0 0]; %color of first line
|
||||
elseif(argType == 22)
|
||||
ret_val=[0 0.15 0.6]; %color of second line
|
||||
elseif(argType == 23)
|
||||
ret_val=[0 0.23 0]; %color of third line
|
||||
elseif(argType == 24)
|
||||
ret_val=[0.6 0 0.6]; %color of fourth line
|
||||
elseif(argType == 25)
|
||||
ret_val=[0.08 0.08 0.08]; %color of fifth line
|
||||
elseif(argType == 26)
|
||||
ret_val=[0 0.8 0.8]; %color of sixth line
|
||||
elseif(argType == 27)
|
||||
ret_val=[0.8 0.4 0]; %color of seventh line
|
||||
elseif(argType == 28)
|
||||
ret_val=[0.8 0.8 0]; %color of eighth line
|
||||
elseif(argType == 40)
|
||||
ret_val={'-k*','-ko','-ks','-kv','-kp','-kd','-kx','-kh'}; %line style (marker) of the colerless line
|
||||
elseif(argType == 50)
|
||||
ret_val={'-k*','-ko','-ks','-kv','-kp','-kd','-kx','-kh'}; %line style (marker) of the colerfull line
|
||||
end
|
||||
end
|
||||
@@ -0,0 +1,113 @@
|
||||
function [] = plotApDelay()
|
||||
folderPath = getConfiguration(1);
|
||||
numOfSimulations = getConfiguration(3);
|
||||
stepOfxAxis = getConfiguration(4);
|
||||
startOfMobileDeviceLoop = getConfiguration(10);
|
||||
stepOfMobileDeviceLoop = getConfiguration(11);
|
||||
endOfMobileDeviceLoop = getConfiguration(12);
|
||||
numOfMobileDevices = (endOfMobileDeviceLoop - startOfMobileDeviceLoop)/stepOfMobileDeviceLoop + 1;
|
||||
placeTypes = {'AP 1 (60 km/h)','Ap 4 (40 km/h)','AP 11 (20 km/h)'};
|
||||
|
||||
results = zeros(size(placeTypes,2),numOfMobileDevices);
|
||||
|
||||
for s=1:numOfSimulations
|
||||
indexCounter = 1;
|
||||
for i=startOfMobileDeviceLoop:stepOfMobileDeviceLoop:endOfMobileDeviceLoop
|
||||
try
|
||||
filePath1 = strcat(folderPath,'\ite',int2str(s),'\SIMRESULT_ITS_SCENARIO_AI_BASED_',int2str(i),'DEVICES_AP_UPLOAD_DELAY.log');
|
||||
filePath2 = strcat(folderPath,'\ite',int2str(s),'\SIMRESULT_ITS_SCENARIO_AI_BASED_',int2str(i),'DEVICES_AP_DOWNLOAD_DELAY.log');
|
||||
readData1 = dlmread(filePath1,';',60,0);
|
||||
readData2 = dlmread(filePath2,';',60,0);
|
||||
|
||||
for j=1:size(placeTypes,2)
|
||||
results(j,indexCounter) = results(j,indexCounter) + mean(readData1(:,j+1)) + mean(readData2(:,j+1));
|
||||
end
|
||||
catch err
|
||||
error(err)
|
||||
end
|
||||
indexCounter = indexCounter + 1;
|
||||
end
|
||||
end
|
||||
results = results/numOfSimulations;
|
||||
|
||||
types = zeros(1,numOfMobileDevices);
|
||||
for i=1:numOfMobileDevices
|
||||
types(i)=startOfMobileDeviceLoop+((i-1)*stepOfMobileDeviceLoop);
|
||||
end
|
||||
|
||||
hFig = figure;
|
||||
pos=getConfiguration(7);
|
||||
fontSizeArray = getConfiguration(8);
|
||||
set(hFig, 'Units','centimeters');
|
||||
set(hFig, 'Position',pos);
|
||||
set(0,'DefaultAxesFontName','Times New Roman');
|
||||
set(0,'DefaultTextFontName','Times New Roman');
|
||||
set(0,'DefaultAxesFontSize',fontSizeArray(3));
|
||||
|
||||
if(getConfiguration(20) == 1)
|
||||
for i=stepOfxAxis:stepOfxAxis:numOfMobileDevices
|
||||
xIndex=startOfMobileDeviceLoop+((i-1)*stepOfMobileDeviceLoop);
|
||||
|
||||
markers = {':k*',':ko',':ks',':kv'};
|
||||
for j=1:size(placeTypes,2)
|
||||
plot(xIndex, results(j,i),char(markers(j)),'MarkerFaceColor',getConfiguration(20+j),'color',getConfiguration(20+j));
|
||||
hold on;
|
||||
end
|
||||
end
|
||||
|
||||
for j=1:size(placeTypes,2)
|
||||
plot(types, results(j,:),':k','color',getConfiguration(20+j),'LineWidth',1.5);
|
||||
hold on;
|
||||
end
|
||||
|
||||
set(gca,'color','none');
|
||||
else
|
||||
markers = {'-k*','-ko','-ks','-kv'};
|
||||
for j=1:size(placeTypes,2)
|
||||
plot(types, results(j,:),char(markers(j)),'MarkerFaceColor','w','LineWidth',1.4);
|
||||
hold on;
|
||||
end
|
||||
|
||||
%set(gcf, 'Position',getConfiguration(28));
|
||||
end
|
||||
|
||||
lgnd = legend(placeTypes,'Location','NorthWest');
|
||||
if(getConfiguration(20) == 1)
|
||||
set(lgnd,'color','none');
|
||||
end
|
||||
|
||||
if(getConfiguration(20) == 1)
|
||||
set(lgnd,'color','none');
|
||||
end
|
||||
|
||||
if(getConfiguration(17) == 0)
|
||||
manualXAxisCoefficent = 1;
|
||||
end
|
||||
|
||||
hold off;
|
||||
axis square
|
||||
xlabel(getConfiguration(9));
|
||||
set(gca,'XTick', startOfMobileDeviceLoop + stepOfMobileDeviceLoop:(stepOfxAxis*stepOfMobileDeviceLoop):endOfMobileDeviceLoop);
|
||||
set(gca,'XTickLabel', startOfMobileDeviceLoop + stepOfMobileDeviceLoop/manualXAxisCoefficent:(stepOfxAxis*stepOfMobileDeviceLoop)/manualXAxisCoefficent:endOfMobileDeviceLoop/manualXAxisCoefficent);
|
||||
ylabel('Average Network Delay (sec)');
|
||||
set(gca,'XLim',[startOfMobileDeviceLoop-5 endOfMobileDeviceLoop+5]);
|
||||
|
||||
if(getConfiguration(17) == 1)
|
||||
xlim = get(gca,'XLim');
|
||||
ylim = get(gca,'YLim');
|
||||
text(1.02 * xlim(2), 0.165 * ylim(2), 'x 10^2');
|
||||
end
|
||||
|
||||
set(get(gca,'Xlabel'),'FontSize',fontSizeArray(1));
|
||||
set(get(gca,'Ylabel'),'FontSize',fontSizeArray(1));
|
||||
set(lgnd,'FontSize',fontSizeArray(2));
|
||||
|
||||
if(getConfiguration(18) == 1)
|
||||
set(hFig, 'PaperUnits', 'centimeters');
|
||||
set(hFig, 'PaperPositionMode', 'manual');
|
||||
set(hFig, 'PaperPosition',[0 0 pos(3) pos(4)]);
|
||||
set(gcf, 'PaperSize', [pos(3) pos(4)]); %Keep the same paper size
|
||||
filename = strcat(folderPath,'\apDelay');
|
||||
saveas(gcf, filename, 'pdf');
|
||||
end
|
||||
end
|
||||
@@ -0,0 +1,8 @@
|
||||
function [] = plotAvgFailedTask()
|
||||
|
||||
plotGenericLine(1, 2, 'Average Failed Tasks (%)', 'ALL_APPS', 'NorthWest', 1);
|
||||
plotGenericLine(1, 2, 'Failed Tasks for Danger Assessment App (%)', 'DANGER_ASSESSMENT', 'NorthWest', 1);
|
||||
plotGenericLine(1, 2, 'Failed Tasks for Navigation App (%)', 'TRAFFIC_MANAGEMENT', 'NorthWest', 1);
|
||||
plotGenericLine(1, 2, 'Failed Tasks for Infotainment App (%)', 'INFOTAINMENT', 'NorthWest', 1);
|
||||
|
||||
end
|
||||
@@ -0,0 +1,11 @@
|
||||
function [] = plotAvgNetworkDelay()
|
||||
plotGenericLine(1, 7, 'Average Network Delay (sec)', 'ALL_APPS', 'NorthWest', 0);
|
||||
|
||||
plotGenericLine(5, 1, 'Average WLAN Delay (sec)', 'ALL_APPS', 'NorthWest', 0);
|
||||
|
||||
plotGenericLine(5, 2, 'Average MAN Delay (sec)', 'ALL_APPS', 'NorthWest', 0);
|
||||
|
||||
plotGenericLine(5, 3, 'Average WAN Delay (sec)', 'ALL_APPS', 'NorthWest', 0, 1, 1);
|
||||
|
||||
plotGenericLine(5, 4, 'Average GSM Delay (sec)', 'ALL_APPS', 'NorthWest', 0, 1, 1, 0, [4, 1700]);
|
||||
end
|
||||
@@ -0,0 +1,9 @@
|
||||
function [] = plotAvgProcessingTime()
|
||||
|
||||
plotGenericLine(1, 6, 'Average Processing Time (sec)', 'ALL_APPS', 'NorthWest', 0);
|
||||
|
||||
plotGenericLine(2, 6, 'Processing Time on RSU (sec)', 'ALL_APPS', 'NorthWest', 0);
|
||||
|
||||
plotGenericLine(3, 6, 'Processing Time on Cloud (sec)', 'ALL_APPS', 'NorthWest', 0);
|
||||
|
||||
end
|
||||
@@ -0,0 +1,8 @@
|
||||
function [] = plotAvgQoE()
|
||||
|
||||
plotGenericLine(1, 13, 'Average QoE (%)', 'ALL_APPS', 'SouthWest', 0);
|
||||
plotGenericLine(1, 13, 'QoE for Danger Assessment App (%)', 'DANGER_ASSESSMENT', 'SouthWest', 0);
|
||||
plotGenericLine(1, 13, 'QoE for Navigation App (%)', 'TRAFFIC_MANAGEMENT', 'SouthWest', 0);
|
||||
plotGenericLine(1, 13, 'QoE for Infotainment App (%)', 'INFOTAINMENT', 'SouthWest', 0);
|
||||
|
||||
end
|
||||
@@ -0,0 +1,9 @@
|
||||
function [] = plotAvgServiceTime()
|
||||
|
||||
plotGenericLine(1, 5, 'Average Service Time (sec)', 'ALL_APPS', 'NorthWest', 0);
|
||||
|
||||
plotGenericLine(2, 5, 'Service Time on RSU (sec)', 'ALL_APPS', 'NorthWest', 0);
|
||||
|
||||
plotGenericLine(3, 5, 'Service Time on Cloud (sec)', 'ALL_APPS', 'NorthWest', 0);
|
||||
|
||||
end
|
||||
@@ -0,0 +1,7 @@
|
||||
function [] = plotAvgVmUtilization()
|
||||
|
||||
plotGenericLine(2, 8, 'Average VM Utilization of RSU (%)', 'ALL_APPS', 'NorthWest', 0);
|
||||
|
||||
plotGenericLine(3, 8, 'Average VM Utilization of Cloud (%)', 'ALL_APPS', 'NorthWest', 0);
|
||||
|
||||
end
|
||||
@@ -0,0 +1,91 @@
|
||||
function [] = plotDelayReasonAsBar(isEdge)
|
||||
folderPath = getConfiguration(1);
|
||||
numOfSimulations = getConfiguration(3);
|
||||
stepOfxAxis = 3;%getConfiguration(4);
|
||||
startOfMobileDeviceLoop = getConfiguration(10);
|
||||
stepOfMobileDeviceLoop = getConfiguration(11);
|
||||
endOfMobileDeviceLoop = getConfiguration(12);
|
||||
numOfMobileDevices = (endOfMobileDeviceLoop - startOfMobileDeviceLoop)/stepOfMobileDeviceLoop + 1;
|
||||
|
||||
all_results = zeros(numOfSimulations, numOfMobileDevices, 2);
|
||||
|
||||
if ~exist('isEdge','var')
|
||||
isEdge = 1;
|
||||
end
|
||||
|
||||
for s=1:numOfSimulations
|
||||
for j=1:numOfMobileDevices
|
||||
try
|
||||
mobileDeviceNumber = startOfMobileDeviceLoop + stepOfMobileDeviceLoop * (j-1);
|
||||
filePath = strcat(folderPath,'\ite',int2str(s),'\SIMRESULT_ITS_SCENARIO_AI_BASED_',int2str(mobileDeviceNumber),'DEVICES_ALL_APPS_GENERIC.log');
|
||||
|
||||
readData = dlmread(filePath,';',1,0);
|
||||
value1 = 0;
|
||||
value2 = 0;
|
||||
if(isEdge == 1)
|
||||
value1 = readData(2,5);
|
||||
value2 = readData(2,6);
|
||||
else
|
||||
value1 = readData(3,5);
|
||||
value2 = readData(3,6);
|
||||
end
|
||||
|
||||
all_results(s,j,1) = value2;
|
||||
all_results(s,j,2) = value1 - value2;
|
||||
catch err
|
||||
error(err)
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
if(numOfSimulations == 1)
|
||||
results = all_results;
|
||||
else
|
||||
results = mean(all_results); %still 3d matrix but 1xMxN format
|
||||
end
|
||||
|
||||
results = squeeze(results); %remove singleton dimensions
|
||||
|
||||
hFig=figure;
|
||||
pos=getConfiguration(7);
|
||||
set(hFig, 'Units','centimeters');
|
||||
set(hFig, 'Position',pos);
|
||||
set(0,'DefaultAxesFontName','Times New Roman');
|
||||
set(0,'DefaultTextFontName','Times New Roman');
|
||||
set(0,'DefaultAxesFontSize',11);
|
||||
set(0,'DefaultTextFontSize',12);
|
||||
|
||||
b = bar(results,'stacked');
|
||||
%set(b(1),'LineStyle','--');
|
||||
|
||||
if(isEdge == 1)
|
||||
lgnd = legend(b,{'processing time','WLAN delay'},'Location','NorthWest');
|
||||
ylabel({'Service Time on Edge (sec)'});
|
||||
filename = 'edge_delay_reason';
|
||||
else
|
||||
lgnd = legend(b,{'processing time','WAN delay'},'Location','NorthWest');
|
||||
ylabel({'Service Time on Cloud(sec)'});
|
||||
filename = 'cloud_delay_reason';
|
||||
end
|
||||
|
||||
set(b,{'FaceColor'},{[.45 .45 .45];[.90 .90 .90]});
|
||||
|
||||
axis square
|
||||
xlabel(getConfiguration(9));
|
||||
set(gca,'XTick', stepOfxAxis:stepOfxAxis:numOfMobileDevices);
|
||||
set(gca,'XTickLabel', (startOfMobileDeviceLoop*stepOfxAxis):(stepOfxAxis*stepOfMobileDeviceLoop):endOfMobileDeviceLoop);
|
||||
set(gca,'XLim',[0 numOfMobileDevices+1])
|
||||
|
||||
set(get(gca,'Xlabel'),'FontSize',12)
|
||||
set(get(gca,'Ylabel'),'FontSize',12)
|
||||
set(lgnd,'FontSize',12)
|
||||
|
||||
if(getConfiguration(18) == 1)
|
||||
set(hFig, 'PaperUnits', 'centimeters');
|
||||
set(hFig, 'PaperPositionMode', 'manual');
|
||||
set(hFig, 'PaperPosition',[0 0 pos(3) pos(4)]);
|
||||
set(gcf, 'PaperSize', [pos(3) pos(4)]); %Keep the same paper size
|
||||
filename = strcat(folderPath,'\',filename);
|
||||
saveas(gcf, filename, 'pdf');
|
||||
end
|
||||
end
|
||||
@@ -0,0 +1,198 @@
|
||||
function [] = plotGenericLine(rowOfset, columnOfset, yLabel, appType, legendPos, calculatePercentage, divisor, ignoreZeroValues, hideLowerValues, hideXAxis)
|
||||
folderPath = getConfiguration(1);
|
||||
numOfSimulations = getConfiguration(3);
|
||||
stepOfxAxis = getConfiguration(4);
|
||||
scenarioType = getConfiguration(5);
|
||||
startOfMobileDeviceLoop = getConfiguration(10);
|
||||
stepOfMobileDeviceLoop = getConfiguration(11);
|
||||
endOfMobileDeviceLoop = getConfiguration(12);
|
||||
numOfMobileDevices = (endOfMobileDeviceLoop - startOfMobileDeviceLoop)/stepOfMobileDeviceLoop + 1;
|
||||
|
||||
all_results = zeros(numOfSimulations, size(scenarioType,2), numOfMobileDevices);
|
||||
min_results = zeros(size(scenarioType,2), numOfMobileDevices);
|
||||
max_results = zeros(size(scenarioType,2), numOfMobileDevices);
|
||||
|
||||
if ~exist('appType','var')
|
||||
appType = 'ALL_APPS';
|
||||
end
|
||||
|
||||
if ~exist('divisor','var')
|
||||
divisor = 1;
|
||||
end
|
||||
|
||||
if ~exist('ignoreZeroValues','var')
|
||||
ignoreZeroValues = 0;
|
||||
end
|
||||
|
||||
if ~exist('hideLowerValues','var')
|
||||
hideLowerValues = 0;
|
||||
end
|
||||
|
||||
if exist('hideXAxis','var')
|
||||
hideXAxisStartValue = hideXAxis(2);
|
||||
hideXAxisIndex = hideXAxis(1);
|
||||
end
|
||||
|
||||
for s=1:numOfSimulations
|
||||
for i=1:size(scenarioType,2)
|
||||
for j=1:numOfMobileDevices
|
||||
try
|
||||
mobileDeviceNumber = startOfMobileDeviceLoop + stepOfMobileDeviceLoop * (j-1);
|
||||
filePath = strcat(folderPath,'\ite',int2str(s),'\SIMRESULT_ITS_SCENARIO_',char(scenarioType(i)),'_',int2str(mobileDeviceNumber),'DEVICES_',appType,'_GENERIC.log');
|
||||
|
||||
readData = dlmread(filePath,';',rowOfset,0);
|
||||
value = readData(1,columnOfset);
|
||||
if(calculatePercentage==1)
|
||||
readData = dlmread(filePath,';',1,0);
|
||||
totalTask = readData(1,1)+readData(1,2);
|
||||
value = (100 * value) / totalTask;
|
||||
end
|
||||
|
||||
all_results(s,i,j) = value;
|
||||
catch err
|
||||
error(err)
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
if(numOfSimulations == 1)
|
||||
results = all_results;
|
||||
else
|
||||
if(ignoreZeroValues == 1)
|
||||
results = sum(all_results,1) ./ sum(all_results~=0,1);
|
||||
%TODO cahnge NaN to 0
|
||||
else
|
||||
results = mean(all_results); %still 3d matrix but 1xMxN format
|
||||
end
|
||||
end
|
||||
|
||||
results = squeeze(results); %remove singleton dimensions
|
||||
|
||||
for i=1:size(scenarioType,2)
|
||||
for j=1:numOfMobileDevices
|
||||
if(results(i,j) < hideLowerValues)
|
||||
results(i,j) = NaN;
|
||||
else
|
||||
results(i,j) = results(i,j) / divisor;
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
if exist('hideXAxis','var')
|
||||
for j=1:numOfMobileDevices
|
||||
if(j*stepOfMobileDeviceLoop+startOfMobileDeviceLoop > hideXAxisStartValue)
|
||||
results(hideXAxisIndex,j) = NaN;
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
for i=1:size(scenarioType,2)
|
||||
for j=1:numOfMobileDevices
|
||||
x=results(i,j); % Create Data
|
||||
SEM = std(x)/sqrt(length(x)); % Standard Error
|
||||
ts = tinv([0.05 0.95],length(x)-1); % T-Score
|
||||
CI = mean(x) + ts*SEM; % Confidence Intervals
|
||||
|
||||
if(CI(1) < 0)
|
||||
CI(1) = 0;
|
||||
end
|
||||
|
||||
if(CI(2) < 0)
|
||||
CI(2) = 0;
|
||||
end
|
||||
|
||||
min_results(i,j) = results(i,j) - CI(1);
|
||||
max_results(i,j) = CI(2) - results(i,j);
|
||||
end
|
||||
end
|
||||
|
||||
types = zeros(1,numOfMobileDevices);
|
||||
for i=1:numOfMobileDevices
|
||||
types(i)=startOfMobileDeviceLoop+((i-1)*stepOfMobileDeviceLoop);
|
||||
end
|
||||
|
||||
hFig = figure;
|
||||
pos=getConfiguration(7);
|
||||
fontSizeArray = getConfiguration(8);
|
||||
set(hFig, 'Units','centimeters');
|
||||
set(hFig, 'Position',pos);
|
||||
set(0,'DefaultAxesFontName','Times New Roman');
|
||||
set(0,'DefaultTextFontName','Times New Roman');
|
||||
set(0,'DefaultAxesFontSize',fontSizeArray(3));
|
||||
|
||||
if(getConfiguration(20) == 1)
|
||||
for i=1:1:numOfMobileDevices
|
||||
xIndex=startOfMobileDeviceLoop+((i-1)*stepOfMobileDeviceLoop);
|
||||
|
||||
markers = getConfiguration(50);
|
||||
for j=1:size(scenarioType,2)
|
||||
plot(xIndex, results(j,i),char(markers(j)),'MarkerFaceColor',getConfiguration(20+j),'color',getConfiguration(20+j));
|
||||
hold on;
|
||||
end
|
||||
end
|
||||
|
||||
for j=1:size(scenarioType,2)
|
||||
if(getConfiguration(19) == 1)
|
||||
errorbar(types, results(j,:), min_results(j,:),max_results(j,:),'-k','color',getConfiguration(20+j),'LineWidth',1);
|
||||
else
|
||||
plot(types, results(j,:),'-k','color',getConfiguration(20+j),'LineWidth',1);
|
||||
end
|
||||
hold on;
|
||||
end
|
||||
|
||||
set(gca,'color','none');
|
||||
else
|
||||
markers = getConfiguration(40);
|
||||
for j=1:size(scenarioType,2)
|
||||
if(getConfiguration(19) == 1)
|
||||
errorbar(types, results(j,:),min_results(j,:),max_results(j,:),char(markers(j)),'MarkerFaceColor','w','LineWidth',1);
|
||||
else
|
||||
plot(types, results(j,:),char(markers(j)),'MarkerFaceColor','w');
|
||||
end
|
||||
hold on;
|
||||
end
|
||||
|
||||
end
|
||||
|
||||
legends = getConfiguration(6);
|
||||
lgnd = legend(legends,'Location',legendPos);
|
||||
%lgnd.Position=[0.21,0.8,0.2,0.01];
|
||||
if(getConfiguration(20) == 1)
|
||||
set(lgnd,'color','none');
|
||||
end
|
||||
|
||||
xCoefficent = 100;
|
||||
if(getConfiguration(17) == 0)
|
||||
xCoefficent = 1;
|
||||
end
|
||||
|
||||
hold off;
|
||||
axis square
|
||||
xlabel(getConfiguration(9));
|
||||
step = stepOfxAxis*stepOfMobileDeviceLoop;
|
||||
set(gca,'XTick', step:step:endOfMobileDeviceLoop);
|
||||
set(gca,'XTickLabel', step/xCoefficent:step/xCoefficent:endOfMobileDeviceLoop/xCoefficent);
|
||||
ylabel(yLabel);
|
||||
set(gca,'XLim',[startOfMobileDeviceLoop-5 endOfMobileDeviceLoop+5]);
|
||||
|
||||
if(getConfiguration(17) == 1)
|
||||
xlim = get(gca,'XLim');
|
||||
ylim = get(gca,'YLim');
|
||||
text(1.02 * xlim(2), 0.165 * ylim(2), 'x 10^2');
|
||||
end
|
||||
|
||||
|
||||
set(get(gca,'Xlabel'),'FontSize',fontSizeArray(1));
|
||||
set(get(gca,'Ylabel'),'FontSize',fontSizeArray(1));
|
||||
set(lgnd,'FontSize',fontSizeArray(2));
|
||||
|
||||
if(getConfiguration(18) == 1)
|
||||
set(hFig, 'PaperUnits', 'centimeters');
|
||||
set(hFig, 'PaperPositionMode', 'manual');
|
||||
set(hFig, 'PaperPosition',[0 0 pos(3) pos(4)]);
|
||||
set(gcf, 'PaperSize', [pos(3) pos(4)]); %Keep the same paper size
|
||||
filename = strcat(folderPath,'\',int2str(rowOfset),'_',int2str(columnOfset),'_',appType);
|
||||
saveas(gcf, filename, 'pdf');
|
||||
end
|
||||
end
|
||||
@@ -0,0 +1,78 @@
|
||||
function [] = plotGenericPie(vmType, appType, threshold)
|
||||
folderPath = "D:\git-repos\PhD\EdgeCloudSim\sim_results";
|
||||
scenarioType = getConfiguration(5);
|
||||
startOfMobileDeviceLoop = 2000;
|
||||
stepOfMobileDeviceLoop = 2000;
|
||||
endOfMobileDeviceLoop = 2000;
|
||||
numOfMobileDevices = (endOfMobileDeviceLoop - startOfMobileDeviceLoop)/stepOfMobileDeviceLoop + 1;
|
||||
|
||||
if ~exist('appType','var')
|
||||
appType = 1;
|
||||
end
|
||||
|
||||
if ~exist('vmType','var')
|
||||
vmType = 'edge';
|
||||
end
|
||||
|
||||
total = zeros(1,size(scenarioType,2));
|
||||
found = zeros(1,size(scenarioType,2));
|
||||
|
||||
for s=1:size(scenarioType,2)
|
||||
for j=1:numOfMobileDevices
|
||||
try
|
||||
mobileDeviceNumber = startOfMobileDeviceLoop + stepOfMobileDeviceLoop * (j-1);
|
||||
filePath = strcat(folderPath,'\ite11\SIMRESULT_ITS_SCENARIO_',char(scenarioType(s)),'_',int2str(mobileDeviceNumber),'DEVICES_SUCCESS.log');
|
||||
|
||||
readData = dlmread(filePath,';',1,0);
|
||||
for k=1:size(readData,1)
|
||||
if(readData(k,7) == appType && ((strcmp(vmType,'edge') == 1 && readData(k,3) == 3) || (strcmp(vmType,'cloud') == 1 && readData(k,3) ~= 3) || strcmp(vmType,'all')==1))
|
||||
if(readData(k,12) - readData(k,11) > threshold)
|
||||
found(s) = found(s) + 1;
|
||||
end
|
||||
total(s) = total(s) + 1;
|
||||
end
|
||||
end
|
||||
catch err
|
||||
error(err)
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
hFig = figure;
|
||||
pos=getConfiguration(7);
|
||||
fontSizeArray = getConfiguration(8);
|
||||
set(hFig, 'Units','centimeters');
|
||||
set(hFig, 'Position',pos);
|
||||
set(0,'DefaultAxesFontName','Times New Roman');
|
||||
set(0,'DefaultTextFontName','Times New Roman');
|
||||
set(0,'DefaultAxesFontSize',fontSizeArray(3));
|
||||
|
||||
if(getConfiguration(20) == 1)
|
||||
%result = found ./ total .* 100;
|
||||
p = pie(found);
|
||||
hold on;
|
||||
end
|
||||
|
||||
txt = reshape(getConfiguration(6),[size(scenarioType,2) 1]);
|
||||
pText = findobj(p,'Type','text');
|
||||
percentValues = get(pText,'String');
|
||||
combinedtxt = strcat(txt,' (',percentValues,')');
|
||||
|
||||
for i=1:size(scenarioType,2)
|
||||
pText(i).String = combinedtxt(i);
|
||||
end
|
||||
|
||||
set(pText,'fontsize',fontSizeArray(1))
|
||||
|
||||
hold off;
|
||||
axis square
|
||||
|
||||
if(getConfiguration(18) == 1)
|
||||
set(hFig, 'PaperUnits', 'centimeters');
|
||||
set(hFig, 'PaperPositionMode', 'manual');
|
||||
set(hFig, 'PaperPosition',[0 0 pos(3) pos(4)]);
|
||||
set(gcf, 'PaperSize', [pos(3) pos(4)]); %Keep the same paper size
|
||||
filename = strcat(folderPath,'\',int2str(rowOfset),'_',int2str(columnOfset),'_',appType);
|
||||
saveas(gcf, filename, 'pdf');
|
||||
end
|
||||
end
|
||||
@@ -0,0 +1,96 @@
|
||||
function [] = plotGenericScatter(yLabel, xLabel, legendPos, vmType, appType, drawLine)
|
||||
folderPath = "D:\git-repos\PhD\EdgeCloudSim\sim_results";
|
||||
scenarioType = getConfiguration(5);
|
||||
simulationTime = getConfiguration(2);
|
||||
startOfMobileDeviceLoop = 2000;
|
||||
stepOfMobileDeviceLoop = 2000;
|
||||
endOfMobileDeviceLoop = 2000;
|
||||
numOfMobileDevices = (endOfMobileDeviceLoop - startOfMobileDeviceLoop)/stepOfMobileDeviceLoop + 1;
|
||||
|
||||
if ~exist('appType','var')
|
||||
appType = 1;
|
||||
end
|
||||
|
||||
if ~exist('vmType','var')
|
||||
vmType = 'edge';
|
||||
end
|
||||
|
||||
result_x = NaN(size(scenarioType,2), 5000);
|
||||
result_y = NaN(size(result_x,1), size(result_x,2));
|
||||
%result_sz = NaN(size(result_x,1), size(result_x,2));
|
||||
|
||||
for s=1:size(scenarioType,2)
|
||||
index = 1;
|
||||
firstDeviceId = -1;
|
||||
for j=1:numOfMobileDevices
|
||||
try
|
||||
mobileDeviceNumber = startOfMobileDeviceLoop + stepOfMobileDeviceLoop * (j-1);
|
||||
filePath = strcat(folderPath,'\ite11\SIMRESULT_ITS_SCENARIO_',char(scenarioType(s)),'_',int2str(mobileDeviceNumber),'DEVICES_SUCCESS.log');
|
||||
|
||||
readData = dlmread(filePath,';',1,0);
|
||||
for k=1:size(readData,1)
|
||||
if(readData(k,7) == appType && ((strcmp(vmType,'edge') == 1 && readData(k,3) == 3) || (strcmp(vmType,'cloud') == 1 && readData(k,3) ~= 3) || strcmp(vmType,'all')==1))
|
||||
if(firstDeviceId == -1)
|
||||
firstDeviceId = readData(k,2);
|
||||
end
|
||||
if(readData(k,2) == firstDeviceId) % && readData(k,11) - readData(k,10) < 2
|
||||
result_y(s, index) = readData(k,12) - readData(k,11);
|
||||
result_x(s, index) = readData(k,12) / 60;
|
||||
%result_sz(s, index) = j*10;
|
||||
index = index + 1;
|
||||
end
|
||||
end
|
||||
end
|
||||
catch err
|
||||
error(err)
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
hFig = figure;
|
||||
pos=getConfiguration(7);
|
||||
fontSizeArray = getConfiguration(8);
|
||||
set(hFig, 'Units','centimeters');
|
||||
set(hFig, 'Position',pos);
|
||||
set(0,'DefaultAxesFontName','Times New Roman');
|
||||
set(0,'DefaultTextFontName','Times New Roman');
|
||||
set(0,'DefaultAxesFontSize',fontSizeArray(3));
|
||||
|
||||
if(getConfiguration(20) == 1)
|
||||
for i=1:size(scenarioType,2)
|
||||
scatter(result_x(i,:), result_y(i,:));
|
||||
hold on;
|
||||
end
|
||||
|
||||
if exist('drawLine','var')
|
||||
y = [drawLine, drawLine];
|
||||
x = [0, simulationTime];
|
||||
plot(x,y);
|
||||
end
|
||||
end
|
||||
|
||||
legends = getConfiguration(6);
|
||||
lgnd = legend(legends,'Location',legendPos);
|
||||
%lgnd.Position=[0.21,0.8,0.2,0.01];
|
||||
if(getConfiguration(20) == 1)
|
||||
set(lgnd,'color','none');
|
||||
end
|
||||
|
||||
hold off;
|
||||
axis square
|
||||
xlabel(xLabel);
|
||||
ylabel(yLabel);
|
||||
|
||||
set(get(gca,'Xlabel'),'FontSize',fontSizeArray(1));
|
||||
set(get(gca,'Ylabel'),'FontSize',fontSizeArray(1));
|
||||
set(lgnd,'FontSize',fontSizeArray(2));
|
||||
|
||||
if(getConfiguration(18) == 1)
|
||||
set(hFig, 'PaperUnits', 'centimeters');
|
||||
set(hFig, 'PaperPositionMode', 'manual');
|
||||
set(hFig, 'PaperPosition',[0 0 pos(3) pos(4)]);
|
||||
set(gcf, 'PaperSize', [pos(3) pos(4)]); %Keep the same paper size
|
||||
filename = strcat(folderPath,'\',int2str(rowOfset),'_',int2str(columnOfset),'_',appType);
|
||||
saveas(gcf, filename, 'pdf');
|
||||
end
|
||||
end
|
||||
@@ -0,0 +1,66 @@
|
||||
function [] = plotLocation()
|
||||
folderPath = getConfiguration(1);
|
||||
numOfSimulations = getConfiguration(3);
|
||||
stepOfxAxis = getConfiguration(4);
|
||||
startOfMobileDeviceLoop = 500;
|
||||
stepOfMobileDeviceLoop = 500;
|
||||
endOfMobileDeviceLoop = 1500;
|
||||
numOfMobileDevices = (endOfMobileDeviceLoop - startOfMobileDeviceLoop)/stepOfMobileDeviceLoop + 1;
|
||||
PlaceCount = 40;
|
||||
|
||||
results = zeros(numOfMobileDevices, PlaceCount);
|
||||
|
||||
for s=1:numOfSimulations
|
||||
indexCounter = 1;
|
||||
for i=startOfMobileDeviceLoop:stepOfMobileDeviceLoop:endOfMobileDeviceLoop
|
||||
try
|
||||
filePath = strcat(folderPath,'\ite',int2str(s),'\SIMRESULT_ITS_SCENARIO_AI_BASED_',int2str(i),'DEVICES_LOCATION.log');
|
||||
readData = dlmread(filePath,';',1,0);
|
||||
|
||||
for j=1:PlaceCount
|
||||
results(indexCounter,j) = results(indexCounter,j) + mean(readData(:,j+1));
|
||||
end
|
||||
catch err
|
||||
error(err)
|
||||
end
|
||||
indexCounter = indexCounter + 1;
|
||||
end
|
||||
end
|
||||
results = results/numOfSimulations;
|
||||
|
||||
xValues = {};
|
||||
yValues = {};
|
||||
|
||||
indexCounter = 1;
|
||||
for i=startOfMobileDeviceLoop:stepOfMobileDeviceLoop:endOfMobileDeviceLoop
|
||||
xValues(indexCounter) = {int2str(i)};
|
||||
indexCounter = indexCounter + 1;
|
||||
end
|
||||
for i=1:PlaceCount
|
||||
yValues(i) = {int2str(i)}
|
||||
end
|
||||
|
||||
hFig=figure;
|
||||
%pos=getConfiguration(7);
|
||||
pos=[10 3 24 6];
|
||||
set(hFig, 'Units','centimeters');
|
||||
set(hFig, 'Position',pos);
|
||||
|
||||
C = [0,172,0;2,171,0;5,171,0;7,171,0;10,171,0;12,171,0;15,171,0;17,171,0;20,171,0;22,171,0;25,170,0;27,170,0;30,170,0;32,170,0;35,170,0;37,170,0;40,170,0;42,170,0;45,170,0;47,169,0;50,169,0;52,169,0;55,169,0;57,169,0;60,169,0;62,169,0;65,169,0;67,169,0;70,168,0;72,168,0;75,168,0;77,168,0;80,168,0;82,168,0;85,168,0;87,168,0;90,168,0;92,168,0;95,167,0;97,167,0;100,167,0;102,167,0;105,167,0;107,167,0;110,167,0;112,167,0;115,167,0;117,166,0;120,166,0;122,166,0;125,166,0;127,166,0;130,166,0;132,166,0;135,166,0;137,166,0;140,165,0;142,165,0;145,165,0;147,165,0;150,165,0;152,165,0;155,165,0;157,165,0;159,164,0;160,164,0;161,163,0;162,162,0;163,162,0;163,161,0;164,160,0;165,159,0;166,159,0;167,158,0;168,157,0;168,157,0;169,156,0;170,155,0;171,154,0;172,154,0;172,153,0;173,152,0;174,152,0;175,151,0;176,150,0;176,149,0;177,149,0;178,148,0;179,147,0;180,147,0;181,146,0;181,145,0;182,144,0;183,144,0;184,143,0;185,142,0;185,142,0;186,141,0;187,140,0;188,139,0;189,139,0;189,138,0;190,137,0;191,137,0;192,136,0;193,135,0;193,134,0;194,134,0;195,133,0;196,132,0;197,132,0;198,131,0;198,130,0;199,129,0;200,129,0;201,128,0;202,127,0;202,127,0;203,126,0;204,125,0;205,124,0;206,124,0;206,123,0;207,122,0;208,122,0;209,121,0;210,120,0;211,119,0;211,119,0;211,118,0;211,117,0;210,116,0;210,115,0;210,114,0;210,113,0;210,112,0;210,111,0;209,110,0;209,109,0;209,108,0;209,107,0;209,106,0;208,105,0;208,104,0;208,103,0;208,102,0;208,102,0;208,101,0;207,100,0;207,99,0;207,98,0;207,97,0;207,96,0;207,95,0;206,94,0;206,93,0;206,92,0;206,91,0;206,90,0;206,89,0;205,88,0;205,87,0;205,86,0;205,85,0;205,84,0;205,84,0;204,83,0;204,82,0;204,81,0;204,80,0;204,79,0;204,78,0;203,77,0;203,76,0;203,75,0;203,74,0;203,73,0;203,72,0;202,71,0;202,70,0;202,69,0;202,68,0;202,67,0;202,67,0;201,66,0;201,65,0;201,64,0;201,63,0;201,62,0;201,61,0;200,60,0;200,59,0;199,58,0;198,57,0;197,56,0;196,55,0;195,54,0;194,53,0;193,53,0;192,52,0;191,51,0;190,50,0;189,49,0;188,48,0;187,47,0;186,46,0;185,45,0;184,44,0;183,43,0;182,42,0;181,41,0;180,41,0;179,40,0;177,39,0;176,38,0;175,37,0;174,36,0;173,35,0;172,34,0;171,33,0;170,32,0;169,31,0;168,30,0;167,29,0;166,29,0;165,28,0;164,27,0;163,26,0;162,25,0;161,24,0;160,23,0;159,22,0;158,21,0;157,20,0;156,19,0;155,18,0;153,18,0;152,17,0;151,16,0;150,15,0;149,14,0;148,13,0;147,12,0;146,11,0;145,10,0;144,9,0;143,8,0;142,7,0;141,6,0;140,6,0;139,5,0;138,4,0;137,3,0;136,2,0;135,1,0;134,0,0];
|
||||
|
||||
h = heatmap(yValues, xValues, results, 'Colormap', colormap(C/255),'FontName','Times New Roman','FontSize',11);
|
||||
|
||||
h.Title = 'Mean number of vehicles per places';
|
||||
h.XLabel = 'Place IDs';
|
||||
h.YLabel = '#Vehicle in simulation';
|
||||
|
||||
if(getConfiguration(18) == 1)
|
||||
set(hFig, 'PaperUnits', 'centimeters');
|
||||
set(hFig, 'PaperPositionMode', 'manual');
|
||||
set(hFig, 'PaperPosition',[0 0 pos(3) pos(4)]);
|
||||
set(gcf, 'PaperSize', [pos(3) pos(4)]); %Keep the same paper size
|
||||
filename = strcat(folderPath,'\position');
|
||||
saveas(gcf, filename, 'pdf');
|
||||
end
|
||||
|
||||
end
|
||||
@@ -0,0 +1,15 @@
|
||||
function [] = plotTaskFailureReason()
|
||||
|
||||
plotGenericLine(1, 10, 'Failed Task due to VM Capacity (%)', 'ALL_APPS', 'NorthWest', 1);
|
||||
|
||||
plotGenericLine(1, 11, 'Failed Task due to Mobility (%)', 'ALL_APPS', 'NorthWest', 1);
|
||||
|
||||
plotGenericLine(5, 5, 'Failed Tasks due to WLAN (%)', 'ALL_APPS', 'NorthWest', 1);
|
||||
|
||||
plotGenericLine(5, 6, 'Failed Tasks due to MAN failure (%)', 'ALL_APPS', 'NorthWest', 1);
|
||||
|
||||
plotGenericLine(5, 7, 'Failed Tasks due to WAN failure (%)', 'ALL_APPS', 'NorthWest', 1);
|
||||
|
||||
plotGenericLine(5, 8, 'Failed Tasks due to GSM failure (%)', 'ALL_APPS', 'NorthEast', 1);
|
||||
|
||||
end
|
||||
@@ -0,0 +1,7 @@
|
||||
function [] = plotTimeComplexity()
|
||||
|
||||
plotGenericLine(6, 1, 'Simulation Time (minute)', 'ALL_APPS', 'NorthWest', 0, 60);
|
||||
|
||||
plotGenericLine(6, 2, 'Orchestration Algorithm Overhead (micro second)', 'ALL_APPS', 'NorthEast', 0, 1000);
|
||||
|
||||
end
|
||||
@@ -0,0 +1,75 @@
|
||||
#!/bin/bash
|
||||
if [ "$#" -ne 2 ]; then
|
||||
echo "Missing arguments! Please provide number of parallel processes and number of iterations."
|
||||
echo "Usage: '$0 4 10'"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
re='^[0-9]+$'
|
||||
if ! [[ $1 =~ $re ]] ; then
|
||||
echo "$1 is not an integer! Please provide number of parallel processes."
|
||||
echo "Usage: '$0 4 10'"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
if ! [[ $2 =~ $re ]] ; then
|
||||
echo "$1 is not an integer! Please provide number of iterations."
|
||||
echo "Usage: '$0 4 10'"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
script_root_path="$(dirname "$(readlink -f "$0")")"
|
||||
root_out_folder=${script_root_path}/output
|
||||
num_of_processes=$1
|
||||
iterationNumber=$2
|
||||
process_counter=0
|
||||
|
||||
date=$(date '+%d-%m-%Y_%H-%M')
|
||||
simulation_out_folder=${root_out_folder}/${date}
|
||||
mkdir -p $simulation_out_folder
|
||||
|
||||
simulations=$(cat ${script_root_path}/simulation.list)
|
||||
|
||||
rm -rf ${script_root_path}/tmp_runner*
|
||||
|
||||
for sim_args in $simulations
|
||||
do
|
||||
scenario_name=$(echo $sim_args | cut -d ';' -f1)
|
||||
edge_devices_file=$(echo $sim_args | cut -d ';' -f2)
|
||||
applications_file=$(echo $sim_args | cut -d ';' -f3)
|
||||
mkdir -p $simulation_out_folder/${scenario_name}
|
||||
echo "STARTED" > $simulation_out_folder/${scenario_name}/progress.log
|
||||
|
||||
for (( i=1; i<=$iterationNumber; i++ ))
|
||||
do
|
||||
process_id=$(($process_counter % $num_of_processes))
|
||||
process_counter=$(($process_counter + 1))
|
||||
|
||||
echo "${script_root_path}/runner.sh $simulation_out_folder $scenario_name $edge_devices_file $applications_file ${i}" >> "${simulation_out_folder}/tmp_runner${process_id}.sh"
|
||||
done
|
||||
done
|
||||
|
||||
#num_of_cores=$(grep -c ^processor /proc/cpuinfo)
|
||||
|
||||
for (( i=0; i<$num_of_processes; i++ ))
|
||||
do
|
||||
chmod +x ${simulation_out_folder}/tmp_runner${i}.sh
|
||||
${simulation_out_folder}/tmp_runner${i}.sh &
|
||||
# pid=$!
|
||||
# cpu=$(($i % $num_of_cores))
|
||||
# taskset -cp $cpu,$cpu $pid
|
||||
done
|
||||
|
||||
echo "###############################################################"
|
||||
echo " SIMULARIONS ARE STARTED!"
|
||||
echo "###############################################################"
|
||||
echo "You can follow the progress via the following command"
|
||||
echo "tail -f <scenario_folder>/progress.log"
|
||||
echo "e.g."
|
||||
echo "tail -f output/${date}/${scenario_name}/progress.log"
|
||||
echo "###############################################################"
|
||||
echo "You can inspect each iteration via the following command"
|
||||
echo "tail -f <scenario_folder>/ite[n].log"
|
||||
echo "e.g."
|
||||
echo "tail -f output/${date}/${scenario_name}/ite1.log"
|
||||
echo "###############################################################"
|
||||
@@ -0,0 +1,25 @@
|
||||
#!/bin/sh
|
||||
|
||||
script_root_path="$(dirname "$(readlink -f "$0")")"
|
||||
simulation_out_folder=$1
|
||||
scenario_name=$2
|
||||
edge_devices_file=$3
|
||||
applications_file=$4
|
||||
iteration_number=$5
|
||||
|
||||
scenario_out_folder=${simulation_out_folder}/${scenario_name}/ite${iteration_number}
|
||||
scenario_conf_file=${script_root_path}/config/${scenario_name}.properties
|
||||
scenario_edge_devices_file=${script_root_path}/config/${edge_devices_file}
|
||||
scenario_applications_file=${script_root_path}/config/${applications_file}
|
||||
|
||||
mkdir -p $scenario_out_folder
|
||||
java -classpath '../../bin:../../lib/cloudsim-4.0.jar:../../lib/commons-math3-3.6.1.jar:../../lib/colt.jar:../../lib/weka.jar:../../lib/mtj-1.0.4.jar' -Djava.library.path=../../lib/native/linux edu.boun.edgecloudsim.applications.vec_ai_app.VehicularMainApp $scenario_conf_file $scenario_edge_devices_file $scenario_applications_file $scenario_out_folder $iteration_number > ${scenario_out_folder}.log
|
||||
|
||||
if [ $? -eq 0 ]; then
|
||||
echo "ite${iteration_number} OK" >> ${simulation_out_folder}/${scenario_name}/progress.log
|
||||
else
|
||||
echo "ite${iteration_number} FAIL !!!" >> ${simulation_out_folder}/${scenario_name}/progress.log
|
||||
fi
|
||||
|
||||
#tar -czf ${scenario_out_folder}.tar.gz -C $simulation_out_folder/${scenario_name} ite${iteration_number}
|
||||
#rm -rf $scenario_out_folder
|
||||
@@ -0,0 +1 @@
|
||||
default_config;edge_devices.xml;applications.xml
|
||||
@@ -0,0 +1,15 @@
|
||||
#!/bin/sh
|
||||
|
||||
echo "This script kills all java processes including Eclipse etc."
|
||||
read -p "Do you want to continue[y/n]? " REPLY
|
||||
|
||||
if [ "$REPLY" = "y" ]
|
||||
then
|
||||
while pgrep java >/dev/null 2>&1
|
||||
do
|
||||
killall java
|
||||
sleep 1
|
||||
done
|
||||
fi
|
||||
|
||||
echo "Operation completed. bye..."
|
||||
Reference in New Issue
Block a user