library(ggplot2) 
setwd('../Results')

### GRAPH FOR THE ENERGY MODEL USED - using the data from Ahvar et al. Parasilo server
####Begin
powerCore =c(98,148,161,176,178,180,184,200,208,212,215,217,218,221,230,237,241)

piecewisePowerAccordingToUse <- function(utilization){
  j <- floor(utilization * 16) #utilization should be between 0 and 1
  print(j)
  index<- j+1 #R indexes vector from 1
  powerRes <- (powerCore[index+1]-powerCore[index])*16*utilization+((j+1)*powerCore[index]-j*powerCore[index+1])
}

##Calculate the values for devices 6 and devices 8
oneCoreUtilizationParasilo= 1/16

utilizationPrevious_d5=0.3592 #Between 0 and 1
start_d5 = piecewisePowerAccordingToUse(utilizationPrevious_d5)
end_d5=piecewisePowerAccordingToUse(utilizationPrevious_d5+oneCoreUtilizationParasilo)
diff_d5=end_d5-start_d5

utilizationPrevious_d7=0.5165 #Between 0 and 1
start_d7 = piecewisePowerAccordingToUse(utilizationPrevious_d7)
end_d7=piecewisePowerAccordingToUse(utilizationPrevious_d7+oneCoreUtilizationParasilo)
diff_d7=end_d7-start_d7

##Highlight these areas on the curve
highlight <- data.frame(start=c(utilizationPrevious_d5,utilizationPrevious_d7), 
                        end=c(utilizationPrevious_d5+oneCoreUtilizationParasilo,utilizationPrevious_d7+oneCoreUtilizationParasilo),
                        group=c("device 5", "device 7"))
ggplot()+xlim(0,1) + ylim(0,250)+ geom_function(fun=piecewisePowerAccordingToUse)+
  geom_rect(data=highlight, inherit.aes=FALSE, aes(xmin=start, xmax=end, ymin=min(0),
                                                   ymax=max(250), group=group), color="transparent", fill=c("#0072B2","#F0E442"), alpha=0.3)+
  theme_minimal()+
  ylab("Power (W)")+
  xlab("Utilization")+
  theme(legend.position = "top",axis.title.x = element_text(size = 20),
        axis.text.x = element_text(size = 20),
        axis.title.y = element_text(size = 20),
        axis.text.y = element_text(size = 20),
        legend.text=element_text(size = 20),
        legend.title=element_text(size = 20))
####End


### INITIAL STUDY
# Device and links loaded

####Begin
### Getting the data
result_data_csv <- read.csv(file="./InitialStudy/resultsParsed_40rep_DeviceLinkVar_2replicas_Std10_RequestDevice4.csv", header=TRUE, sep=",")
#Adding the load level column
result_data_csv$LoadLevel <- result_data_csv$Scenario*10 

#Number of different placements - = length of the utilizationDiff variable
#27.84%

###Filter per loadLevel
loadLevel0_Overall <- result_data_csv[which(result_data_csv$LoadLevel == 0 & result_data_csv$Alternative=="Overall"),]
loadLevel0_Marginal <- result_data_csv[which(result_data_csv$LoadLevel == 0 & result_data_csv$Alternative=="Marginal"),]
loadLevel1_Overall <- result_data_csv[which(result_data_csv$LoadLevel == 10 & result_data_csv$Alternative=="Overall"),]
loadLevel1_Marginal <- result_data_csv[which(result_data_csv$LoadLevel == 10 & result_data_csv$Alternative=="Marginal"),]
loadLevel2_Overall <- result_data_csv[which(result_data_csv$LoadLevel == 20 & result_data_csv$Alternative=="Overall"),]
loadLevel2_Marginal <- result_data_csv[which(result_data_csv$LoadLevel == 20 & result_data_csv$Alternative=="Marginal"),]
loadLevel3_Overall <- result_data_csv[which(result_data_csv$LoadLevel == 30 & result_data_csv$Alternative=="Overall"),]
loadLevel3_Marginal <- result_data_csv[which(result_data_csv$LoadLevel == 30 & result_data_csv$Alternative=="Marginal"),]
loadLevel4_Overall <- result_data_csv[which(result_data_csv$LoadLevel == 40 & result_data_csv$Alternative=="Overall"),]
loadLevel4_Marginal <- result_data_csv[which(result_data_csv$LoadLevel == 40 & result_data_csv$Alternative=="Marginal"),]
loadLevel5_Overall <- result_data_csv[which(result_data_csv$LoadLevel == 50 & result_data_csv$Alternative=="Overall"),]
loadLevel5_Marginal <- result_data_csv[which(result_data_csv$LoadLevel == 50 & result_data_csv$Alternative=="Marginal"),]
loadLevel6_Overall <- result_data_csv[which(result_data_csv$LoadLevel == 60 & result_data_csv$Alternative=="Overall"),]
loadLevel6_Marginal <- result_data_csv[which(result_data_csv$LoadLevel == 60 & result_data_csv$Alternative=="Marginal"),]
loadLevel7_Overall <- result_data_csv[which(result_data_csv$LoadLevel == 70 & result_data_csv$Alternative=="Overall"),]
loadLevel7_Marginal <- result_data_csv[which(result_data_csv$LoadLevel == 70 & result_data_csv$Alternative=="Marginal"),]
loadLevel8_Overall <- result_data_csv[which(result_data_csv$LoadLevel == 80 & result_data_csv$Alternative=="Overall"),]
loadLevel8_Marginal <- result_data_csv[which(result_data_csv$LoadLevel == 80 & result_data_csv$Alternative=="Marginal"),]
loadLevel9_Overall <- result_data_csv[which(result_data_csv$LoadLevel == 90 & result_data_csv$Alternative=="Overall"),]
loadLevel9_Marginal <- result_data_csv[which(result_data_csv$LoadLevel == 90 & result_data_csv$Alternative=="Marginal"),]
loadLevel10_Overall <- result_data_csv[which(result_data_csv$LoadLevel == 100 & result_data_csv$Alternative=="Overall"),]
loadLevel10_Marginal <- result_data_csv[which(result_data_csv$LoadLevel == 100 & result_data_csv$Alternative=="Marginal"),]


##Visualizing the difference
#Calculate the difference - for Overall Energy
diffLoadLevel0_Overall <- loadLevel0_Marginal$OverallEnergy - loadLevel0_Overall$OverallEnergy
diffLoadLevel1_Overall <- loadLevel1_Marginal$OverallEnergy - loadLevel1_Overall$OverallEnergy
diffLoadLevel2_Overall <- loadLevel2_Marginal$OverallEnergy - loadLevel2_Overall$OverallEnergy
diffLoadLevel3_Overall <- loadLevel3_Marginal$OverallEnergy - loadLevel3_Overall$OverallEnergy
diffLoadLevel4_Overall <- loadLevel4_Marginal$OverallEnergy - loadLevel4_Overall$OverallEnergy
diffLoadLevel5_Overall <- loadLevel5_Marginal$OverallEnergy - loadLevel5_Overall$OverallEnergy
diffLoadLevel6_Overall <- loadLevel6_Marginal$OverallEnergy - loadLevel6_Overall$OverallEnergy
diffLoadLevel7_Overall <- loadLevel7_Marginal$OverallEnergy - loadLevel7_Overall$OverallEnergy
diffLoadLevel8_Overall <- loadLevel8_Marginal$OverallEnergy - loadLevel8_Overall$OverallEnergy
diffLoadLevel9_Overall <- loadLevel9_Marginal$OverallEnergy - loadLevel9_Overall$OverallEnergy
diffLoadLevel10_Overall <- loadLevel10_Marginal$OverallEnergy - loadLevel10_Overall$OverallEnergy
diffLoadLevel_Overall = list(diffLoadLevel0_Overall,diffLoadLevel1_Overall,diffLoadLevel2_Overall,
                             diffLoadLevel3_Overall,diffLoadLevel4_Overall,diffLoadLevel5_Overall,
                             diffLoadLevel6_Overall,diffLoadLevel7_Overall,diffLoadLevel8_Overall,
                             diffLoadLevel9_Overall,diffLoadLevel10_Overall)
#Calculating how many are same, different and infeasible
same=rep(0,11)
different=rep(0,11)
infeasible=rep(0,11)
for (levelNb in seq(1,11)){
  print(levelNb)
  print(diffLoadLevel_Overall[levelNb])
  for(diff in diffLoadLevel_Overall[[levelNb]]){
    print(diff)
    if (is.na(diff)){infeasible[levelNb]=infeasible[levelNb]+1}
    else if (diff==0){same[levelNb]=same[levelNb]+1}
    else if (diff>0){different[levelNb]=different[levelNb]+1}
  }
}

##Create the dataframe for plotting the difference
LoadLevel= rep(seq(0,100,10),3)
Outcome=c(rep("Same",11),rep("Different",11),rep("Infeasible",11))
NbPlacements=c(same,different,infeasible)
nbDifferentPlacements =data.frame(LoadLevel,Outcome,NbPlacements)

### Plot - Nb of different placement
ggplot(data=nbDifferentPlacements, aes(x=LoadLevel, y=NbPlacements, fill=Outcome)) +
  geom_bar(stat="identity", position = position_stack())+
  theme_minimal()+
  ylab("# obtained placements")+
  xlab("Average load level in %")+
  labs(fill = "Overall and Marginal placements are")+
  scale_fill_manual(values=c("#A95AA1","#F5793A","#85C0F9"))+
  theme(legend.position = "top",axis.title.x = element_text(size = 20),
        axis.text.x = element_text(size = 20),
        axis.title.y = element_text(size = 20),
        axis.text.y = element_text(size = 20),
        legend.text=element_text(size = 20),
        legend.title=element_text(size = 20))

###Looking at run 12 for loadlevel 5 for a in-depth analysis
####End


## LOAD HETEROGENEITY STUDIES
#Only devices loaded

### FIXED LOAD
####Begin
### Getting the data
result_data_csv <- read.csv(file="./FixedLoad/resultsParsed_40rep_DeviceOnlyVar_2replicas_Uniform_RequestDevice4.csv", header=TRUE, sep=",")

#Adding the load level column
result_data_csv$LoadLevel <- result_data_csv$Scenario*10 

###Filter per loadLevel
loadLevel0_Overall <- result_data_csv[which(result_data_csv$LoadLevel == 0 & result_data_csv$Alternative=="Overall"),]
loadLevel0_Marginal <- result_data_csv[which(result_data_csv$LoadLevel == 0 & result_data_csv$Alternative=="Marginal"),]
loadLevel1_Overall <- result_data_csv[which(result_data_csv$LoadLevel == 10 & result_data_csv$Alternative=="Overall"),]
loadLevel1_Marginal <- result_data_csv[which(result_data_csv$LoadLevel == 10 & result_data_csv$Alternative=="Marginal"),]
loadLevel2_Overall <- result_data_csv[which(result_data_csv$LoadLevel == 20 & result_data_csv$Alternative=="Overall"),]
loadLevel2_Marginal <- result_data_csv[which(result_data_csv$LoadLevel == 20 & result_data_csv$Alternative=="Marginal"),]
loadLevel3_Overall <- result_data_csv[which(result_data_csv$LoadLevel == 30 & result_data_csv$Alternative=="Overall"),]
loadLevel3_Marginal <- result_data_csv[which(result_data_csv$LoadLevel == 30 & result_data_csv$Alternative=="Marginal"),]
loadLevel4_Overall <- result_data_csv[which(result_data_csv$LoadLevel == 40 & result_data_csv$Alternative=="Overall"),]
loadLevel4_Marginal <- result_data_csv[which(result_data_csv$LoadLevel == 40 & result_data_csv$Alternative=="Marginal"),]
loadLevel5_Overall <- result_data_csv[which(result_data_csv$LoadLevel == 50 & result_data_csv$Alternative=="Overall"),]
loadLevel5_Marginal <- result_data_csv[which(result_data_csv$LoadLevel == 50 & result_data_csv$Alternative=="Marginal"),]
loadLevel6_Overall <- result_data_csv[which(result_data_csv$LoadLevel == 60 & result_data_csv$Alternative=="Overall"),]
loadLevel6_Marginal <- result_data_csv[which(result_data_csv$LoadLevel == 60 & result_data_csv$Alternative=="Marginal"),]
loadLevel7_Overall <- result_data_csv[which(result_data_csv$LoadLevel == 70 & result_data_csv$Alternative=="Overall"),]
loadLevel7_Marginal <- result_data_csv[which(result_data_csv$LoadLevel == 70 & result_data_csv$Alternative=="Marginal"),]
loadLevel8_Overall <- result_data_csv[which(result_data_csv$LoadLevel == 80 & result_data_csv$Alternative=="Overall"),]
loadLevel8_Marginal <- result_data_csv[which(result_data_csv$LoadLevel == 80 & result_data_csv$Alternative=="Marginal"),]
loadLevel9_Overall <- result_data_csv[which(result_data_csv$LoadLevel == 90 & result_data_csv$Alternative=="Overall"),]
loadLevel9_Marginal <- result_data_csv[which(result_data_csv$LoadLevel == 90 & result_data_csv$Alternative=="Marginal"),]
loadLevel10_Overall <- result_data_csv[which(result_data_csv$LoadLevel == 100 & result_data_csv$Alternative=="Overall"),]
loadLevel10_Marginal <- result_data_csv[which(result_data_csv$LoadLevel == 100 & result_data_csv$Alternative=="Marginal"),]


##Working on visualizing the difference
#Calculate the difference - for Overall Energy
diffLoadLevel0_Overall <- loadLevel0_Marginal$OverallEnergy - loadLevel0_Overall$OverallEnergy
diffLoadLevel1_Overall <- loadLevel1_Marginal$OverallEnergy - loadLevel1_Overall$OverallEnergy
diffLoadLevel2_Overall <- loadLevel2_Marginal$OverallEnergy - loadLevel2_Overall$OverallEnergy
diffLoadLevel3_Overall <- loadLevel3_Marginal$OverallEnergy - loadLevel3_Overall$OverallEnergy
diffLoadLevel4_Overall <- loadLevel4_Marginal$OverallEnergy - loadLevel4_Overall$OverallEnergy
diffLoadLevel5_Overall <- loadLevel5_Marginal$OverallEnergy - loadLevel5_Overall$OverallEnergy
diffLoadLevel6_Overall <- loadLevel6_Marginal$OverallEnergy - loadLevel6_Overall$OverallEnergy
diffLoadLevel7_Overall <- loadLevel7_Marginal$OverallEnergy - loadLevel7_Overall$OverallEnergy
diffLoadLevel8_Overall <- loadLevel8_Marginal$OverallEnergy - loadLevel8_Overall$OverallEnergy
diffLoadLevel9_Overall <- loadLevel9_Marginal$OverallEnergy - loadLevel9_Overall$OverallEnergy
diffLoadLevel10_Overall <- loadLevel10_Marginal$OverallEnergy - loadLevel10_Overall$OverallEnergy
diffLoadLevel_Overall = list(diffLoadLevel0_Overall,diffLoadLevel1_Overall,diffLoadLevel2_Overall,
                             diffLoadLevel3_Overall,diffLoadLevel4_Overall,diffLoadLevel5_Overall,
                             diffLoadLevel6_Overall,diffLoadLevel7_Overall,diffLoadLevel8_Overall,
                             diffLoadLevel9_Overall,diffLoadLevel10_Overall)
#Calculating how many are same, different and infeasible
same=rep(0,11)
different=rep(0,11)
infeasible=rep(0,11)
for (levelNb in seq(1,11)){
  print(levelNb)
  print(diffLoadLevel_Overall[levelNb])
  for(diff in diffLoadLevel_Overall[[levelNb]]){
    print(diff)
    if (is.na(diff)){infeasible[levelNb]=infeasible[levelNb]+1}
    else if (diff==0){same[levelNb]=same[levelNb]+1}
    else if (diff>0){different[levelNb]=different[levelNb]+1}
  }
}

##Create the dataframe for plotting the difference
LoadLevel= rep(seq(0,100,10),3)
Outcome=c(rep("Same",11),rep("Different",11),rep("Infeasible",11))
NbPlacements=c(same,different,infeasible)
nbDifferentPlacements =data.frame(LoadLevel,Outcome,NbPlacements)

### Plot - Nb of different placement
ggplot(data=nbDifferentPlacements, aes(x=LoadLevel, y=NbPlacements, fill=Outcome)) +
  geom_bar(stat="identity", position = position_stack())+
  theme_minimal()+
  ylab("# obtained placements")+
  xlab("Average load level in %")+
  labs(fill = "Overall and Marginal placements are")+
  scale_fill_manual(values=c("#A95AA1","#F5793A","#85C0F9"))+
  theme(legend.position = "top",axis.title.x = element_text(size = 24),
        axis.text.x = element_text(size = 24),
        axis.title.y = element_text(size = 24),
        axis.text.y = element_text(size = 24),
        legend.text=element_text(size = 24),
        legend.title=element_text(size = 24))
####End

## NORMALLY DISTRIBUTED LOAD - STD 10 (2 function instances/replicas)

#Graphs for the categorization of placements and the relative difference in overall/marginal energy
####Begin
### Getting the data
result_data_csv <- read.csv(file="./NormallyDistributedLoad/resultsParsed_40rep_DeviceOnlyVar_2replicas_Std10_RequestDevice4.csv", header=TRUE, sep=",")

#Adding the load level column
result_data_csv$LoadLevel <- result_data_csv$Scenario*10 

###Filter per loadLevel
loadLevel0_Overall <- result_data_csv[which(result_data_csv$LoadLevel == 0 & result_data_csv$Alternative=="Overall"),]
loadLevel0_Marginal <- result_data_csv[which(result_data_csv$LoadLevel == 0 & result_data_csv$Alternative=="Marginal"),]
loadLevel1_Overall <- result_data_csv[which(result_data_csv$LoadLevel == 10 & result_data_csv$Alternative=="Overall"),]
loadLevel1_Marginal <- result_data_csv[which(result_data_csv$LoadLevel == 10 & result_data_csv$Alternative=="Marginal"),]
loadLevel2_Overall <- result_data_csv[which(result_data_csv$LoadLevel == 20 & result_data_csv$Alternative=="Overall"),]
loadLevel2_Marginal <- result_data_csv[which(result_data_csv$LoadLevel == 20 & result_data_csv$Alternative=="Marginal"),]
loadLevel3_Overall <- result_data_csv[which(result_data_csv$LoadLevel == 30 & result_data_csv$Alternative=="Overall"),]
loadLevel3_Marginal <- result_data_csv[which(result_data_csv$LoadLevel == 30 & result_data_csv$Alternative=="Marginal"),]
loadLevel4_Overall <- result_data_csv[which(result_data_csv$LoadLevel == 40 & result_data_csv$Alternative=="Overall"),]
loadLevel4_Marginal <- result_data_csv[which(result_data_csv$LoadLevel == 40 & result_data_csv$Alternative=="Marginal"),]
loadLevel5_Overall <- result_data_csv[which(result_data_csv$LoadLevel == 50 & result_data_csv$Alternative=="Overall"),]
loadLevel5_Marginal <- result_data_csv[which(result_data_csv$LoadLevel == 50 & result_data_csv$Alternative=="Marginal"),]
loadLevel6_Overall <- result_data_csv[which(result_data_csv$LoadLevel == 60 & result_data_csv$Alternative=="Overall"),]
loadLevel6_Marginal <- result_data_csv[which(result_data_csv$LoadLevel == 60 & result_data_csv$Alternative=="Marginal"),]
loadLevel7_Overall <- result_data_csv[which(result_data_csv$LoadLevel == 70 & result_data_csv$Alternative=="Overall"),]
loadLevel7_Marginal <- result_data_csv[which(result_data_csv$LoadLevel == 70 & result_data_csv$Alternative=="Marginal"),]
loadLevel8_Overall <- result_data_csv[which(result_data_csv$LoadLevel == 80 & result_data_csv$Alternative=="Overall"),]
loadLevel8_Marginal <- result_data_csv[which(result_data_csv$LoadLevel == 80 & result_data_csv$Alternative=="Marginal"),]
loadLevel9_Overall <- result_data_csv[which(result_data_csv$LoadLevel == 90 & result_data_csv$Alternative=="Overall"),]
loadLevel9_Marginal <- result_data_csv[which(result_data_csv$LoadLevel == 90 & result_data_csv$Alternative=="Marginal"),]
loadLevel10_Overall <- result_data_csv[which(result_data_csv$LoadLevel == 100 & result_data_csv$Alternative=="Overall"),]
loadLevel10_Marginal <- result_data_csv[which(result_data_csv$LoadLevel == 100 & result_data_csv$Alternative=="Marginal"),]


##Working on visualizing the difference
#Calculate the difference - for Overall Energy
diffLoadLevel0_Overall <- loadLevel0_Marginal$OverallEnergy - loadLevel0_Overall$OverallEnergy
diffLoadLevel1_Overall <- loadLevel1_Marginal$OverallEnergy - loadLevel1_Overall$OverallEnergy
diffLoadLevel2_Overall <- loadLevel2_Marginal$OverallEnergy - loadLevel2_Overall$OverallEnergy
diffLoadLevel3_Overall <- loadLevel3_Marginal$OverallEnergy - loadLevel3_Overall$OverallEnergy
diffLoadLevel4_Overall <- loadLevel4_Marginal$OverallEnergy - loadLevel4_Overall$OverallEnergy
diffLoadLevel5_Overall <- loadLevel5_Marginal$OverallEnergy - loadLevel5_Overall$OverallEnergy
diffLoadLevel6_Overall <- loadLevel6_Marginal$OverallEnergy - loadLevel6_Overall$OverallEnergy
diffLoadLevel7_Overall <- loadLevel7_Marginal$OverallEnergy - loadLevel7_Overall$OverallEnergy
diffLoadLevel8_Overall <- loadLevel8_Marginal$OverallEnergy - loadLevel8_Overall$OverallEnergy
diffLoadLevel9_Overall <- loadLevel9_Marginal$OverallEnergy - loadLevel9_Overall$OverallEnergy
diffLoadLevel10_Overall <- loadLevel10_Marginal$OverallEnergy - loadLevel10_Overall$OverallEnergy
diffLoadLevel_Overall = list(diffLoadLevel0_Overall,diffLoadLevel1_Overall,diffLoadLevel2_Overall,
                             diffLoadLevel3_Overall,diffLoadLevel4_Overall,diffLoadLevel5_Overall,
                             diffLoadLevel6_Overall,diffLoadLevel7_Overall,diffLoadLevel8_Overall,
                             diffLoadLevel9_Overall,diffLoadLevel10_Overall)
#Calculate the relative difference - for Overall Energy
reldiffLoadLevel0_Overall <- loadLevel0_Marginal$OverallEnergy / loadLevel0_Overall$OverallEnergy
reldiffLoadLevel1_Overall <- loadLevel1_Marginal$OverallEnergy / loadLevel1_Overall$OverallEnergy
reldiffLoadLevel2_Overall <- loadLevel2_Marginal$OverallEnergy / loadLevel2_Overall$OverallEnergy
reldiffLoadLevel3_Overall <- loadLevel3_Marginal$OverallEnergy / loadLevel3_Overall$OverallEnergy
reldiffLoadLevel4_Overall <- loadLevel4_Marginal$OverallEnergy / loadLevel4_Overall$OverallEnergy
reldiffLoadLevel5_Overall <- loadLevel5_Marginal$OverallEnergy / loadLevel5_Overall$OverallEnergy
reldiffLoadLevel6_Overall <- loadLevel6_Marginal$OverallEnergy / loadLevel6_Overall$OverallEnergy
reldiffLoadLevel7_Overall <- loadLevel7_Marginal$OverallEnergy / loadLevel7_Overall$OverallEnergy
reldiffLoadLevel8_Overall <- loadLevel8_Marginal$OverallEnergy / loadLevel8_Overall$OverallEnergy
reldiffLoadLevel9_Overall <- loadLevel9_Marginal$OverallEnergy / loadLevel9_Overall$OverallEnergy
reldiffLoadLevel10_Overall <- loadLevel10_Marginal$OverallEnergy / loadLevel10_Overall$OverallEnergy
reldiffLoadLevel_Overall = list(reldiffLoadLevel0_Overall,reldiffLoadLevel1_Overall,reldiffLoadLevel2_Overall,
                                reldiffLoadLevel3_Overall,reldiffLoadLevel4_Overall,reldiffLoadLevel5_Overall,
                                reldiffLoadLevel6_Overall,reldiffLoadLevel7_Overall,reldiffLoadLevel8_Overall,
                                reldiffLoadLevel9_Overall,reldiffLoadLevel10_Overall)
#Calculate the relative difference - for Marginal Energy
reldiffLoadLevel0_Marginal <- loadLevel0_Overall$MarginalEnergy / loadLevel0_Marginal$MarginalEnergy
reldiffLoadLevel1_Marginal <- loadLevel1_Overall$MarginalEnergy / loadLevel1_Marginal$MarginalEnergy
reldiffLoadLevel2_Marginal <- loadLevel2_Overall$MarginalEnergy / loadLevel2_Marginal$MarginalEnergy
reldiffLoadLevel3_Marginal <- loadLevel3_Overall$MarginalEnergy / loadLevel3_Marginal$MarginalEnergy
reldiffLoadLevel4_Marginal <- loadLevel4_Overall$MarginalEnergy / loadLevel4_Marginal$MarginalEnergy
reldiffLoadLevel5_Marginal <- loadLevel5_Overall$MarginalEnergy / loadLevel5_Marginal$MarginalEnergy
reldiffLoadLevel6_Marginal <- loadLevel6_Overall$MarginalEnergy / loadLevel6_Marginal$MarginalEnergy
reldiffLoadLevel7_Marginal <- loadLevel7_Overall$MarginalEnergy / loadLevel7_Marginal$MarginalEnergy
reldiffLoadLevel8_Marginal <- loadLevel8_Overall$MarginalEnergy / loadLevel8_Marginal$MarginalEnergy
reldiffLoadLevel9_Marginal <- loadLevel9_Overall$MarginalEnergy / loadLevel9_Marginal$MarginalEnergy
reldiffLoadLevel10_Marginal <- loadLevel10_Overall$MarginalEnergy / loadLevel10_Marginal$MarginalEnergy
reldiffLoadLevel_Marginal = list(reldiffLoadLevel0_Marginal,reldiffLoadLevel1_Marginal,reldiffLoadLevel2_Marginal,
                                 reldiffLoadLevel3_Marginal,reldiffLoadLevel4_Marginal,reldiffLoadLevel5_Marginal,
                                 reldiffLoadLevel6_Marginal,reldiffLoadLevel7_Marginal,reldiffLoadLevel8_Marginal,
                                 reldiffLoadLevel9_Marginal,reldiffLoadLevel10_Marginal)

#Calculating how many are same, different and infeasible, also storing the data about the difference
same=rep(0,11)
different=rep(0,11)
infeasible=rep(0,11)
datadiff=vector()
datareldiff=vector()
datareldiff_m=vector()
datadiffloc=vector()
for (levelNb in seq(1,11)){
  difference=vector()
  reldifference=vector()
  reldifference_m=vector()
  for(diff in diffLoadLevel_Overall[[levelNb]]){
    if (is.na(diff)){infeasible[levelNb]=infeasible[levelNb]+1}
    else if (diff==0){same[levelNb]=same[levelNb]+1}
    else if (diff>0){different[levelNb]=different[levelNb]+1
    difference=append(difference,diff)}
  }
  for(diff in reldiffLoadLevel_Overall[[levelNb]]){
    if (is.na(diff)){}
    else if (diff>1){reldifference=append(reldifference,diff)}
  }
  datadiffloc=append(datadiffloc,rep((levelNb-1)*10,length(difference)))
  datadiff=append(datadiff,difference)
  datareldiff=append(datareldiff,reldifference)
  for(diff in reldiffLoadLevel_Marginal[[levelNb]]){
    if (is.na(diff)){}
    else if (diff>1){reldifference_m=append(reldifference_m,diff)}
  }
  datareldiff_m=append(datareldiff_m,reldifference_m)
}


##Create the dataframe for plotting the difference
LoadLevel= rep(seq(0,100,10),3)
Outcome=c(rep("Same",11),rep("Different",11),rep("Infeasible",11))
NbPlacements=c(same,different,infeasible)
nbDifferentPlacements =data.frame(LoadLevel,Outcome,NbPlacements)

### Plot - Nb of different placement
ggplot(data=nbDifferentPlacements, aes(x=LoadLevel, y=NbPlacements, fill=Outcome)) +
  geom_bar(stat="identity", position = position_stack())+
  theme_minimal()+
  ylab("# obtained placements")+
  xlab("Average load level in %")+
  labs(fill = "Overall and Marginal placements are")+
  scale_fill_manual(values=c("#A95AA1","#F5793A","#85C0F9"))+
  theme(legend.position = "top",axis.title.x = element_text(size = 24),
        axis.text.x = element_text(size = 24),
        axis.title.y = element_text(size = 24),
        axis.text.y = element_text(size = 24),
        legend.text=element_text(size = 24),
        legend.title=element_text(size = 24))

##Create the dataframe for statistics about the difference - OVERALL ENERGY
statisticsPlacement=data.frame(datadiffloc,datareldiff)

#Get numbers for the text
quantile(statisticsPlacement$datareldiff,0.10)
quantile(statisticsPlacement$datareldiff,0.90)

###Plot - Statistics about the relative difference, violin plot (Overall energy)
ggplot(data=statisticsPlacement, aes(x=factor(datadiffloc), y=datareldiff)) +
  geom_violin()+
  theme_minimal()+
  ylab("Relative difference in overall energy (J)")+
  xlab("Average load level in %")+
  theme(legend.position = "top",axis.title.x = element_text(size = 18),
        axis.text.x = element_text(size = 18),
        axis.title.y = element_text(size = 18),
        axis.text.y = element_text(size = 18),
        legend.text=element_text(size = 18),
        legend.title=element_text(size = 18))

##Create the dataframe for statistics about the difference - MARGINAL ENERGY
statisticsPlacement_m=data.frame(datadiffloc,datareldiff_m)

#Get numbers for the text
quantile(statisticsPlacement_m$datareldiff,0.10)
quantile(statisticsPlacement_m$datareldiff,0.90)

###Plot - Statistics about the relative difference, violin plot
ggplot(data=statisticsPlacement_m, aes(x=factor(datadiffloc), y=datareldiff_m)) +
  geom_violin()+
  theme_minimal()+
  ylab("Relative difference in marginal energy (J)")+
  xlab("Average load level in %")+
  theme(legend.position = "top",axis.title.x = element_text(size = 18),
        axis.text.x = element_text(size = 18),
        axis.title.y = element_text(size = 18),
        axis.text.y = element_text(size = 18),
        legend.text=element_text(size = 18),
        legend.title=element_text(size = 18))
####End

#Average included device utilization data graph
####Begin
### Getting the data - different placements ONLY
result_data_csv <- read.csv(file="./NormallyDistributedLoad/resultsParsed_UtilizationDifferent_40rep_DeviceOnlyVar_2replicas_Std10_RequestDevice4.csv", header=TRUE, sep=",")
#Adding the load level column
result_data_csv$LoadLevel <- result_data_csv$Scenario*10

#Create a dataframe with only the device utilization information
utilization=data.frame(result_data_csv$Device0,result_data_csv$Device1,result_data_csv$Device2,result_data_csv$Device3,
                       result_data_csv$Device4,result_data_csv$Device5,result_data_csv$Device6,result_data_csv$Device7,
                       result_data_csv$Device8,result_data_csv$Device9,result_data_csv$Device10)

#Calculating the mean utilization for each data line
meanUt=rowMeans(utilization,na.rm=TRUE)

#Create data frame for plotting
mean_data_utilization= data.frame(result_data_csv$LoadLevel,result_data_csv$Alternative,meanUt)

###Plot - Statistics about the utilization, violin plot
ggplot(data=mean_data_utilization, aes(x=factor(result_data_csv$LoadLevel), y=meanUt, fill=result_data_csv$Alternative)) +
  geom_violin()+
  theme_minimal()+
  ylab("Mean device utilization when placements are different (%)")+
  xlab("Average load level in %")+
  labs(fill = "Optimization objective")+
  scale_fill_manual(values=c("#F0E442","#0072B2"))+
  theme(legend.position = "top",axis.title.x = element_text(size = 18),
        axis.text.x = element_text(size = 18),
        axis.title.y = element_text(size = 18),
        axis.text.y = element_text(size = 18),
        legend.text=element_text(size = 18),
        legend.title=element_text(size = 18))
####End

#Completion Time graph for different placements 
####Begin
## Getting the data - different placements ONLY
result_data_csv_ut_DifferentOnly <- read.csv(file="./NormallyDistributedLoad/resultsParsed_UtilizationDifferent_40rep_DeviceOnlyVar_2replicas_Std10_RequestDevice4.csv", header=TRUE, sep=",")
## Getting the data - all placements
result_data_csv_ev_All <- read.csv(file="./NormallyDistributedLoad/resultsParsed_40rep_DeviceOnlyVar_2replicas_Std10_RequestDevice4.csv", header=TRUE, sep=",")
result_data_csv_ev_All$LoadLevel <- result_data_csv_ev_All$Scenario*10 

##Adding a column for the combination Repetition_Scenario to be able to filter
result_data_csv_ut_DifferentOnly$id <- paste(result_data_csv_ut_DifferentOnly$Repetition,result_data_csv_ut_DifferentOnly$Scenario,sep = "_")
result_data_csv_ev_All$id <- paste(result_data_csv_ev_All$Repetition,result_data_csv_ev_All$Scenario,sep = "_")

##Filter the all data from the combination Repetition/Scenario/Alternative? to get only the info when placements are different
library(dplyr)
result_data_csv_ev_DifferentOnly = result_data_csv_ev_All %>% filter(id %in% result_data_csv_ut_DifferentOnly$id)

#Boxplot
ggplot(data=result_data_csv_ev_DifferentOnly, aes(x=factor(LoadLevel), y=CompletionTime,
                                                  fill=Alternative)) +
  geom_boxplot()+
  theme_minimal()+
  ylab("Request completion time when placements are different (ms)")+
  xlab("Average load level in %")+
  ylim(0,100)+
  labs(fill = "Optimization objective")+
  scale_fill_manual(values=c("#F0E442","#0072B2"))+
  theme(legend.position = "top",axis.title.x = element_text(size = 18),
        axis.text.x = element_text(size = 18),
        axis.title.y = element_text(size = 18),
        axis.text.y = element_text(size = 18),
        legend.text=element_text(size = 18),
        legend.title=element_text(size = 18))
####End

## LARGER STANDARD DEVIATION - NORMALLY DISTRIBUTED LOAD - STD 30 (2 function instances/replicas)

####Begin
### Getting the data
result_data_csv <- read.csv(file="./LargerStandardDeviation/resultsParsed_40rep_DeviceOnlyVar_2replicas_Std30_RequestDevice4.csv", header=TRUE, sep=",")

#Adding the load level column
result_data_csv$LoadLevel <- result_data_csv$Scenario*10 

###Filter per loadLevel
loadLevel0_Overall <- result_data_csv[which(result_data_csv$LoadLevel == 0 & result_data_csv$Alternative=="Overall"),]
loadLevel0_Marginal <- result_data_csv[which(result_data_csv$LoadLevel == 0 & result_data_csv$Alternative=="Marginal"),]
loadLevel1_Overall <- result_data_csv[which(result_data_csv$LoadLevel == 10 & result_data_csv$Alternative=="Overall"),]
loadLevel1_Marginal <- result_data_csv[which(result_data_csv$LoadLevel == 10 & result_data_csv$Alternative=="Marginal"),]
loadLevel2_Overall <- result_data_csv[which(result_data_csv$LoadLevel == 20 & result_data_csv$Alternative=="Overall"),]
loadLevel2_Marginal <- result_data_csv[which(result_data_csv$LoadLevel == 20 & result_data_csv$Alternative=="Marginal"),]
loadLevel3_Overall <- result_data_csv[which(result_data_csv$LoadLevel == 30 & result_data_csv$Alternative=="Overall"),]
loadLevel3_Marginal <- result_data_csv[which(result_data_csv$LoadLevel == 30 & result_data_csv$Alternative=="Marginal"),]
loadLevel4_Overall <- result_data_csv[which(result_data_csv$LoadLevel == 40 & result_data_csv$Alternative=="Overall"),]
loadLevel4_Marginal <- result_data_csv[which(result_data_csv$LoadLevel == 40 & result_data_csv$Alternative=="Marginal"),]
loadLevel5_Overall <- result_data_csv[which(result_data_csv$LoadLevel == 50 & result_data_csv$Alternative=="Overall"),]
loadLevel5_Marginal <- result_data_csv[which(result_data_csv$LoadLevel == 50 & result_data_csv$Alternative=="Marginal"),]
loadLevel6_Overall <- result_data_csv[which(result_data_csv$LoadLevel == 60 & result_data_csv$Alternative=="Overall"),]
loadLevel6_Marginal <- result_data_csv[which(result_data_csv$LoadLevel == 60 & result_data_csv$Alternative=="Marginal"),]
loadLevel7_Overall <- result_data_csv[which(result_data_csv$LoadLevel == 70 & result_data_csv$Alternative=="Overall"),]
loadLevel7_Marginal <- result_data_csv[which(result_data_csv$LoadLevel == 70 & result_data_csv$Alternative=="Marginal"),]
loadLevel8_Overall <- result_data_csv[which(result_data_csv$LoadLevel == 80 & result_data_csv$Alternative=="Overall"),]
loadLevel8_Marginal <- result_data_csv[which(result_data_csv$LoadLevel == 80 & result_data_csv$Alternative=="Marginal"),]
loadLevel9_Overall <- result_data_csv[which(result_data_csv$LoadLevel == 90 & result_data_csv$Alternative=="Overall"),]
loadLevel9_Marginal <- result_data_csv[which(result_data_csv$LoadLevel == 90 & result_data_csv$Alternative=="Marginal"),]
loadLevel10_Overall <- result_data_csv[which(result_data_csv$LoadLevel == 100 & result_data_csv$Alternative=="Overall"),]
loadLevel10_Marginal <- result_data_csv[which(result_data_csv$LoadLevel == 100 & result_data_csv$Alternative=="Marginal"),]

#Calculating how many are same, different and infeasible, also storing the data about the difference
same=rep(0,11)
different=rep(0,11)
infeasible=rep(0,11)
datadiff=vector()
datareldiff=vector()
datareldiff_m=vector()
datadiffloc=vector()
for (levelNb in seq(1,11)){
  difference=vector()
  reldifference=vector()
  reldifference_m=vector()
  for(diff in diffLoadLevel_Overall[[levelNb]]){
    if (is.na(diff)){infeasible[levelNb]=infeasible[levelNb]+1}
    else if (diff==0){same[levelNb]=same[levelNb]+1}
    else if (diff>0){different[levelNb]=different[levelNb]+1
    difference=append(difference,diff)}
  }
  for(diff in reldiffLoadLevel_Overall[[levelNb]]){
    if (is.na(diff)){}
    else if (diff>1){reldifference=append(reldifference,diff)}
  }
  datadiffloc=append(datadiffloc,rep((levelNb-1)*10,length(difference)))
  datadiff=append(datadiff,difference)
  datareldiff=append(datareldiff,reldifference)
  for(diff in reldiffLoadLevel_Marginal[[levelNb]]){
    if (is.na(diff)){}
    else if (diff>1){reldifference_m=append(reldifference_m,diff)}
  }
  datareldiff_m=append(datareldiff_m,reldifference_m)
}


##Create the dataframe for plotting the difference
LoadLevel= rep(seq(0,100,10),3)
Outcome=c(rep("Same",11),rep("Different",11),rep("Infeasible",11))
NbPlacements=c(same,different,infeasible)
nbDifferentPlacements =data.frame(LoadLevel,Outcome,NbPlacements)

### Plot - Nb of different placement
ggplot(data=nbDifferentPlacements, aes(x=LoadLevel, y=NbPlacements, fill=Outcome)) +
  geom_bar(stat="identity", position = position_stack())+
  theme_minimal()+
  ylab("# obtained placements")+
  xlab("Average load level in %")+
  labs(fill = "Overall and Marginal placements are")+
  scale_fill_manual(values=c("#A95AA1","#F5793A","#85C0F9"))+
  theme(legend.position = "top",axis.title.x = element_text(size = 24),
        axis.text.x = element_text(size = 24),
        axis.title.y = element_text(size = 24),
        axis.text.y = element_text(size = 24),
        legend.text=element_text(size = 24),
        legend.title=element_text(size = 24))
####End

## AVAILABILITY OF FUNCTION INSTANCES STUDIES

## NORMALLY DISTRIBUTED LOAD - STD 10 (4 function instances/replicas)

#Graphs for the categorization of placements and the relative difference in overall/marginal energy
####Begin
### Getting the data
result_data_csv <- read.csv(file="./4FunctionInstances/resultsParsed_40rep_DeviceOnlyVar_4replicas_Std10_RequestDevice4.csv", header=TRUE, sep=",")

#Adding the load level column
result_data_csv$LoadLevel <- result_data_csv$Scenario*10 

###Filter per loadLevel
loadLevel0_Overall <- result_data_csv[which(result_data_csv$LoadLevel == 0 & result_data_csv$Alternative=="Overall"),]
loadLevel0_Marginal <- result_data_csv[which(result_data_csv$LoadLevel == 0 & result_data_csv$Alternative=="Marginal"),]
loadLevel1_Overall <- result_data_csv[which(result_data_csv$LoadLevel == 10 & result_data_csv$Alternative=="Overall"),]
loadLevel1_Marginal <- result_data_csv[which(result_data_csv$LoadLevel == 10 & result_data_csv$Alternative=="Marginal"),]
loadLevel2_Overall <- result_data_csv[which(result_data_csv$LoadLevel == 20 & result_data_csv$Alternative=="Overall"),]
loadLevel2_Marginal <- result_data_csv[which(result_data_csv$LoadLevel == 20 & result_data_csv$Alternative=="Marginal"),]
loadLevel3_Overall <- result_data_csv[which(result_data_csv$LoadLevel == 30 & result_data_csv$Alternative=="Overall"),]
loadLevel3_Marginal <- result_data_csv[which(result_data_csv$LoadLevel == 30 & result_data_csv$Alternative=="Marginal"),]
loadLevel4_Overall <- result_data_csv[which(result_data_csv$LoadLevel == 40 & result_data_csv$Alternative=="Overall"),]
loadLevel4_Marginal <- result_data_csv[which(result_data_csv$LoadLevel == 40 & result_data_csv$Alternative=="Marginal"),]
loadLevel5_Overall <- result_data_csv[which(result_data_csv$LoadLevel == 50 & result_data_csv$Alternative=="Overall"),]
loadLevel5_Marginal <- result_data_csv[which(result_data_csv$LoadLevel == 50 & result_data_csv$Alternative=="Marginal"),]
loadLevel6_Overall <- result_data_csv[which(result_data_csv$LoadLevel == 60 & result_data_csv$Alternative=="Overall"),]
loadLevel6_Marginal <- result_data_csv[which(result_data_csv$LoadLevel == 60 & result_data_csv$Alternative=="Marginal"),]
loadLevel7_Overall <- result_data_csv[which(result_data_csv$LoadLevel == 70 & result_data_csv$Alternative=="Overall"),]
loadLevel7_Marginal <- result_data_csv[which(result_data_csv$LoadLevel == 70 & result_data_csv$Alternative=="Marginal"),]
loadLevel8_Overall <- result_data_csv[which(result_data_csv$LoadLevel == 80 & result_data_csv$Alternative=="Overall"),]
loadLevel8_Marginal <- result_data_csv[which(result_data_csv$LoadLevel == 80 & result_data_csv$Alternative=="Marginal"),]
loadLevel9_Overall <- result_data_csv[which(result_data_csv$LoadLevel == 90 & result_data_csv$Alternative=="Overall"),]
loadLevel9_Marginal <- result_data_csv[which(result_data_csv$LoadLevel == 90 & result_data_csv$Alternative=="Marginal"),]
loadLevel10_Overall <- result_data_csv[which(result_data_csv$LoadLevel == 100 & result_data_csv$Alternative=="Overall"),]
loadLevel10_Marginal <- result_data_csv[which(result_data_csv$LoadLevel == 100 & result_data_csv$Alternative=="Marginal"),]


##Working on visualizing the difference
#Calculate the difference - for Overall Energy
diffLoadLevel0_Overall <- loadLevel0_Marginal$OverallEnergy - loadLevel0_Overall$OverallEnergy
diffLoadLevel1_Overall <- loadLevel1_Marginal$OverallEnergy - loadLevel1_Overall$OverallEnergy
diffLoadLevel2_Overall <- loadLevel2_Marginal$OverallEnergy - loadLevel2_Overall$OverallEnergy
diffLoadLevel3_Overall <- loadLevel3_Marginal$OverallEnergy - loadLevel3_Overall$OverallEnergy
diffLoadLevel4_Overall <- loadLevel4_Marginal$OverallEnergy - loadLevel4_Overall$OverallEnergy
diffLoadLevel5_Overall <- loadLevel5_Marginal$OverallEnergy - loadLevel5_Overall$OverallEnergy
diffLoadLevel6_Overall <- loadLevel6_Marginal$OverallEnergy - loadLevel6_Overall$OverallEnergy
diffLoadLevel7_Overall <- loadLevel7_Marginal$OverallEnergy - loadLevel7_Overall$OverallEnergy
diffLoadLevel8_Overall <- loadLevel8_Marginal$OverallEnergy - loadLevel8_Overall$OverallEnergy
diffLoadLevel9_Overall <- loadLevel9_Marginal$OverallEnergy - loadLevel9_Overall$OverallEnergy
diffLoadLevel10_Overall <- loadLevel10_Marginal$OverallEnergy - loadLevel10_Overall$OverallEnergy
diffLoadLevel_Overall = list(diffLoadLevel0_Overall,diffLoadLevel1_Overall,diffLoadLevel2_Overall,
                             diffLoadLevel3_Overall,diffLoadLevel4_Overall,diffLoadLevel5_Overall,
                             diffLoadLevel6_Overall,diffLoadLevel7_Overall,diffLoadLevel8_Overall,
                             diffLoadLevel9_Overall,diffLoadLevel10_Overall)
#Calculate the relative difference - for Overall Energy
reldiffLoadLevel0_Overall <- loadLevel0_Marginal$OverallEnergy / loadLevel0_Overall$OverallEnergy
reldiffLoadLevel1_Overall <- loadLevel1_Marginal$OverallEnergy / loadLevel1_Overall$OverallEnergy
reldiffLoadLevel2_Overall <- loadLevel2_Marginal$OverallEnergy / loadLevel2_Overall$OverallEnergy
reldiffLoadLevel3_Overall <- loadLevel3_Marginal$OverallEnergy / loadLevel3_Overall$OverallEnergy
reldiffLoadLevel4_Overall <- loadLevel4_Marginal$OverallEnergy / loadLevel4_Overall$OverallEnergy
reldiffLoadLevel5_Overall <- loadLevel5_Marginal$OverallEnergy / loadLevel5_Overall$OverallEnergy
reldiffLoadLevel6_Overall <- loadLevel6_Marginal$OverallEnergy / loadLevel6_Overall$OverallEnergy
reldiffLoadLevel7_Overall <- loadLevel7_Marginal$OverallEnergy / loadLevel7_Overall$OverallEnergy
reldiffLoadLevel8_Overall <- loadLevel8_Marginal$OverallEnergy / loadLevel8_Overall$OverallEnergy
reldiffLoadLevel9_Overall <- loadLevel9_Marginal$OverallEnergy / loadLevel9_Overall$OverallEnergy
reldiffLoadLevel10_Overall <- loadLevel10_Marginal$OverallEnergy / loadLevel10_Overall$OverallEnergy
reldiffLoadLevel_Overall = list(reldiffLoadLevel0_Overall,reldiffLoadLevel1_Overall,reldiffLoadLevel2_Overall,
                                reldiffLoadLevel3_Overall,reldiffLoadLevel4_Overall,reldiffLoadLevel5_Overall,
                                reldiffLoadLevel6_Overall,reldiffLoadLevel7_Overall,reldiffLoadLevel8_Overall,
                                reldiffLoadLevel9_Overall,reldiffLoadLevel10_Overall)
#Calculate the relative difference - for Marginal Energy
reldiffLoadLevel0_Marginal <- loadLevel0_Overall$MarginalEnergy / loadLevel0_Marginal$MarginalEnergy
reldiffLoadLevel1_Marginal <- loadLevel1_Overall$MarginalEnergy / loadLevel1_Marginal$MarginalEnergy
reldiffLoadLevel2_Marginal <- loadLevel2_Overall$MarginalEnergy / loadLevel2_Marginal$MarginalEnergy
reldiffLoadLevel3_Marginal <- loadLevel3_Overall$MarginalEnergy / loadLevel3_Marginal$MarginalEnergy
reldiffLoadLevel4_Marginal <- loadLevel4_Overall$MarginalEnergy / loadLevel4_Marginal$MarginalEnergy
reldiffLoadLevel5_Marginal <- loadLevel5_Overall$MarginalEnergy / loadLevel5_Marginal$MarginalEnergy
reldiffLoadLevel6_Marginal <- loadLevel6_Overall$MarginalEnergy / loadLevel6_Marginal$MarginalEnergy
reldiffLoadLevel7_Marginal <- loadLevel7_Overall$MarginalEnergy / loadLevel7_Marginal$MarginalEnergy
reldiffLoadLevel8_Marginal <- loadLevel8_Overall$MarginalEnergy / loadLevel8_Marginal$MarginalEnergy
reldiffLoadLevel9_Marginal <- loadLevel9_Overall$MarginalEnergy / loadLevel9_Marginal$MarginalEnergy
reldiffLoadLevel10_Marginal <- loadLevel10_Overall$MarginalEnergy / loadLevel10_Marginal$MarginalEnergy
reldiffLoadLevel_Marginal = list(reldiffLoadLevel0_Marginal,reldiffLoadLevel1_Marginal,reldiffLoadLevel2_Marginal,
                                 reldiffLoadLevel3_Marginal,reldiffLoadLevel4_Marginal,reldiffLoadLevel5_Marginal,
                                 reldiffLoadLevel6_Marginal,reldiffLoadLevel7_Marginal,reldiffLoadLevel8_Marginal,
                                 reldiffLoadLevel9_Marginal,reldiffLoadLevel10_Marginal)

#Calculating how many are same, different and infeasible, also storing the data about the difference
same=rep(0,11)
different=rep(0,11)
infeasible=rep(0,11)
datadiff=vector()
datareldiff=vector()
datareldiff_m=vector()
datadiffloc=vector()
for (levelNb in seq(1,11)){
  difference=vector()
  reldifference=vector()
  reldifference_m=vector()
  for(diff in diffLoadLevel_Overall[[levelNb]]){
    if (is.na(diff)){infeasible[levelNb]=infeasible[levelNb]+1}
    else if (diff==0){same[levelNb]=same[levelNb]+1}
    else if (diff>0){different[levelNb]=different[levelNb]+1
    difference=append(difference,diff)}
  }
  for(diff in reldiffLoadLevel_Overall[[levelNb]]){
    if (is.na(diff)){}
    else if (diff>1){reldifference=append(reldifference,diff)}
  }
  datadiffloc=append(datadiffloc,rep((levelNb-1)*10,length(difference)))
  datadiff=append(datadiff,difference)
  datareldiff=append(datareldiff,reldifference)
  for(diff in reldiffLoadLevel_Marginal[[levelNb]]){
    if (is.na(diff)){}
    else if (diff>1){reldifference_m=append(reldifference_m,diff)}
  }
  datareldiff_m=append(datareldiff_m,reldifference_m)
}


##Create the dataframe for plotting the difference
LoadLevel= rep(seq(0,100,10),3)
Outcome=c(rep("Same",11),rep("Different",11),rep("Infeasible",11))
NbPlacements=c(same,different,infeasible)
nbDifferentPlacements =data.frame(LoadLevel,Outcome,NbPlacements)

### Plot - Nb of different placement
ggplot(data=nbDifferentPlacements, aes(x=LoadLevel, y=NbPlacements, fill=Outcome)) +
  geom_bar(stat="identity", position = position_stack())+
  theme_minimal()+
  ylab("# obtained placements")+
  xlab("Average load level in %")+
  labs(fill = "Overall and Marginal placements are")+
  scale_fill_manual(values=c("#A95AA1","#F5793A","#85C0F9"))+
  theme(legend.position = "top",axis.title.x = element_text(size = 24),
        axis.text.x = element_text(size = 24),
        axis.title.y = element_text(size = 24),
        axis.text.y = element_text(size = 24),
        legend.text=element_text(size = 24),
        legend.title=element_text(size = 24))

##Create the dataframe for statistics about the difference - OVERALL ENERGY
statisticsPlacement=data.frame(datadiffloc,datadiff,datareldiff)

#Get numbers for the text
quantile(statisticsPlacement$datareldiff,0.10)
quantile(statisticsPlacement$datareldiff,0.90)

###Plot - Statistics about the relative difference, violin plot
ggplot(data=statisticsPlacement, aes(x=factor(datadiffloc), y=datareldiff)) +
  geom_violin()+
  theme_minimal()+
  ylab("Relative difference in overall energy (J)")+
  xlab("Average load level in %")+
  theme(legend.position = "top",axis.title.x = element_text(size = 18),
        axis.text.x = element_text(size = 18),
        axis.title.y = element_text(size = 18),
        axis.text.y = element_text(size = 18),
        legend.text=element_text(size = 18),
        legend.title=element_text(size = 18))

##Create the dataframe for statistics about the difference - MARGINAL ENERGY
statisticsPlacement_m=data.frame(datadiffloc,datareldiff_m)

#Get numbers for the text
quantile(statisticsPlacement_m$datareldiff,0.10)
quantile(statisticsPlacement_m$datareldiff,0.90)

###Plot - Statistics about the relative difference, violin plot
ggplot(data=statisticsPlacement_m, aes(x=factor(datadiffloc), y=datareldiff_m)) +
  geom_violin()+
  theme_minimal()+
  ylab("Relative difference in marginal energy (J)")+
  xlab("Average load level in %")+
  theme(legend.position = "top",axis.title.x = element_text(size = 18),
        axis.text.x = element_text(size = 18),
        axis.title.y = element_text(size = 18),
        axis.text.y = element_text(size = 18),
        legend.text=element_text(size = 18),
        legend.title=element_text(size = 18))
####End

#Average included device utilization data graph
####Begin
### Getting the data - different placements ONLY
result_data_csv <- read.csv(file="./4FunctionInstances/resultsParsed_UtilizationDifferent_40rep_DeviceOnlyVar_4replicas_Std10_RequestDevice4.csv", header=TRUE, sep=",")
#Adding the load level column
result_data_csv$LoadLevel <- result_data_csv$Scenario*10

#Create a dataframe with only the device utilization information
utilization=data.frame(result_data_csv$Device0,result_data_csv$Device1,result_data_csv$Device2,result_data_csv$Device3,
                       result_data_csv$Device4,result_data_csv$Device5,result_data_csv$Device6,result_data_csv$Device7,
                       result_data_csv$Device8,result_data_csv$Device9,result_data_csv$Device10)

#Calculating the mean utilization for each data line
meanUt=rowMeans(utilization,na.rm=TRUE)

#Create data frame for plotting
mean_data_utilization= data.frame(result_data_csv$LoadLevel,result_data_csv$Alternative,meanUt)

###Plot - Statistics about the utilization, violin plot
ggplot(data=mean_data_utilization, aes(x=factor(result_data_csv$LoadLevel), y=meanUt, fill=result_data_csv$Alternative)) +
  geom_violin()+
  theme_minimal()+
  ylab("Mean device utilization when placements are different (%)")+
  xlab("Average load level in %")+
  labs(fill = "Optimization objective")+
  scale_fill_manual(values=c("#F0E442","#0072B2"))+
  theme(legend.position = "top",axis.title.x = element_text(size = 18),
        axis.text.x = element_text(size = 18),
        axis.title.y = element_text(size = 18),
        axis.text.y = element_text(size = 18),
        legend.text=element_text(size = 18),
        legend.title=element_text(size = 18))
####End

#Completion Time graph for different placements 
####Begin
## Getting the data - different placements ONLY
result_data_csv_ut_DifferentOnly <- read.csv(file="./4FunctionInstances/resultsParsed_UtilizationDifferent_40rep_DeviceOnlyVar_4replicas_Std10_RequestDevice4.csv", header=TRUE, sep=",")
## Getting the data - all placements
result_data_csv_ev_All <- read.csv(file="./4FunctionInstances/resultsParsed_40rep_DeviceOnlyVar_4replicas_Std10_RequestDevice4.csv", header=TRUE, sep=",")
result_data_csv_ev_All$LoadLevel <- result_data_csv_ev_All$Scenario*10 

##Adding a column for the combination Repetition_Scenario to be able to filter
result_data_csv_ut_DifferentOnly$id <- paste(result_data_csv_ut_DifferentOnly$Repetition,result_data_csv_ut_DifferentOnly$Scenario,sep = "_")
result_data_csv_ev_All$id <- paste(result_data_csv_ev_All$Repetition,result_data_csv_ev_All$Scenario,sep = "_")

##Filter the all data from the combination Repetition/Scenario/Alternative? to get only the info when placements are different
library(dplyr)
result_data_csv_ev_DifferentOnly = result_data_csv_ev_All %>% filter(id %in% result_data_csv_ut_DifferentOnly$id)

#Boxplot
ggplot(data=result_data_csv_ev_DifferentOnly, aes(x=factor(LoadLevel), y=CompletionTime,
                                                  fill=Alternative)) +
  geom_boxplot()+
  theme_minimal()+
  ylab("Request completion time when placements are different (ms)")+
  xlab("Average load level in %")+
  ylim(0,100)+
  labs(fill = "Optimization objective")+
  scale_fill_manual(values=c("#F0E442","#0072B2"))+
  theme(legend.position = "top",axis.title.x = element_text(size = 18),
        axis.text.x = element_text(size = 18),
        axis.title.y = element_text(size = 18),
        axis.text.y = element_text(size = 18),
        legend.text=element_text(size = 18),
        legend.title=element_text(size = 18))
####End


## NORMALLY DISTRIBUTED LOAD - STD 10 (6 function instances/replicas)

#Graphs for the categorization of placements and the relative difference in overall/marginal energy
####Begin
### Getting the data
result_data_csv <- read.csv(file="./6FunctionInstances/resultsParsed_40rep_DeviceOnlyVar_6replicas_Std10_RequestDevice4.csv", header=TRUE, sep=",")

#Adding the load level column
result_data_csv$LoadLevel <- result_data_csv$Scenario*10 

###Filter per loadLevel
loadLevel0_Overall <- result_data_csv[which(result_data_csv$LoadLevel == 0 & result_data_csv$Alternative=="Overall"),]
loadLevel0_Marginal <- result_data_csv[which(result_data_csv$LoadLevel == 0 & result_data_csv$Alternative=="Marginal"),]
loadLevel1_Overall <- result_data_csv[which(result_data_csv$LoadLevel == 10 & result_data_csv$Alternative=="Overall"),]
loadLevel1_Marginal <- result_data_csv[which(result_data_csv$LoadLevel == 10 & result_data_csv$Alternative=="Marginal"),]
loadLevel2_Overall <- result_data_csv[which(result_data_csv$LoadLevel == 20 & result_data_csv$Alternative=="Overall"),]
loadLevel2_Marginal <- result_data_csv[which(result_data_csv$LoadLevel == 20 & result_data_csv$Alternative=="Marginal"),]
loadLevel3_Overall <- result_data_csv[which(result_data_csv$LoadLevel == 30 & result_data_csv$Alternative=="Overall"),]
loadLevel3_Marginal <- result_data_csv[which(result_data_csv$LoadLevel == 30 & result_data_csv$Alternative=="Marginal"),]
loadLevel4_Overall <- result_data_csv[which(result_data_csv$LoadLevel == 40 & result_data_csv$Alternative=="Overall"),]
loadLevel4_Marginal <- result_data_csv[which(result_data_csv$LoadLevel == 40 & result_data_csv$Alternative=="Marginal"),]
loadLevel5_Overall <- result_data_csv[which(result_data_csv$LoadLevel == 50 & result_data_csv$Alternative=="Overall"),]
loadLevel5_Marginal <- result_data_csv[which(result_data_csv$LoadLevel == 50 & result_data_csv$Alternative=="Marginal"),]
loadLevel6_Overall <- result_data_csv[which(result_data_csv$LoadLevel == 60 & result_data_csv$Alternative=="Overall"),]
loadLevel6_Marginal <- result_data_csv[which(result_data_csv$LoadLevel == 60 & result_data_csv$Alternative=="Marginal"),]
loadLevel7_Overall <- result_data_csv[which(result_data_csv$LoadLevel == 70 & result_data_csv$Alternative=="Overall"),]
loadLevel7_Marginal <- result_data_csv[which(result_data_csv$LoadLevel == 70 & result_data_csv$Alternative=="Marginal"),]
loadLevel8_Overall <- result_data_csv[which(result_data_csv$LoadLevel == 80 & result_data_csv$Alternative=="Overall"),]
loadLevel8_Marginal <- result_data_csv[which(result_data_csv$LoadLevel == 80 & result_data_csv$Alternative=="Marginal"),]
loadLevel9_Overall <- result_data_csv[which(result_data_csv$LoadLevel == 90 & result_data_csv$Alternative=="Overall"),]
loadLevel9_Marginal <- result_data_csv[which(result_data_csv$LoadLevel == 90 & result_data_csv$Alternative=="Marginal"),]
loadLevel10_Overall <- result_data_csv[which(result_data_csv$LoadLevel == 100 & result_data_csv$Alternative=="Overall"),]
loadLevel10_Marginal <- result_data_csv[which(result_data_csv$LoadLevel == 100 & result_data_csv$Alternative=="Marginal"),]


##Working on visualizing the difference
#Calculate the difference - for Overall Energy
diffLoadLevel0_Overall <- loadLevel0_Marginal$OverallEnergy - loadLevel0_Overall$OverallEnergy
diffLoadLevel1_Overall <- loadLevel1_Marginal$OverallEnergy - loadLevel1_Overall$OverallEnergy
diffLoadLevel2_Overall <- loadLevel2_Marginal$OverallEnergy - loadLevel2_Overall$OverallEnergy
diffLoadLevel3_Overall <- loadLevel3_Marginal$OverallEnergy - loadLevel3_Overall$OverallEnergy
diffLoadLevel4_Overall <- loadLevel4_Marginal$OverallEnergy - loadLevel4_Overall$OverallEnergy
diffLoadLevel5_Overall <- loadLevel5_Marginal$OverallEnergy - loadLevel5_Overall$OverallEnergy
diffLoadLevel6_Overall <- loadLevel6_Marginal$OverallEnergy - loadLevel6_Overall$OverallEnergy
diffLoadLevel7_Overall <- loadLevel7_Marginal$OverallEnergy - loadLevel7_Overall$OverallEnergy
diffLoadLevel8_Overall <- loadLevel8_Marginal$OverallEnergy - loadLevel8_Overall$OverallEnergy
diffLoadLevel9_Overall <- loadLevel9_Marginal$OverallEnergy - loadLevel9_Overall$OverallEnergy
diffLoadLevel10_Overall <- loadLevel10_Marginal$OverallEnergy - loadLevel10_Overall$OverallEnergy
diffLoadLevel_Overall = list(diffLoadLevel0_Overall,diffLoadLevel1_Overall,diffLoadLevel2_Overall,
                             diffLoadLevel3_Overall,diffLoadLevel4_Overall,diffLoadLevel5_Overall,
                             diffLoadLevel6_Overall,diffLoadLevel7_Overall,diffLoadLevel8_Overall,
                             diffLoadLevel9_Overall,diffLoadLevel10_Overall)
#Calculate the relative difference - for Overall Energy
reldiffLoadLevel0_Overall <- loadLevel0_Marginal$OverallEnergy / loadLevel0_Overall$OverallEnergy
reldiffLoadLevel1_Overall <- loadLevel1_Marginal$OverallEnergy / loadLevel1_Overall$OverallEnergy
reldiffLoadLevel2_Overall <- loadLevel2_Marginal$OverallEnergy / loadLevel2_Overall$OverallEnergy
reldiffLoadLevel3_Overall <- loadLevel3_Marginal$OverallEnergy / loadLevel3_Overall$OverallEnergy
reldiffLoadLevel4_Overall <- loadLevel4_Marginal$OverallEnergy / loadLevel4_Overall$OverallEnergy
reldiffLoadLevel5_Overall <- loadLevel5_Marginal$OverallEnergy / loadLevel5_Overall$OverallEnergy
reldiffLoadLevel6_Overall <- loadLevel6_Marginal$OverallEnergy / loadLevel6_Overall$OverallEnergy
reldiffLoadLevel7_Overall <- loadLevel7_Marginal$OverallEnergy / loadLevel7_Overall$OverallEnergy
reldiffLoadLevel8_Overall <- loadLevel8_Marginal$OverallEnergy / loadLevel8_Overall$OverallEnergy
reldiffLoadLevel9_Overall <- loadLevel9_Marginal$OverallEnergy / loadLevel9_Overall$OverallEnergy
reldiffLoadLevel10_Overall <- loadLevel10_Marginal$OverallEnergy / loadLevel10_Overall$OverallEnergy
reldiffLoadLevel_Overall = list(reldiffLoadLevel0_Overall,reldiffLoadLevel1_Overall,reldiffLoadLevel2_Overall,
                                reldiffLoadLevel3_Overall,reldiffLoadLevel4_Overall,reldiffLoadLevel5_Overall,
                                reldiffLoadLevel6_Overall,reldiffLoadLevel7_Overall,reldiffLoadLevel8_Overall,
                                reldiffLoadLevel9_Overall,reldiffLoadLevel10_Overall)
#Calculate the relative difference - for Marginal Energy
reldiffLoadLevel0_Marginal <- loadLevel0_Overall$MarginalEnergy / loadLevel0_Marginal$MarginalEnergy
reldiffLoadLevel1_Marginal <- loadLevel1_Overall$MarginalEnergy / loadLevel1_Marginal$MarginalEnergy
reldiffLoadLevel2_Marginal <- loadLevel2_Overall$MarginalEnergy / loadLevel2_Marginal$MarginalEnergy
reldiffLoadLevel3_Marginal <- loadLevel3_Overall$MarginalEnergy / loadLevel3_Marginal$MarginalEnergy
reldiffLoadLevel4_Marginal <- loadLevel4_Overall$MarginalEnergy / loadLevel4_Marginal$MarginalEnergy
reldiffLoadLevel5_Marginal <- loadLevel5_Overall$MarginalEnergy / loadLevel5_Marginal$MarginalEnergy
reldiffLoadLevel6_Marginal <- loadLevel6_Overall$MarginalEnergy / loadLevel6_Marginal$MarginalEnergy
reldiffLoadLevel7_Marginal <- loadLevel7_Overall$MarginalEnergy / loadLevel7_Marginal$MarginalEnergy
reldiffLoadLevel8_Marginal <- loadLevel8_Overall$MarginalEnergy / loadLevel8_Marginal$MarginalEnergy
reldiffLoadLevel9_Marginal <- loadLevel9_Overall$MarginalEnergy / loadLevel9_Marginal$MarginalEnergy
reldiffLoadLevel10_Marginal <- loadLevel10_Overall$MarginalEnergy / loadLevel10_Marginal$MarginalEnergy
reldiffLoadLevel_Marginal = list(reldiffLoadLevel0_Marginal,reldiffLoadLevel1_Marginal,reldiffLoadLevel2_Marginal,
                                 reldiffLoadLevel3_Marginal,reldiffLoadLevel4_Marginal,reldiffLoadLevel5_Marginal,
                                 reldiffLoadLevel6_Marginal,reldiffLoadLevel7_Marginal,reldiffLoadLevel8_Marginal,
                                 reldiffLoadLevel9_Marginal,reldiffLoadLevel10_Marginal)

#Calculating how many are same, different and infeasible, also storing the data about the difference
same=rep(0,11)
different=rep(0,11)
infeasible=rep(0,11)
datadiff=vector()
datareldiff=vector()
datareldiff_m=vector()
datadiffloc=vector()
for (levelNb in seq(1,11)){
  difference=vector()
  reldifference=vector()
  reldifference_m=vector()
  for(diff in diffLoadLevel_Overall[[levelNb]]){
    if (is.na(diff)){infeasible[levelNb]=infeasible[levelNb]+1}
    else if (diff==0){same[levelNb]=same[levelNb]+1}
    else if (diff>0){different[levelNb]=different[levelNb]+1
    difference=append(difference,diff)}
  }
  for(diff in reldiffLoadLevel_Overall[[levelNb]]){
    if (is.na(diff)){}
    else if (diff>1){reldifference=append(reldifference,diff)}
  }
  datadiffloc=append(datadiffloc,rep((levelNb-1)*10,length(difference)))
  datadiff=append(datadiff,difference)
  datareldiff=append(datareldiff,reldifference)
  for(diff in reldiffLoadLevel_Marginal[[levelNb]]){
    if (is.na(diff)){}
    else if (diff>1){reldifference_m=append(reldifference_m,diff)}
  }
  datareldiff_m=append(datareldiff_m,reldifference_m)
}


##Create the dataframe for plotting the difference
LoadLevel= rep(seq(0,100,10),3)
Outcome=c(rep("Same",11),rep("Different",11),rep("Infeasible",11))
NbPlacements=c(same,different,infeasible)
nbDifferentPlacements =data.frame(LoadLevel,Outcome,NbPlacements)

### Plot - Nb of different placement
ggplot(data=nbDifferentPlacements, aes(x=LoadLevel, y=NbPlacements, fill=Outcome)) +
  geom_bar(stat="identity", position = position_stack())+
  theme_minimal()+
  ylab("# obtained placements")+
  xlab("Average load level in %")+
  labs(fill = "Overall and Marginal placements are")+
  scale_fill_manual(values=c("#A95AA1","#F5793A","#85C0F9"))+
  theme(legend.position = "top",axis.title.x = element_text(size = 24),
        axis.text.x = element_text(size = 24),
        axis.title.y = element_text(size = 24),
        axis.text.y = element_text(size = 24),
        legend.text=element_text(size = 24),
        legend.title=element_text(size = 24))

##Create the dataframe for statistics about the difference - OVERALL ENERGY
statisticsPlacement=data.frame(datadiffloc,datadiff,datareldiff)

#Get numbers for the text
quantile(statisticsPlacement$datareldiff,0.10)
quantile(statisticsPlacement$datareldiff,0.90)

###Plot - Statistics about the relative difference, violin plot
ggplot(data=statisticsPlacement, aes(x=factor(datadiffloc), y=datareldiff)) +
  geom_violin()+
  theme_minimal()+
  ylab("Relative difference in overall energy (J)")+
  xlab("Average load level in %")+
  theme(legend.position = "top",axis.title.x = element_text(size = 18),
        axis.text.x = element_text(size = 18),
        axis.title.y = element_text(size = 18),
        axis.text.y = element_text(size = 18),
        legend.text=element_text(size = 18),
        legend.title=element_text(size = 18))

##Create the dataframe for statistics about the difference - MARGINAL ENERGY
statisticsPlacement_m=data.frame(datadiffloc,datareldiff_m)

#Get numbers for the text
quantile(statisticsPlacement_m$datareldiff,0.10)
quantile(statisticsPlacement_m$datareldiff,0.90)

###Plot - Statistics about the relative difference, violin plot
ggplot(data=statisticsPlacement_m, aes(x=factor(datadiffloc), y=datareldiff_m)) +
  geom_violin()+
  theme_minimal()+
  ylab("Relative difference in marginal energy (J)")+
  xlab("Average load level in %")+
  theme(legend.position = "top",axis.title.x = element_text(size = 18),
        axis.text.x = element_text(size = 18),
        axis.title.y = element_text(size = 18),
        axis.text.y = element_text(size = 18),
        legend.text=element_text(size = 18),
        legend.title=element_text(size = 18))
####End

#Average included device utilization data graph
####Begin
### Getting the data - different placements ONLY
result_data_csv <- read.csv(file="./6FunctionInstances/resultsParsed_UtilizationDifferent_40rep_DeviceOnlyVar_6replicas_Std10_RequestDevice4.csv", header=TRUE, sep=",")
#Adding the load level column
result_data_csv$LoadLevel <- result_data_csv$Scenario*10

#Create a dataframe with only the device utilization information
utilization=data.frame(result_data_csv$Device0,result_data_csv$Device1,result_data_csv$Device2,result_data_csv$Device3,
                       result_data_csv$Device4,result_data_csv$Device5,result_data_csv$Device6,result_data_csv$Device7,
                       result_data_csv$Device8,result_data_csv$Device9,result_data_csv$Device10)

#Calculating the mean utilization for each data line
meanUt=rowMeans(utilization,na.rm=TRUE)

#Create data frame for plotting
mean_data_utilization= data.frame(result_data_csv$LoadLevel,result_data_csv$Alternative,meanUt)

###Plot - Statistics about the utilization, violin plot
ggplot(data=mean_data_utilization, aes(x=factor(result_data_csv$LoadLevel), y=meanUt, fill=result_data_csv$Alternative)) +
  geom_violin()+
  theme_minimal()+
  ylab("Mean device utilization when placements are different (%)")+
  xlab("Average load level in %")+
  labs(fill = "Optimization objective")+
  scale_fill_manual(values=c("#F0E442","#0072B2"))+
  theme(legend.position = "top",axis.title.x = element_text(size = 18),
        axis.text.x = element_text(size = 18),
        axis.title.y = element_text(size = 18),
        axis.text.y = element_text(size = 18),
        legend.text=element_text(size = 18),
        legend.title=element_text(size = 18))
####End

#Completion Time graph for different placements 
####Begin
## Getting the data - different placements ONLY
result_data_csv_ut_DifferentOnly <- read.csv(file="./6FunctionInstances/resultsParsed_UtilizationDifferent_40rep_DeviceOnlyVar_6replicas_Std10_RequestDevice4.csv", header=TRUE, sep=",")
## Getting the data - all placements
result_data_csv_ev_All <- read.csv(file="./6FunctionInstances/resultsParsed_40rep_DeviceOnlyVar_6replicas_Std10_RequestDevice4.csv", header=TRUE, sep=",")
result_data_csv_ev_All$LoadLevel <- result_data_csv_ev_All$Scenario*10 

##Adding a column for the combination Repetition_Scenario to be able to filter
result_data_csv_ut_DifferentOnly$id <- paste(result_data_csv_ut_DifferentOnly$Repetition,result_data_csv_ut_DifferentOnly$Scenario,sep = "_")
result_data_csv_ev_All$id <- paste(result_data_csv_ev_All$Repetition,result_data_csv_ev_All$Scenario,sep = "_")

##Filter the all data from the combination Repetition/Scenario/Alternative? to get only the info when placements are different
library(dplyr)
result_data_csv_ev_DifferentOnly = result_data_csv_ev_All %>% filter(id %in% result_data_csv_ut_DifferentOnly$id)

#Boxplot
ggplot(data=result_data_csv_ev_DifferentOnly, aes(x=factor(LoadLevel), y=CompletionTime,
                                                  fill=Alternative)) +
  geom_boxplot()+
  theme_minimal()+
  ylab("Request completion time when placements are different (ms)")+
  xlab("Average load level in %")+
  labs(fill = "Optimization objective")+
  ylim(0,100)+
  scale_fill_manual(values=c("#F0E442","#0072B2"))+
  theme(legend.position = "top",axis.title.x = element_text(size = 18),
        axis.text.x = element_text(size = 18),
        axis.title.y = element_text(size = 18),
        axis.text.y = element_text(size = 18),
        legend.text=element_text(size = 18),
        legend.title=element_text(size = 18))
####End

## FULL CO-LOCATION STUDY

## NORMALLY DISTRIBUTED LOAD - STD 10 (6 function instances/replicas)

####Begin
### Getting the data
result_data_csv <- read.csv(file="./FullColocation/resultsParsed_40rep_DeviceOnlyVar_6replicas_Std10_RequestDevice0.csv", header=TRUE, sep=",")

#Adding the load level column
result_data_csv$LoadLevel <- result_data_csv$Scenario*10 

###Filter per loadLevel
loadLevel0_Overall <- result_data_csv[which(result_data_csv$LoadLevel == 0 & result_data_csv$Alternative=="Overall"),]
loadLevel0_Marginal <- result_data_csv[which(result_data_csv$LoadLevel == 0 & result_data_csv$Alternative=="Marginal"),]
loadLevel1_Overall <- result_data_csv[which(result_data_csv$LoadLevel == 10 & result_data_csv$Alternative=="Overall"),]
loadLevel1_Marginal <- result_data_csv[which(result_data_csv$LoadLevel == 10 & result_data_csv$Alternative=="Marginal"),]
loadLevel2_Overall <- result_data_csv[which(result_data_csv$LoadLevel == 20 & result_data_csv$Alternative=="Overall"),]
loadLevel2_Marginal <- result_data_csv[which(result_data_csv$LoadLevel == 20 & result_data_csv$Alternative=="Marginal"),]
loadLevel3_Overall <- result_data_csv[which(result_data_csv$LoadLevel == 30 & result_data_csv$Alternative=="Overall"),]
loadLevel3_Marginal <- result_data_csv[which(result_data_csv$LoadLevel == 30 & result_data_csv$Alternative=="Marginal"),]
loadLevel4_Overall <- result_data_csv[which(result_data_csv$LoadLevel == 40 & result_data_csv$Alternative=="Overall"),]
loadLevel4_Marginal <- result_data_csv[which(result_data_csv$LoadLevel == 40 & result_data_csv$Alternative=="Marginal"),]
loadLevel5_Overall <- result_data_csv[which(result_data_csv$LoadLevel == 50 & result_data_csv$Alternative=="Overall"),]
loadLevel5_Marginal <- result_data_csv[which(result_data_csv$LoadLevel == 50 & result_data_csv$Alternative=="Marginal"),]
loadLevel6_Overall <- result_data_csv[which(result_data_csv$LoadLevel == 60 & result_data_csv$Alternative=="Overall"),]
loadLevel6_Marginal <- result_data_csv[which(result_data_csv$LoadLevel == 60 & result_data_csv$Alternative=="Marginal"),]
loadLevel7_Overall <- result_data_csv[which(result_data_csv$LoadLevel == 70 & result_data_csv$Alternative=="Overall"),]
loadLevel7_Marginal <- result_data_csv[which(result_data_csv$LoadLevel == 70 & result_data_csv$Alternative=="Marginal"),]
loadLevel8_Overall <- result_data_csv[which(result_data_csv$LoadLevel == 80 & result_data_csv$Alternative=="Overall"),]
loadLevel8_Marginal <- result_data_csv[which(result_data_csv$LoadLevel == 80 & result_data_csv$Alternative=="Marginal"),]
loadLevel9_Overall <- result_data_csv[which(result_data_csv$LoadLevel == 90 & result_data_csv$Alternative=="Overall"),]
loadLevel9_Marginal <- result_data_csv[which(result_data_csv$LoadLevel == 90 & result_data_csv$Alternative=="Marginal"),]
loadLevel10_Overall <- result_data_csv[which(result_data_csv$LoadLevel == 100 & result_data_csv$Alternative=="Overall"),]
loadLevel10_Marginal <- result_data_csv[which(result_data_csv$LoadLevel == 100 & result_data_csv$Alternative=="Marginal"),]

#Calculating how many are same, different and infeasible, also storing the data about the difference
same=rep(0,11)
different=rep(0,11)
infeasible=rep(0,11)
datadiff=vector()
datareldiff=vector()
datareldiff_m=vector()
datadiffloc=vector()
for (levelNb in seq(1,11)){
  difference=vector()
  reldifference=vector()
  reldifference_m=vector()
  for(diff in diffLoadLevel_Overall[[levelNb]]){
    if (is.na(diff)){infeasible[levelNb]=infeasible[levelNb]+1}
    else if (diff==0){same[levelNb]=same[levelNb]+1}
    else if (diff>0){different[levelNb]=different[levelNb]+1
    difference=append(difference,diff)}
  }
  for(diff in reldiffLoadLevel_Overall[[levelNb]]){
    if (is.na(diff)){}
    else if (diff>1){reldifference=append(reldifference,diff)}
  }
  datadiffloc=append(datadiffloc,rep((levelNb-1)*10,length(difference)))
  datadiff=append(datadiff,difference)
  datareldiff=append(datareldiff,reldifference)
  for(diff in reldiffLoadLevel_Marginal[[levelNb]]){
    if (is.na(diff)){}
    else if (diff>1){reldifference_m=append(reldifference_m,diff)}
  }
  datareldiff_m=append(datareldiff_m,reldifference_m)
}


##Create the dataframe for plotting the difference
LoadLevel= rep(seq(0,100,10),3)
Outcome=c(rep("Same",11),rep("Different",11),rep("Infeasible",11))
NbPlacements=c(same,different,infeasible)
nbDifferentPlacements =data.frame(LoadLevel,Outcome,NbPlacements)

### Plot - Nb of different placement
ggplot(data=nbDifferentPlacements, aes(x=LoadLevel, y=NbPlacements, fill=Outcome)) +
  geom_bar(stat="identity", position = position_stack())+
  theme_minimal()+
  ylab("# obtained placements")+
  xlab("Average load level in %")+
  labs(fill = "Overall and Marginal placements are")+
  scale_fill_manual(values=c("#A95AA1","#F5793A","#85C0F9"))+
  theme(legend.position = "top",axis.title.x = element_text(size = 20),
        axis.text.x = element_text(size = 20),
        axis.title.y = element_text(size = 20),
        axis.text.y = element_text(size = 20),
        legend.text=element_text(size = 20),
        legend.title=element_text(size = 20))
####End

## RANDOM BEGINNING DEVICE STUDIES

### FIXED LOAD - RANDOM BEGINNING DEVICE

####Begin
### Getting the data
result_data_csv <- read.csv(file="./RandomBeginningDevice/Fixed/resultsParsed_40rep_DeviceOnlyVar_2replicas_Uniform_RequestDeviceRandom.csv", header=TRUE, sep=",")

#Adding the load level column
result_data_csv$LoadLevel <- result_data_csv$Scenario*10 

###Filter per loadLevel
loadLevel0_Overall <- result_data_csv[which(result_data_csv$LoadLevel == 0 & result_data_csv$Alternative=="Overall"),]
loadLevel0_Marginal <- result_data_csv[which(result_data_csv$LoadLevel == 0 & result_data_csv$Alternative=="Marginal"),]
loadLevel1_Overall <- result_data_csv[which(result_data_csv$LoadLevel == 10 & result_data_csv$Alternative=="Overall"),]
loadLevel1_Marginal <- result_data_csv[which(result_data_csv$LoadLevel == 10 & result_data_csv$Alternative=="Marginal"),]
loadLevel2_Overall <- result_data_csv[which(result_data_csv$LoadLevel == 20 & result_data_csv$Alternative=="Overall"),]
loadLevel2_Marginal <- result_data_csv[which(result_data_csv$LoadLevel == 20 & result_data_csv$Alternative=="Marginal"),]
loadLevel3_Overall <- result_data_csv[which(result_data_csv$LoadLevel == 30 & result_data_csv$Alternative=="Overall"),]
loadLevel3_Marginal <- result_data_csv[which(result_data_csv$LoadLevel == 30 & result_data_csv$Alternative=="Marginal"),]
loadLevel4_Overall <- result_data_csv[which(result_data_csv$LoadLevel == 40 & result_data_csv$Alternative=="Overall"),]
loadLevel4_Marginal <- result_data_csv[which(result_data_csv$LoadLevel == 40 & result_data_csv$Alternative=="Marginal"),]
loadLevel5_Overall <- result_data_csv[which(result_data_csv$LoadLevel == 50 & result_data_csv$Alternative=="Overall"),]
loadLevel5_Marginal <- result_data_csv[which(result_data_csv$LoadLevel == 50 & result_data_csv$Alternative=="Marginal"),]
loadLevel6_Overall <- result_data_csv[which(result_data_csv$LoadLevel == 60 & result_data_csv$Alternative=="Overall"),]
loadLevel6_Marginal <- result_data_csv[which(result_data_csv$LoadLevel == 60 & result_data_csv$Alternative=="Marginal"),]
loadLevel7_Overall <- result_data_csv[which(result_data_csv$LoadLevel == 70 & result_data_csv$Alternative=="Overall"),]
loadLevel7_Marginal <- result_data_csv[which(result_data_csv$LoadLevel == 70 & result_data_csv$Alternative=="Marginal"),]
loadLevel8_Overall <- result_data_csv[which(result_data_csv$LoadLevel == 80 & result_data_csv$Alternative=="Overall"),]
loadLevel8_Marginal <- result_data_csv[which(result_data_csv$LoadLevel == 80 & result_data_csv$Alternative=="Marginal"),]
loadLevel9_Overall <- result_data_csv[which(result_data_csv$LoadLevel == 90 & result_data_csv$Alternative=="Overall"),]
loadLevel9_Marginal <- result_data_csv[which(result_data_csv$LoadLevel == 90 & result_data_csv$Alternative=="Marginal"),]
loadLevel10_Overall <- result_data_csv[which(result_data_csv$LoadLevel == 100 & result_data_csv$Alternative=="Overall"),]
loadLevel10_Marginal <- result_data_csv[which(result_data_csv$LoadLevel == 100 & result_data_csv$Alternative=="Marginal"),]


##Working on visualizing the difference
#Calculate the difference - for Overall Energy
diffLoadLevel0_Overall <- loadLevel0_Marginal$OverallEnergy - loadLevel0_Overall$OverallEnergy
diffLoadLevel1_Overall <- loadLevel1_Marginal$OverallEnergy - loadLevel1_Overall$OverallEnergy
diffLoadLevel2_Overall <- loadLevel2_Marginal$OverallEnergy - loadLevel2_Overall$OverallEnergy
diffLoadLevel3_Overall <- loadLevel3_Marginal$OverallEnergy - loadLevel3_Overall$OverallEnergy
diffLoadLevel4_Overall <- loadLevel4_Marginal$OverallEnergy - loadLevel4_Overall$OverallEnergy
diffLoadLevel5_Overall <- loadLevel5_Marginal$OverallEnergy - loadLevel5_Overall$OverallEnergy
diffLoadLevel6_Overall <- loadLevel6_Marginal$OverallEnergy - loadLevel6_Overall$OverallEnergy
diffLoadLevel7_Overall <- loadLevel7_Marginal$OverallEnergy - loadLevel7_Overall$OverallEnergy
diffLoadLevel8_Overall <- loadLevel8_Marginal$OverallEnergy - loadLevel8_Overall$OverallEnergy
diffLoadLevel9_Overall <- loadLevel9_Marginal$OverallEnergy - loadLevel9_Overall$OverallEnergy
diffLoadLevel10_Overall <- loadLevel10_Marginal$OverallEnergy - loadLevel10_Overall$OverallEnergy
diffLoadLevel_Overall = list(diffLoadLevel0_Overall,diffLoadLevel1_Overall,diffLoadLevel2_Overall,
                             diffLoadLevel3_Overall,diffLoadLevel4_Overall,diffLoadLevel5_Overall,
                             diffLoadLevel6_Overall,diffLoadLevel7_Overall,diffLoadLevel8_Overall,
                             diffLoadLevel9_Overall,diffLoadLevel10_Overall)
#Calculating how many are same, different and infeasible
same=rep(0,11)
different=rep(0,11)
infeasible=rep(0,11)
for (levelNb in seq(1,11)){
  print(levelNb)
  print(diffLoadLevel_Overall[levelNb])
  for(diff in diffLoadLevel_Overall[[levelNb]]){
    print(diff)
    if (is.na(diff)){infeasible[levelNb]=infeasible[levelNb]+1}
    else if (diff==0){same[levelNb]=same[levelNb]+1}
    else if (diff>0){different[levelNb]=different[levelNb]+1}
  }
}

##Create the dataframe for plotting the difference
LoadLevel= rep(seq(0,100,10),3)
Outcome=c(rep("Same",11),rep("Different",11),rep("Infeasible",11))
NbPlacements=c(same,different,infeasible)
nbDifferentPlacements =data.frame(LoadLevel,Outcome,NbPlacements)

### Plot - Nb of different placement
ggplot(data=nbDifferentPlacements, aes(x=LoadLevel, y=NbPlacements, fill=Outcome)) +
  geom_bar(stat="identity", position = position_stack())+
  theme_minimal()+
  ylab("# obtained placements")+
  xlab("Average load level in %")+
  labs(fill = "Overall and Marginal placements are")+
  scale_fill_manual(values=c("#A95AA1","#F5793A","#85C0F9"))+
  theme(legend.position = "top",axis.title.x = element_text(size = 24),
        axis.text.x = element_text(size = 24),
        axis.title.y = element_text(size = 24),
        axis.text.y = element_text(size = 24),
        legend.text=element_text(size = 24),
        legend.title=element_text(size = 24))
####End

### NORMALLY DISTRIBUTED LOAD (2 function instances/replicas) Std 10 - RANDOM BEGINNING DEVICE

#Graphs for the categorization of placements and the relative difference in overall/marginal energy
####Begin
### Getting the data
result_data_csv <- read.csv(file="./RandomBeginningDevice/Std10/resultsParsed_40rep_DeviceOnlyVar_2replicas_Std10_RequestDeviceRandom.csv", header=TRUE, sep=",")

#Adding the load level column
result_data_csv$LoadLevel <- result_data_csv$Scenario*10 

###Filter per loadLevel
loadLevel0_Overall <- result_data_csv[which(result_data_csv$LoadLevel == 0 & result_data_csv$Alternative=="Overall"),]
loadLevel0_Marginal <- result_data_csv[which(result_data_csv$LoadLevel == 0 & result_data_csv$Alternative=="Marginal"),]
loadLevel1_Overall <- result_data_csv[which(result_data_csv$LoadLevel == 10 & result_data_csv$Alternative=="Overall"),]
loadLevel1_Marginal <- result_data_csv[which(result_data_csv$LoadLevel == 10 & result_data_csv$Alternative=="Marginal"),]
loadLevel2_Overall <- result_data_csv[which(result_data_csv$LoadLevel == 20 & result_data_csv$Alternative=="Overall"),]
loadLevel2_Marginal <- result_data_csv[which(result_data_csv$LoadLevel == 20 & result_data_csv$Alternative=="Marginal"),]
loadLevel3_Overall <- result_data_csv[which(result_data_csv$LoadLevel == 30 & result_data_csv$Alternative=="Overall"),]
loadLevel3_Marginal <- result_data_csv[which(result_data_csv$LoadLevel == 30 & result_data_csv$Alternative=="Marginal"),]
loadLevel4_Overall <- result_data_csv[which(result_data_csv$LoadLevel == 40 & result_data_csv$Alternative=="Overall"),]
loadLevel4_Marginal <- result_data_csv[which(result_data_csv$LoadLevel == 40 & result_data_csv$Alternative=="Marginal"),]
loadLevel5_Overall <- result_data_csv[which(result_data_csv$LoadLevel == 50 & result_data_csv$Alternative=="Overall"),]
loadLevel5_Marginal <- result_data_csv[which(result_data_csv$LoadLevel == 50 & result_data_csv$Alternative=="Marginal"),]
loadLevel6_Overall <- result_data_csv[which(result_data_csv$LoadLevel == 60 & result_data_csv$Alternative=="Overall"),]
loadLevel6_Marginal <- result_data_csv[which(result_data_csv$LoadLevel == 60 & result_data_csv$Alternative=="Marginal"),]
loadLevel7_Overall <- result_data_csv[which(result_data_csv$LoadLevel == 70 & result_data_csv$Alternative=="Overall"),]
loadLevel7_Marginal <- result_data_csv[which(result_data_csv$LoadLevel == 70 & result_data_csv$Alternative=="Marginal"),]
loadLevel8_Overall <- result_data_csv[which(result_data_csv$LoadLevel == 80 & result_data_csv$Alternative=="Overall"),]
loadLevel8_Marginal <- result_data_csv[which(result_data_csv$LoadLevel == 80 & result_data_csv$Alternative=="Marginal"),]
loadLevel9_Overall <- result_data_csv[which(result_data_csv$LoadLevel == 90 & result_data_csv$Alternative=="Overall"),]
loadLevel9_Marginal <- result_data_csv[which(result_data_csv$LoadLevel == 90 & result_data_csv$Alternative=="Marginal"),]
loadLevel10_Overall <- result_data_csv[which(result_data_csv$LoadLevel == 100 & result_data_csv$Alternative=="Overall"),]
loadLevel10_Marginal <- result_data_csv[which(result_data_csv$LoadLevel == 100 & result_data_csv$Alternative=="Marginal"),]


##Working on visualizing the difference
#Calculate the difference - for Overall Energy
diffLoadLevel0_Overall <- loadLevel0_Marginal$OverallEnergy - loadLevel0_Overall$OverallEnergy
diffLoadLevel1_Overall <- loadLevel1_Marginal$OverallEnergy - loadLevel1_Overall$OverallEnergy
diffLoadLevel2_Overall <- loadLevel2_Marginal$OverallEnergy - loadLevel2_Overall$OverallEnergy
diffLoadLevel3_Overall <- loadLevel3_Marginal$OverallEnergy - loadLevel3_Overall$OverallEnergy
diffLoadLevel4_Overall <- loadLevel4_Marginal$OverallEnergy - loadLevel4_Overall$OverallEnergy
diffLoadLevel5_Overall <- loadLevel5_Marginal$OverallEnergy - loadLevel5_Overall$OverallEnergy
diffLoadLevel6_Overall <- loadLevel6_Marginal$OverallEnergy - loadLevel6_Overall$OverallEnergy
diffLoadLevel7_Overall <- loadLevel7_Marginal$OverallEnergy - loadLevel7_Overall$OverallEnergy
diffLoadLevel8_Overall <- loadLevel8_Marginal$OverallEnergy - loadLevel8_Overall$OverallEnergy
diffLoadLevel9_Overall <- loadLevel9_Marginal$OverallEnergy - loadLevel9_Overall$OverallEnergy
diffLoadLevel10_Overall <- loadLevel10_Marginal$OverallEnergy - loadLevel10_Overall$OverallEnergy
diffLoadLevel_Overall = list(diffLoadLevel0_Overall,diffLoadLevel1_Overall,diffLoadLevel2_Overall,
                             diffLoadLevel3_Overall,diffLoadLevel4_Overall,diffLoadLevel5_Overall,
                             diffLoadLevel6_Overall,diffLoadLevel7_Overall,diffLoadLevel8_Overall,
                             diffLoadLevel9_Overall,diffLoadLevel10_Overall)
#Calculate the relative difference - for Overall Energy
reldiffLoadLevel0_Overall <- loadLevel0_Marginal$OverallEnergy / loadLevel0_Overall$OverallEnergy
reldiffLoadLevel1_Overall <- loadLevel1_Marginal$OverallEnergy / loadLevel1_Overall$OverallEnergy
reldiffLoadLevel2_Overall <- loadLevel2_Marginal$OverallEnergy / loadLevel2_Overall$OverallEnergy
reldiffLoadLevel3_Overall <- loadLevel3_Marginal$OverallEnergy / loadLevel3_Overall$OverallEnergy
reldiffLoadLevel4_Overall <- loadLevel4_Marginal$OverallEnergy / loadLevel4_Overall$OverallEnergy
reldiffLoadLevel5_Overall <- loadLevel5_Marginal$OverallEnergy / loadLevel5_Overall$OverallEnergy
reldiffLoadLevel6_Overall <- loadLevel6_Marginal$OverallEnergy / loadLevel6_Overall$OverallEnergy
reldiffLoadLevel7_Overall <- loadLevel7_Marginal$OverallEnergy / loadLevel7_Overall$OverallEnergy
reldiffLoadLevel8_Overall <- loadLevel8_Marginal$OverallEnergy / loadLevel8_Overall$OverallEnergy
reldiffLoadLevel9_Overall <- loadLevel9_Marginal$OverallEnergy / loadLevel9_Overall$OverallEnergy
reldiffLoadLevel10_Overall <- loadLevel10_Marginal$OverallEnergy / loadLevel10_Overall$OverallEnergy
reldiffLoadLevel_Overall = list(reldiffLoadLevel0_Overall,reldiffLoadLevel1_Overall,reldiffLoadLevel2_Overall,
                                reldiffLoadLevel3_Overall,reldiffLoadLevel4_Overall,reldiffLoadLevel5_Overall,
                                reldiffLoadLevel6_Overall,reldiffLoadLevel7_Overall,reldiffLoadLevel8_Overall,
                                reldiffLoadLevel9_Overall,reldiffLoadLevel10_Overall)
#Calculate the relative difference - for Marginal Energy
reldiffLoadLevel0_Marginal <- loadLevel0_Overall$MarginalEnergy / loadLevel0_Marginal$MarginalEnergy
reldiffLoadLevel1_Marginal <- loadLevel1_Overall$MarginalEnergy / loadLevel1_Marginal$MarginalEnergy
reldiffLoadLevel2_Marginal <- loadLevel2_Overall$MarginalEnergy / loadLevel2_Marginal$MarginalEnergy
reldiffLoadLevel3_Marginal <- loadLevel3_Overall$MarginalEnergy / loadLevel3_Marginal$MarginalEnergy
reldiffLoadLevel4_Marginal <- loadLevel4_Overall$MarginalEnergy / loadLevel4_Marginal$MarginalEnergy
reldiffLoadLevel5_Marginal <- loadLevel5_Overall$MarginalEnergy / loadLevel5_Marginal$MarginalEnergy
reldiffLoadLevel6_Marginal <- loadLevel6_Overall$MarginalEnergy / loadLevel6_Marginal$MarginalEnergy
reldiffLoadLevel7_Marginal <- loadLevel7_Overall$MarginalEnergy / loadLevel7_Marginal$MarginalEnergy
reldiffLoadLevel8_Marginal <- loadLevel8_Overall$MarginalEnergy / loadLevel8_Marginal$MarginalEnergy
reldiffLoadLevel9_Marginal <- loadLevel9_Overall$MarginalEnergy / loadLevel9_Marginal$MarginalEnergy
reldiffLoadLevel10_Marginal <- loadLevel10_Overall$MarginalEnergy / loadLevel10_Marginal$MarginalEnergy
reldiffLoadLevel_Marginal = list(reldiffLoadLevel0_Marginal,reldiffLoadLevel1_Marginal,reldiffLoadLevel2_Marginal,
                                 reldiffLoadLevel3_Marginal,reldiffLoadLevel4_Marginal,reldiffLoadLevel5_Marginal,
                                 reldiffLoadLevel6_Marginal,reldiffLoadLevel7_Marginal,reldiffLoadLevel8_Marginal,
                                 reldiffLoadLevel9_Marginal,reldiffLoadLevel10_Marginal)

#Calculating how many are same, different and infeasible, also storing the data about the difference
same=rep(0,11)
different=rep(0,11)
infeasible=rep(0,11)
datadiff=vector()
datareldiff=vector()
datareldiff_m=vector()
datadiffloc=vector()
for (levelNb in seq(1,11)){
  difference=vector()
  reldifference=vector()
  reldifference_m=vector()
  for(diff in diffLoadLevel_Overall[[levelNb]]){
    if (is.na(diff)){infeasible[levelNb]=infeasible[levelNb]+1}
    else if (diff==0){same[levelNb]=same[levelNb]+1}
    else if (diff>0){different[levelNb]=different[levelNb]+1
    difference=append(difference,diff)}
  }
  for(diff in reldiffLoadLevel_Overall[[levelNb]]){
    if (is.na(diff)){}
    else if (diff>1){reldifference=append(reldifference,diff)}
  }
  datadiffloc=append(datadiffloc,rep((levelNb-1)*10,length(difference)))
  datadiff=append(datadiff,difference)
  datareldiff=append(datareldiff,reldifference)
  for(diff in reldiffLoadLevel_Marginal[[levelNb]]){
    if (is.na(diff)){}
    else if (diff>1){reldifference_m=append(reldifference_m,diff)}
  }
  datareldiff_m=append(datareldiff_m,reldifference_m)
}


##Create the dataframe for plotting the difference
LoadLevel= rep(seq(0,100,10),3)
Outcome=c(rep("Same",11),rep("Different",11),rep("Infeasible",11))
NbPlacements=c(same,different,infeasible)
nbDifferentPlacements =data.frame(LoadLevel,Outcome,NbPlacements)

### Plot - Nb of different placement
ggplot(data=nbDifferentPlacements, aes(x=LoadLevel, y=NbPlacements, fill=Outcome)) +
  geom_bar(stat="identity", position = position_stack())+
  theme_minimal()+
  ylab("# obtained placements")+
  xlab("Average load level in %")+
  labs(fill = "Overall and Marginal placements are")+
  scale_fill_manual(values=c("#A95AA1","#F5793A","#85C0F9"))+
  theme(legend.position = "top",axis.title.x = element_text(size = 24),
        axis.text.x = element_text(size = 24),
        axis.title.y = element_text(size = 24),
        axis.text.y = element_text(size = 24),
        legend.text=element_text(size = 24),
        legend.title=element_text(size = 24))

##Create the dataframe for statistics about the difference - OVERALL ENERGY
statisticsPlacement=data.frame(datadiffloc,datadiff,datareldiff)

#Get numbers for the text
quantile(statisticsPlacement$datareldiff,0.10)
quantile(statisticsPlacement$datareldiff,0.90)

###Plot - Statistics about the relative difference, violin plot
ggplot(data=statisticsPlacement, aes(x=factor(datadiffloc), y=datareldiff)) +
  geom_violin()+
  theme_minimal()+
  ylab("Relative difference in overall energy (J)")+
  xlab("Average load level in %")+
  theme(legend.position = "top",axis.title.x = element_text(size = 18),
        axis.text.x = element_text(size = 18),
        axis.title.y = element_text(size = 18),
        axis.text.y = element_text(size = 18),
        legend.text=element_text(size = 18),
        legend.title=element_text(size = 18))

##Create the dataframe for statistics about the difference - MARGINAL ENERGY
statisticsPlacement_m=data.frame(datadiffloc,datareldiff_m)

#Get numbers for the text
quantile(statisticsPlacement_m$datareldiff,0.10)
quantile(statisticsPlacement_m$datareldiff,0.90)

###Plot - Statistics about the relative difference, violin plot
ggplot(data=statisticsPlacement_m, aes(x=factor(datadiffloc), y=datareldiff_m)) +
  geom_violin()+
  theme_minimal()+
  ylab("Relative difference in marginal energy (J)")+
  xlab("Average load level in %")+
  theme(legend.position = "top",axis.title.x = element_text(size = 18),
        axis.text.x = element_text(size = 18),
        axis.title.y = element_text(size = 18),
        axis.text.y = element_text(size = 18),
        legend.text=element_text(size = 18),
        legend.title=element_text(size = 18))
####End

#Average included device utilization data graph
####Begin
### Getting the data - different placements ONLY
result_data_csv <- read.csv(file="./RandomBeginningDevice/Std10/resultsParsed_UtilizationDifferent_40rep_DeviceOnlyVar_2replicas_Std10_RequestDeviceRandom.csv", header=TRUE, sep=",")
#Adding the load level column
result_data_csv$LoadLevel <- result_data_csv$Scenario*10

#Create a dataframe with only the device utilization information
utilization=data.frame(result_data_csv$Device0,result_data_csv$Device1,result_data_csv$Device2,result_data_csv$Device3,
                       result_data_csv$Device4,result_data_csv$Device5,result_data_csv$Device6,result_data_csv$Device7,
                       result_data_csv$Device8,result_data_csv$Device9,result_data_csv$Device10)

#Calculating the mean utilization for each data line
meanUt=rowMeans(utilization,na.rm=TRUE)

#Create data frame for plotting
mean_data_utilization= data.frame(result_data_csv$LoadLevel,result_data_csv$Alternative,meanUt)

###Plot - Statistics about the utilization, violin plot
ggplot(data=mean_data_utilization, aes(x=factor(result_data_csv$LoadLevel), y=meanUt, fill=result_data_csv$Alternative)) +
  geom_violin()+
  theme_minimal()+
  ylab("Mean device utilization when placements are different (%)")+
  xlab("Average load level in %")+
  labs(fill = "Optimization objective")+
  scale_fill_manual(values=c("#F0E442","#0072B2"))+
  theme(legend.position = "top",axis.title.x = element_text(size = 18),
        axis.text.x = element_text(size = 18),
        axis.title.y = element_text(size = 18),
        axis.text.y = element_text(size = 18),
        legend.text=element_text(size = 18),
        legend.title=element_text(size = 18))
####End

#Completion Time graph for different placements
####Begin
## Getting the data - different placements ONLY
result_data_csv_ut_DifferentOnly <- read.csv(file="./RandomBeginningDevice/Std10/resultsParsed_UtilizationDifferent_40rep_DeviceOnlyVar_2replicas_Std10_RequestDeviceRandom.csv", header=TRUE, sep=",")
## Getting the data - all placements
result_data_csv_ev_All <- read.csv(file="./RandomBeginningDevice/Std10/resultsParsed_40rep_DeviceOnlyVar_2replicas_Std10_RequestDeviceRandom.csv", header=TRUE, sep=",")
result_data_csv_ev_All$LoadLevel <- result_data_csv_ev_All$Scenario*10 

##Adding a column for the combination Repetition_Scenario to be able to filter
result_data_csv_ut_DifferentOnly$id <- paste(result_data_csv_ut_DifferentOnly$Repetition,result_data_csv_ut_DifferentOnly$Scenario,sep = "_")
result_data_csv_ev_All$id <- paste(result_data_csv_ev_All$Repetition,result_data_csv_ev_All$Scenario,sep = "_")

##Filter the all data from the combination Repetition/Scenario/Alternative? to get only the info when placements are different
library(dplyr)
result_data_csv_ev_DifferentOnly = result_data_csv_ev_All %>% filter(id %in% result_data_csv_ut_DifferentOnly$id)

#Boxplot
ggplot(data=result_data_csv_ev_DifferentOnly, aes(x=factor(LoadLevel), y=CompletionTime,
                                                  fill=Alternative)) +
  geom_boxplot()+
  theme_minimal()+
  ylab("Request completion time when placements are different (ms)")+
  xlab("Average load level in %")+
  ylim(0,100)+
  labs(fill = "Optimization objective")+
  scale_fill_manual(values=c("#F0E442","#0072B2"))+
  theme(legend.position = "top",axis.title.x = element_text(size = 18),
        axis.text.x = element_text(size = 18),
        axis.title.y = element_text(size = 18),
        axis.text.y = element_text(size = 18),
        legend.text=element_text(size = 18),
        legend.title=element_text(size = 18))
####End

## NORMALLY DISTRIBUTED LOAD - STD 30 (2 function instances/replicas) - RANDOM BEGINNING DEVICE

####Begin
### Getting the data
result_data_csv <- read.csv(file="./RandomBeginningDevice/Std30/resultsParsed_40rep_DeviceOnlyVar_2replicas_Std30_RequestDeviceRandom.csv", header=TRUE, sep=",")

#Adding the load level column
result_data_csv$LoadLevel <- result_data_csv$Scenario*10 

###Filter per loadLevel
loadLevel0_Overall <- result_data_csv[which(result_data_csv$LoadLevel == 0 & result_data_csv$Alternative=="Overall"),]
loadLevel0_Marginal <- result_data_csv[which(result_data_csv$LoadLevel == 0 & result_data_csv$Alternative=="Marginal"),]
loadLevel1_Overall <- result_data_csv[which(result_data_csv$LoadLevel == 10 & result_data_csv$Alternative=="Overall"),]
loadLevel1_Marginal <- result_data_csv[which(result_data_csv$LoadLevel == 10 & result_data_csv$Alternative=="Marginal"),]
loadLevel2_Overall <- result_data_csv[which(result_data_csv$LoadLevel == 20 & result_data_csv$Alternative=="Overall"),]
loadLevel2_Marginal <- result_data_csv[which(result_data_csv$LoadLevel == 20 & result_data_csv$Alternative=="Marginal"),]
loadLevel3_Overall <- result_data_csv[which(result_data_csv$LoadLevel == 30 & result_data_csv$Alternative=="Overall"),]
loadLevel3_Marginal <- result_data_csv[which(result_data_csv$LoadLevel == 30 & result_data_csv$Alternative=="Marginal"),]
loadLevel4_Overall <- result_data_csv[which(result_data_csv$LoadLevel == 40 & result_data_csv$Alternative=="Overall"),]
loadLevel4_Marginal <- result_data_csv[which(result_data_csv$LoadLevel == 40 & result_data_csv$Alternative=="Marginal"),]
loadLevel5_Overall <- result_data_csv[which(result_data_csv$LoadLevel == 50 & result_data_csv$Alternative=="Overall"),]
loadLevel5_Marginal <- result_data_csv[which(result_data_csv$LoadLevel == 50 & result_data_csv$Alternative=="Marginal"),]
loadLevel6_Overall <- result_data_csv[which(result_data_csv$LoadLevel == 60 & result_data_csv$Alternative=="Overall"),]
loadLevel6_Marginal <- result_data_csv[which(result_data_csv$LoadLevel == 60 & result_data_csv$Alternative=="Marginal"),]
loadLevel7_Overall <- result_data_csv[which(result_data_csv$LoadLevel == 70 & result_data_csv$Alternative=="Overall"),]
loadLevel7_Marginal <- result_data_csv[which(result_data_csv$LoadLevel == 70 & result_data_csv$Alternative=="Marginal"),]
loadLevel8_Overall <- result_data_csv[which(result_data_csv$LoadLevel == 80 & result_data_csv$Alternative=="Overall"),]
loadLevel8_Marginal <- result_data_csv[which(result_data_csv$LoadLevel == 80 & result_data_csv$Alternative=="Marginal"),]
loadLevel9_Overall <- result_data_csv[which(result_data_csv$LoadLevel == 90 & result_data_csv$Alternative=="Overall"),]
loadLevel9_Marginal <- result_data_csv[which(result_data_csv$LoadLevel == 90 & result_data_csv$Alternative=="Marginal"),]
loadLevel10_Overall <- result_data_csv[which(result_data_csv$LoadLevel == 100 & result_data_csv$Alternative=="Overall"),]
loadLevel10_Marginal <- result_data_csv[which(result_data_csv$LoadLevel == 100 & result_data_csv$Alternative=="Marginal"),]


#Calculating how many are same, different and infeasible, also storing the data about the difference
same=rep(0,11)
different=rep(0,11)
infeasible=rep(0,11)
datadiff=vector()
datareldiff=vector()
datareldiff_m=vector()
datadiffloc=vector()
for (levelNb in seq(1,11)){
  difference=vector()
  reldifference=vector()
  reldifference_m=vector()
  for(diff in diffLoadLevel_Overall[[levelNb]]){
    if (is.na(diff)){infeasible[levelNb]=infeasible[levelNb]+1}
    else if (diff==0){same[levelNb]=same[levelNb]+1}
    else if (diff>0){different[levelNb]=different[levelNb]+1
    difference=append(difference,diff)}
  }
  for(diff in reldiffLoadLevel_Overall[[levelNb]]){
    if (is.na(diff)){}
    else if (diff>1){reldifference=append(reldifference,diff)}
  }
  datadiffloc=append(datadiffloc,rep((levelNb-1)*10,length(difference)))
  datadiff=append(datadiff,difference)
  datareldiff=append(datareldiff,reldifference)
  for(diff in reldiffLoadLevel_Marginal[[levelNb]]){
    if (is.na(diff)){}
    else if (diff>1){reldifference_m=append(reldifference_m,diff)}
  }
  datareldiff_m=append(datareldiff_m,reldifference_m)
}


##Create the dataframe for plotting the difference
LoadLevel= rep(seq(0,100,10),3)
Outcome=c(rep("Same",11),rep("Different",11),rep("Infeasible",11))
NbPlacements=c(same,different,infeasible)
nbDifferentPlacements =data.frame(LoadLevel,Outcome,NbPlacements)

### Plot - Nb of different placement
ggplot(data=nbDifferentPlacements, aes(x=LoadLevel, y=NbPlacements, fill=Outcome)) +
  geom_bar(stat="identity", position = position_stack())+
  theme_minimal()+
  ylab("# obtained placements")+
  xlab("Average load level in %")+
  labs(fill = "Overall and Marginal placements are")+
  scale_fill_manual(values=c("#A95AA1","#F5793A","#85C0F9"))+
  theme(legend.position = "top",axis.title.x = element_text(size = 24),
        axis.text.x = element_text(size = 24),
        axis.title.y = element_text(size = 24),
        axis.text.y = element_text(size = 24),
        legend.text=element_text(size = 24),
        legend.title=element_text(size = 24))
####End

## NORMALLY DISTRIBUTED LOAD - STD 10 (4 function instances/replicas) - RANDOM BEGINNING DEVICE

#Graphs for the categorization of placements and the relative difference in overall/marginal energy
####Begin
### Getting the data
result_data_csv <- read.csv(file="./RandomBeginningDevice/4fi/resultsParsed_40rep_DeviceOnlyVar_4replicas_Std10_RequestDeviceRandom.csv", header=TRUE, sep=",")

#Adding the load level column
result_data_csv$LoadLevel <- result_data_csv$Scenario*10 

###Filter per loadLevel
loadLevel0_Overall <- result_data_csv[which(result_data_csv$LoadLevel == 0 & result_data_csv$Alternative=="Overall"),]
loadLevel0_Marginal <- result_data_csv[which(result_data_csv$LoadLevel == 0 & result_data_csv$Alternative=="Marginal"),]
loadLevel1_Overall <- result_data_csv[which(result_data_csv$LoadLevel == 10 & result_data_csv$Alternative=="Overall"),]
loadLevel1_Marginal <- result_data_csv[which(result_data_csv$LoadLevel == 10 & result_data_csv$Alternative=="Marginal"),]
loadLevel2_Overall <- result_data_csv[which(result_data_csv$LoadLevel == 20 & result_data_csv$Alternative=="Overall"),]
loadLevel2_Marginal <- result_data_csv[which(result_data_csv$LoadLevel == 20 & result_data_csv$Alternative=="Marginal"),]
loadLevel3_Overall <- result_data_csv[which(result_data_csv$LoadLevel == 30 & result_data_csv$Alternative=="Overall"),]
loadLevel3_Marginal <- result_data_csv[which(result_data_csv$LoadLevel == 30 & result_data_csv$Alternative=="Marginal"),]
loadLevel4_Overall <- result_data_csv[which(result_data_csv$LoadLevel == 40 & result_data_csv$Alternative=="Overall"),]
loadLevel4_Marginal <- result_data_csv[which(result_data_csv$LoadLevel == 40 & result_data_csv$Alternative=="Marginal"),]
loadLevel5_Overall <- result_data_csv[which(result_data_csv$LoadLevel == 50 & result_data_csv$Alternative=="Overall"),]
loadLevel5_Marginal <- result_data_csv[which(result_data_csv$LoadLevel == 50 & result_data_csv$Alternative=="Marginal"),]
loadLevel6_Overall <- result_data_csv[which(result_data_csv$LoadLevel == 60 & result_data_csv$Alternative=="Overall"),]
loadLevel6_Marginal <- result_data_csv[which(result_data_csv$LoadLevel == 60 & result_data_csv$Alternative=="Marginal"),]
loadLevel7_Overall <- result_data_csv[which(result_data_csv$LoadLevel == 70 & result_data_csv$Alternative=="Overall"),]
loadLevel7_Marginal <- result_data_csv[which(result_data_csv$LoadLevel == 70 & result_data_csv$Alternative=="Marginal"),]
loadLevel8_Overall <- result_data_csv[which(result_data_csv$LoadLevel == 80 & result_data_csv$Alternative=="Overall"),]
loadLevel8_Marginal <- result_data_csv[which(result_data_csv$LoadLevel == 80 & result_data_csv$Alternative=="Marginal"),]
loadLevel9_Overall <- result_data_csv[which(result_data_csv$LoadLevel == 90 & result_data_csv$Alternative=="Overall"),]
loadLevel9_Marginal <- result_data_csv[which(result_data_csv$LoadLevel == 90 & result_data_csv$Alternative=="Marginal"),]
loadLevel10_Overall <- result_data_csv[which(result_data_csv$LoadLevel == 100 & result_data_csv$Alternative=="Overall"),]
loadLevel10_Marginal <- result_data_csv[which(result_data_csv$LoadLevel == 100 & result_data_csv$Alternative=="Marginal"),]


##Working on visualizing the difference
#Calculate the difference - for Overall Energy
diffLoadLevel0_Overall <- loadLevel0_Marginal$OverallEnergy - loadLevel0_Overall$OverallEnergy
diffLoadLevel1_Overall <- loadLevel1_Marginal$OverallEnergy - loadLevel1_Overall$OverallEnergy
diffLoadLevel2_Overall <- loadLevel2_Marginal$OverallEnergy - loadLevel2_Overall$OverallEnergy
diffLoadLevel3_Overall <- loadLevel3_Marginal$OverallEnergy - loadLevel3_Overall$OverallEnergy
diffLoadLevel4_Overall <- loadLevel4_Marginal$OverallEnergy - loadLevel4_Overall$OverallEnergy
diffLoadLevel5_Overall <- loadLevel5_Marginal$OverallEnergy - loadLevel5_Overall$OverallEnergy
diffLoadLevel6_Overall <- loadLevel6_Marginal$OverallEnergy - loadLevel6_Overall$OverallEnergy
diffLoadLevel7_Overall <- loadLevel7_Marginal$OverallEnergy - loadLevel7_Overall$OverallEnergy
diffLoadLevel8_Overall <- loadLevel8_Marginal$OverallEnergy - loadLevel8_Overall$OverallEnergy
diffLoadLevel9_Overall <- loadLevel9_Marginal$OverallEnergy - loadLevel9_Overall$OverallEnergy
diffLoadLevel10_Overall <- loadLevel10_Marginal$OverallEnergy - loadLevel10_Overall$OverallEnergy
diffLoadLevel_Overall = list(diffLoadLevel0_Overall,diffLoadLevel1_Overall,diffLoadLevel2_Overall,
                             diffLoadLevel3_Overall,diffLoadLevel4_Overall,diffLoadLevel5_Overall,
                             diffLoadLevel6_Overall,diffLoadLevel7_Overall,diffLoadLevel8_Overall,
                             diffLoadLevel9_Overall,diffLoadLevel10_Overall)
#Calculate the relative difference - for Overall Energy
reldiffLoadLevel0_Overall <- loadLevel0_Marginal$OverallEnergy / loadLevel0_Overall$OverallEnergy
reldiffLoadLevel1_Overall <- loadLevel1_Marginal$OverallEnergy / loadLevel1_Overall$OverallEnergy
reldiffLoadLevel2_Overall <- loadLevel2_Marginal$OverallEnergy / loadLevel2_Overall$OverallEnergy
reldiffLoadLevel3_Overall <- loadLevel3_Marginal$OverallEnergy / loadLevel3_Overall$OverallEnergy
reldiffLoadLevel4_Overall <- loadLevel4_Marginal$OverallEnergy / loadLevel4_Overall$OverallEnergy
reldiffLoadLevel5_Overall <- loadLevel5_Marginal$OverallEnergy / loadLevel5_Overall$OverallEnergy
reldiffLoadLevel6_Overall <- loadLevel6_Marginal$OverallEnergy / loadLevel6_Overall$OverallEnergy
reldiffLoadLevel7_Overall <- loadLevel7_Marginal$OverallEnergy / loadLevel7_Overall$OverallEnergy
reldiffLoadLevel8_Overall <- loadLevel8_Marginal$OverallEnergy / loadLevel8_Overall$OverallEnergy
reldiffLoadLevel9_Overall <- loadLevel9_Marginal$OverallEnergy / loadLevel9_Overall$OverallEnergy
reldiffLoadLevel10_Overall <- loadLevel10_Marginal$OverallEnergy / loadLevel10_Overall$OverallEnergy
reldiffLoadLevel_Overall = list(reldiffLoadLevel0_Overall,reldiffLoadLevel1_Overall,reldiffLoadLevel2_Overall,
                                reldiffLoadLevel3_Overall,reldiffLoadLevel4_Overall,reldiffLoadLevel5_Overall,
                                reldiffLoadLevel6_Overall,reldiffLoadLevel7_Overall,reldiffLoadLevel8_Overall,
                                reldiffLoadLevel9_Overall,reldiffLoadLevel10_Overall)
#Calculate the relative difference - for Marginal Energy
reldiffLoadLevel0_Marginal <- loadLevel0_Overall$MarginalEnergy / loadLevel0_Marginal$MarginalEnergy
reldiffLoadLevel1_Marginal <- loadLevel1_Overall$MarginalEnergy / loadLevel1_Marginal$MarginalEnergy
reldiffLoadLevel2_Marginal <- loadLevel2_Overall$MarginalEnergy / loadLevel2_Marginal$MarginalEnergy
reldiffLoadLevel3_Marginal <- loadLevel3_Overall$MarginalEnergy / loadLevel3_Marginal$MarginalEnergy
reldiffLoadLevel4_Marginal <- loadLevel4_Overall$MarginalEnergy / loadLevel4_Marginal$MarginalEnergy
reldiffLoadLevel5_Marginal <- loadLevel5_Overall$MarginalEnergy / loadLevel5_Marginal$MarginalEnergy
reldiffLoadLevel6_Marginal <- loadLevel6_Overall$MarginalEnergy / loadLevel6_Marginal$MarginalEnergy
reldiffLoadLevel7_Marginal <- loadLevel7_Overall$MarginalEnergy / loadLevel7_Marginal$MarginalEnergy
reldiffLoadLevel8_Marginal <- loadLevel8_Overall$MarginalEnergy / loadLevel8_Marginal$MarginalEnergy
reldiffLoadLevel9_Marginal <- loadLevel9_Overall$MarginalEnergy / loadLevel9_Marginal$MarginalEnergy
reldiffLoadLevel10_Marginal <- loadLevel10_Overall$MarginalEnergy / loadLevel10_Marginal$MarginalEnergy
reldiffLoadLevel_Marginal = list(reldiffLoadLevel0_Marginal,reldiffLoadLevel1_Marginal,reldiffLoadLevel2_Marginal,
                                 reldiffLoadLevel3_Marginal,reldiffLoadLevel4_Marginal,reldiffLoadLevel5_Marginal,
                                 reldiffLoadLevel6_Marginal,reldiffLoadLevel7_Marginal,reldiffLoadLevel8_Marginal,
                                 reldiffLoadLevel9_Marginal,reldiffLoadLevel10_Marginal)

#Calculating how many are same, different and infeasible, also storing the data about the difference
same=rep(0,11)
different=rep(0,11)
infeasible=rep(0,11)
datadiff=vector()
datareldiff=vector()
datareldiff_m=vector()
datadiffloc=vector()
for (levelNb in seq(1,11)){
  difference=vector()
  reldifference=vector()
  reldifference_m=vector()
  for(diff in diffLoadLevel_Overall[[levelNb]]){
    if (is.na(diff)){infeasible[levelNb]=infeasible[levelNb]+1}
    else if (diff==0){same[levelNb]=same[levelNb]+1}
    else if (diff>0){different[levelNb]=different[levelNb]+1
    difference=append(difference,diff)}
  }
  for(diff in reldiffLoadLevel_Overall[[levelNb]]){
    if (is.na(diff)){}
    else if (diff>1){reldifference=append(reldifference,diff)}
  }
  datadiffloc=append(datadiffloc,rep((levelNb-1)*10,length(difference)))
  datadiff=append(datadiff,difference)
  datareldiff=append(datareldiff,reldifference)
  for(diff in reldiffLoadLevel_Marginal[[levelNb]]){
    if (is.na(diff)){}
    else if (diff>1){reldifference_m=append(reldifference_m,diff)}
  }
  datareldiff_m=append(datareldiff_m,reldifference_m)
}


##Create the dataframe for plotting the difference
LoadLevel= rep(seq(0,100,10),3)
Outcome=c(rep("Same",11),rep("Different",11),rep("Infeasible",11))
NbPlacements=c(same,different,infeasible)
nbDifferentPlacements =data.frame(LoadLevel,Outcome,NbPlacements)

### Plot - Nb of different placement
ggplot(data=nbDifferentPlacements, aes(x=LoadLevel, y=NbPlacements, fill=Outcome)) +
  geom_bar(stat="identity", position = position_stack())+
  theme_minimal()+
  ylab("# obtained placements")+
  xlab("Average load level in %")+
  labs(fill = "Overall and Marginal placements are")+
  scale_fill_manual(values=c("#A95AA1","#F5793A","#85C0F9"))+
  theme(legend.position = "top",axis.title.x = element_text(size = 24),
        axis.text.x = element_text(size = 24),
        axis.title.y = element_text(size = 24),
        axis.text.y = element_text(size = 24),
        legend.text=element_text(size = 24),
        legend.title=element_text(size = 24))

##Create the dataframe for statistics about the difference - OVERALL ENERGY
statisticsPlacement=data.frame(datadiffloc,datadiff,datareldiff)

#Get numbers for the text
quantile(statisticsPlacement$datareldiff,0.10)
quantile(statisticsPlacement$datareldiff,0.90)

###Plot - Statistics about the relative difference, violin plot
ggplot(data=statisticsPlacement, aes(x=factor(datadiffloc), y=datareldiff)) +
  geom_violin()+
  theme_minimal()+
  ylab("Relative difference in overall energy (J)")+
  xlab("Average load level in %")+
  theme(legend.position = "top",axis.title.x = element_text(size = 18),
        axis.text.x = element_text(size = 18),
        axis.title.y = element_text(size = 18),
        axis.text.y = element_text(size = 18),
        legend.text=element_text(size = 18),
        legend.title=element_text(size = 18))

##Create the dataframe for statistics about the difference - MARGINAL ENERGY
statisticsPlacement_m=data.frame(datadiffloc,datareldiff_m)

#Get numbers for the text
quantile(statisticsPlacement_m$datareldiff,0.10)
quantile(statisticsPlacement_m$datareldiff,0.90)

###Plot - Statistics about the relative difference, violin plot
ggplot(data=statisticsPlacement_m, aes(x=factor(datadiffloc), y=datareldiff_m)) +
  geom_violin()+
  theme_minimal()+
  ylab("Relative difference in marginal energy (J)")+
  xlab("Average load level in %")+
  theme(legend.position = "top",axis.title.x = element_text(size = 18),
        axis.text.x = element_text(size = 18),
        axis.title.y = element_text(size = 18),
        axis.text.y = element_text(size = 18),
        legend.text=element_text(size = 18),
        legend.title=element_text(size = 18))
####End

#Average included device utilization data graph
####Begin
### Getting the data - different placements ONLY
result_data_csv <- read.csv(file="./RandomBeginningDevice/4fi/resultsParsed_UtilizationDifferent_40rep_DeviceOnlyVar_4replicas_Std10_RequestDeviceRandom.csv", header=TRUE, sep=",")
#Adding the load level column
result_data_csv$LoadLevel <- result_data_csv$Scenario*10

#Create a dataframe with only the device utilization information
utilization=data.frame(result_data_csv$Device0,result_data_csv$Device1,result_data_csv$Device2,result_data_csv$Device3,
                       result_data_csv$Device4,result_data_csv$Device5,result_data_csv$Device6,result_data_csv$Device7,
                       result_data_csv$Device8,result_data_csv$Device9,result_data_csv$Device10)

#Calculating the mean utilization for each data line
meanUt=rowMeans(utilization,na.rm=TRUE)

#Create data frame for plotting
mean_data_utilization= data.frame(result_data_csv$LoadLevel,result_data_csv$Alternative,meanUt)

###Plot - Statistics about the utilization, violin plot
ggplot(data=mean_data_utilization, aes(x=factor(result_data_csv$LoadLevel), y=meanUt, fill=result_data_csv$Alternative)) +
  geom_violin()+
  theme_minimal()+
  ylab("Mean device utilization when placements are different (%)")+
  xlab("Average load level in %")+
  labs(fill = "Optimization objective")+
  scale_fill_manual(values=c("#F0E442","#0072B2"))+
  theme(legend.position = "top",axis.title.x = element_text(size = 18),
        axis.text.x = element_text(size = 18),
        axis.title.y = element_text(size = 18),
        axis.text.y = element_text(size = 18),
        legend.text=element_text(size = 18),
        legend.title=element_text(size = 18))
####End

#Completion Time graph for different placements 
####Begin
## Getting the data - different placements ONLY
result_data_csv_ut_DifferentOnly <- read.csv(file="./4fi/RandomBeginningDevice/resultsParsed_UtilizationDifferent_40rep_DeviceOnlyVar_4replicas_Std10_RequestDeviceRandom.csv", header=TRUE, sep=",")
## Getting the data - all placements
result_data_csv_ev_All <- read.csv(file="./RandomBeginningDevice/4fi/resultsParsed_40rep_DeviceOnlyVar_4replicas_Std10_RequestDeviceRandom.csv", header=TRUE, sep=",")
result_data_csv_ev_All$LoadLevel <- result_data_csv_ev_All$Scenario*10 

##Adding a column for the combination Repetition_Scenario to be able to filter
result_data_csv_ut_DifferentOnly$id <- paste(result_data_csv_ut_DifferentOnly$Repetition,result_data_csv_ut_DifferentOnly$Scenario,sep = "_")
result_data_csv_ev_All$id <- paste(result_data_csv_ev_All$Repetition,result_data_csv_ev_All$Scenario,sep = "_")

##Filter the all data from the combination Repetition/Scenario/Alternative? to get only the info when placements are different
library(dplyr)
result_data_csv_ev_DifferentOnly = result_data_csv_ev_All %>% filter(id %in% result_data_csv_ut_DifferentOnly$id)

#Boxplot
ggplot(data=result_data_csv_ev_DifferentOnly, aes(x=factor(LoadLevel), y=CompletionTime,
                                                  fill=Alternative)) +
  geom_boxplot()+
  theme_minimal()+
  ylab("Request completion time when placements are different (ms)")+
  xlab("Average load level in %")+
  ylim(0,100)+
  labs(fill = "Optimization objective")+
  scale_fill_manual(values=c("#F0E442","#0072B2"))+
  theme(legend.position = "top",axis.title.x = element_text(size = 18),
        axis.text.x = element_text(size = 18),
        axis.title.y = element_text(size = 18),
        axis.text.y = element_text(size = 18),
        legend.text=element_text(size = 18),
        legend.title=element_text(size = 18))
####End


### NORMALLY DISTRIBUTED LOAD - STD 10 (6 function instances/replicas) - RANDOM BEGINNING DEVICE

#Graphs for the categorization of placements and the relative difference in overall/marginal energy
#### Begin
### Getting the data
result_data_csv <- read.csv(file="./RandomBeginningDevice/6fi/resultsParsed_40rep_DeviceOnlyVar_6replicas_Std10_RequestDeviceRandom.csv", header=TRUE, sep=",")

#Adding the load level column
result_data_csv$LoadLevel <- result_data_csv$Scenario*10 

###Filter per loadLevel
loadLevel0_Overall <- result_data_csv[which(result_data_csv$LoadLevel == 0 & result_data_csv$Alternative=="Overall"),]
loadLevel0_Marginal <- result_data_csv[which(result_data_csv$LoadLevel == 0 & result_data_csv$Alternative=="Marginal"),]
loadLevel1_Overall <- result_data_csv[which(result_data_csv$LoadLevel == 10 & result_data_csv$Alternative=="Overall"),]
loadLevel1_Marginal <- result_data_csv[which(result_data_csv$LoadLevel == 10 & result_data_csv$Alternative=="Marginal"),]
loadLevel2_Overall <- result_data_csv[which(result_data_csv$LoadLevel == 20 & result_data_csv$Alternative=="Overall"),]
loadLevel2_Marginal <- result_data_csv[which(result_data_csv$LoadLevel == 20 & result_data_csv$Alternative=="Marginal"),]
loadLevel3_Overall <- result_data_csv[which(result_data_csv$LoadLevel == 30 & result_data_csv$Alternative=="Overall"),]
loadLevel3_Marginal <- result_data_csv[which(result_data_csv$LoadLevel == 30 & result_data_csv$Alternative=="Marginal"),]
loadLevel4_Overall <- result_data_csv[which(result_data_csv$LoadLevel == 40 & result_data_csv$Alternative=="Overall"),]
loadLevel4_Marginal <- result_data_csv[which(result_data_csv$LoadLevel == 40 & result_data_csv$Alternative=="Marginal"),]
loadLevel5_Overall <- result_data_csv[which(result_data_csv$LoadLevel == 50 & result_data_csv$Alternative=="Overall"),]
loadLevel5_Marginal <- result_data_csv[which(result_data_csv$LoadLevel == 50 & result_data_csv$Alternative=="Marginal"),]
loadLevel6_Overall <- result_data_csv[which(result_data_csv$LoadLevel == 60 & result_data_csv$Alternative=="Overall"),]
loadLevel6_Marginal <- result_data_csv[which(result_data_csv$LoadLevel == 60 & result_data_csv$Alternative=="Marginal"),]
loadLevel7_Overall <- result_data_csv[which(result_data_csv$LoadLevel == 70 & result_data_csv$Alternative=="Overall"),]
loadLevel7_Marginal <- result_data_csv[which(result_data_csv$LoadLevel == 70 & result_data_csv$Alternative=="Marginal"),]
loadLevel8_Overall <- result_data_csv[which(result_data_csv$LoadLevel == 80 & result_data_csv$Alternative=="Overall"),]
loadLevel8_Marginal <- result_data_csv[which(result_data_csv$LoadLevel == 80 & result_data_csv$Alternative=="Marginal"),]
loadLevel9_Overall <- result_data_csv[which(result_data_csv$LoadLevel == 90 & result_data_csv$Alternative=="Overall"),]
loadLevel9_Marginal <- result_data_csv[which(result_data_csv$LoadLevel == 90 & result_data_csv$Alternative=="Marginal"),]
loadLevel10_Overall <- result_data_csv[which(result_data_csv$LoadLevel == 100 & result_data_csv$Alternative=="Overall"),]
loadLevel10_Marginal <- result_data_csv[which(result_data_csv$LoadLevel == 100 & result_data_csv$Alternative=="Marginal"),]


##Working on visualizing the difference
#Calculate the difference - for Overall Energy
diffLoadLevel0_Overall <- loadLevel0_Marginal$OverallEnergy - loadLevel0_Overall$OverallEnergy
diffLoadLevel1_Overall <- loadLevel1_Marginal$OverallEnergy - loadLevel1_Overall$OverallEnergy
diffLoadLevel2_Overall <- loadLevel2_Marginal$OverallEnergy - loadLevel2_Overall$OverallEnergy
diffLoadLevel3_Overall <- loadLevel3_Marginal$OverallEnergy - loadLevel3_Overall$OverallEnergy
diffLoadLevel4_Overall <- loadLevel4_Marginal$OverallEnergy - loadLevel4_Overall$OverallEnergy
diffLoadLevel5_Overall <- loadLevel5_Marginal$OverallEnergy - loadLevel5_Overall$OverallEnergy
diffLoadLevel6_Overall <- loadLevel6_Marginal$OverallEnergy - loadLevel6_Overall$OverallEnergy
diffLoadLevel7_Overall <- loadLevel7_Marginal$OverallEnergy - loadLevel7_Overall$OverallEnergy
diffLoadLevel8_Overall <- loadLevel8_Marginal$OverallEnergy - loadLevel8_Overall$OverallEnergy
diffLoadLevel9_Overall <- loadLevel9_Marginal$OverallEnergy - loadLevel9_Overall$OverallEnergy
diffLoadLevel10_Overall <- loadLevel10_Marginal$OverallEnergy - loadLevel10_Overall$OverallEnergy
diffLoadLevel_Overall = list(diffLoadLevel0_Overall,diffLoadLevel1_Overall,diffLoadLevel2_Overall,
                             diffLoadLevel3_Overall,diffLoadLevel4_Overall,diffLoadLevel5_Overall,
                             diffLoadLevel6_Overall,diffLoadLevel7_Overall,diffLoadLevel8_Overall,
                             diffLoadLevel9_Overall,diffLoadLevel10_Overall)
#Calculate the relative difference - for Overall Energy
reldiffLoadLevel0_Overall <- loadLevel0_Marginal$OverallEnergy / loadLevel0_Overall$OverallEnergy
reldiffLoadLevel1_Overall <- loadLevel1_Marginal$OverallEnergy / loadLevel1_Overall$OverallEnergy
reldiffLoadLevel2_Overall <- loadLevel2_Marginal$OverallEnergy / loadLevel2_Overall$OverallEnergy
reldiffLoadLevel3_Overall <- loadLevel3_Marginal$OverallEnergy / loadLevel3_Overall$OverallEnergy
reldiffLoadLevel4_Overall <- loadLevel4_Marginal$OverallEnergy / loadLevel4_Overall$OverallEnergy
reldiffLoadLevel5_Overall <- loadLevel5_Marginal$OverallEnergy / loadLevel5_Overall$OverallEnergy
reldiffLoadLevel6_Overall <- loadLevel6_Marginal$OverallEnergy / loadLevel6_Overall$OverallEnergy
reldiffLoadLevel7_Overall <- loadLevel7_Marginal$OverallEnergy / loadLevel7_Overall$OverallEnergy
reldiffLoadLevel8_Overall <- loadLevel8_Marginal$OverallEnergy / loadLevel8_Overall$OverallEnergy
reldiffLoadLevel9_Overall <- loadLevel9_Marginal$OverallEnergy / loadLevel9_Overall$OverallEnergy
reldiffLoadLevel10_Overall <- loadLevel10_Marginal$OverallEnergy / loadLevel10_Overall$OverallEnergy
reldiffLoadLevel_Overall = list(reldiffLoadLevel0_Overall,reldiffLoadLevel1_Overall,reldiffLoadLevel2_Overall,
                                reldiffLoadLevel3_Overall,reldiffLoadLevel4_Overall,reldiffLoadLevel5_Overall,
                                reldiffLoadLevel6_Overall,reldiffLoadLevel7_Overall,reldiffLoadLevel8_Overall,
                                reldiffLoadLevel9_Overall,reldiffLoadLevel10_Overall)
#Calculate the relative difference - for Marginal Energy
reldiffLoadLevel0_Marginal <- loadLevel0_Overall$MarginalEnergy / loadLevel0_Marginal$MarginalEnergy
reldiffLoadLevel1_Marginal <- loadLevel1_Overall$MarginalEnergy / loadLevel1_Marginal$MarginalEnergy
reldiffLoadLevel2_Marginal <- loadLevel2_Overall$MarginalEnergy / loadLevel2_Marginal$MarginalEnergy
reldiffLoadLevel3_Marginal <- loadLevel3_Overall$MarginalEnergy / loadLevel3_Marginal$MarginalEnergy
reldiffLoadLevel4_Marginal <- loadLevel4_Overall$MarginalEnergy / loadLevel4_Marginal$MarginalEnergy
reldiffLoadLevel5_Marginal <- loadLevel5_Overall$MarginalEnergy / loadLevel5_Marginal$MarginalEnergy
reldiffLoadLevel6_Marginal <- loadLevel6_Overall$MarginalEnergy / loadLevel6_Marginal$MarginalEnergy
reldiffLoadLevel7_Marginal <- loadLevel7_Overall$MarginalEnergy / loadLevel7_Marginal$MarginalEnergy
reldiffLoadLevel8_Marginal <- loadLevel8_Overall$MarginalEnergy / loadLevel8_Marginal$MarginalEnergy
reldiffLoadLevel9_Marginal <- loadLevel9_Overall$MarginalEnergy / loadLevel9_Marginal$MarginalEnergy
reldiffLoadLevel10_Marginal <- loadLevel10_Overall$MarginalEnergy / loadLevel10_Marginal$MarginalEnergy
reldiffLoadLevel_Marginal = list(reldiffLoadLevel0_Marginal,reldiffLoadLevel1_Marginal,reldiffLoadLevel2_Marginal,
                                 reldiffLoadLevel3_Marginal,reldiffLoadLevel4_Marginal,reldiffLoadLevel5_Marginal,
                                 reldiffLoadLevel6_Marginal,reldiffLoadLevel7_Marginal,reldiffLoadLevel8_Marginal,
                                 reldiffLoadLevel9_Marginal,reldiffLoadLevel10_Marginal)

#Calculating how many are same, different and infeasible, also storing the data about the difference
same=rep(0,11)
different=rep(0,11)
infeasible=rep(0,11)
datadiff=vector()
datareldiff=vector()
datareldiff_m=vector()
datadiffloc=vector()
for (levelNb in seq(1,11)){
  difference=vector()
  reldifference=vector()
  reldifference_m=vector()
  for(diff in diffLoadLevel_Overall[[levelNb]]){
    if (is.na(diff)){infeasible[levelNb]=infeasible[levelNb]+1}
    else if (diff==0){same[levelNb]=same[levelNb]+1}
    else if (diff>0){different[levelNb]=different[levelNb]+1
    difference=append(difference,diff)}
  }
  for(diff in reldiffLoadLevel_Overall[[levelNb]]){
    if (is.na(diff)){}
    else if (diff>1){reldifference=append(reldifference,diff)}
  }
  datadiffloc=append(datadiffloc,rep((levelNb-1)*10,length(difference)))
  datadiff=append(datadiff,difference)
  datareldiff=append(datareldiff,reldifference)
  for(diff in reldiffLoadLevel_Marginal[[levelNb]]){
    if (is.na(diff)){}
    else if (diff>1){reldifference_m=append(reldifference_m,diff)}
  }
  datareldiff_m=append(datareldiff_m,reldifference_m)
}


##Create the dataframe for plotting the difference
LoadLevel= rep(seq(0,100,10),3)
Outcome=c(rep("Same",11),rep("Different",11),rep("Infeasible",11))
NbPlacements=c(same,different,infeasible)
nbDifferentPlacements =data.frame(LoadLevel,Outcome,NbPlacements)

### Plot - Nb of different placement
ggplot(data=nbDifferentPlacements, aes(x=LoadLevel, y=NbPlacements, fill=Outcome)) +
  geom_bar(stat="identity", position = position_stack())+
  theme_minimal()+
  ylab("# obtained placements")+
  xlab("Average load level in %")+
  labs(fill = "Overall and Marginal placements are")+
  scale_fill_manual(values=c("#A95AA1","#F5793A","#85C0F9"))+
  theme(legend.position = "top",axis.title.x = element_text(size = 24),
        axis.text.x = element_text(size = 24),
        axis.title.y = element_text(size = 24),
        axis.text.y = element_text(size = 24),
        legend.text=element_text(size = 24),
        legend.title=element_text(size = 24))

##Create the dataframe for statistics about the difference - OVERALL ENERGY
statisticsPlacement=data.frame(datadiffloc,datadiff,datareldiff)

#Get numbers for the text
quantile(statisticsPlacement$datareldiff,0.10)
quantile(statisticsPlacement$datareldiff,0.90)

###Plot - Statistics about the relative difference, violin plot
ggplot(data=statisticsPlacement, aes(x=factor(datadiffloc), y=datareldiff)) +
  geom_violin()+
  theme_minimal()+
  ylab("Relative difference in overall energy (J)")+
  xlab("Average load level in %")+
  theme(legend.position = "top",axis.title.x = element_text(size = 18),
        axis.text.x = element_text(size = 18),
        axis.title.y = element_text(size = 18),
        axis.text.y = element_text(size = 18),
        legend.text=element_text(size = 18),
        legend.title=element_text(size = 18))

##Create the dataframe for statistics about the difference - MARGINAL ENERGY
statisticsPlacement_m=data.frame(datadiffloc,datareldiff_m)

#Get numbers for the text
quantile(statisticsPlacement_m$datareldiff,0.10)
quantile(statisticsPlacement_m$datareldiff,0.90)

###Plot - Statistics about the relative difference, violin plot
ggplot(data=statisticsPlacement_m, aes(x=factor(datadiffloc), y=datareldiff_m)) +
  geom_violin()+
  theme_minimal()+
  ylab("Relative difference in marginal energy (J)")+
  xlab("Average load level in %")+
  theme(legend.position = "top",axis.title.x = element_text(size = 18),
        axis.text.x = element_text(size = 18),
        axis.title.y = element_text(size = 18),
        axis.text.y = element_text(size = 18),
        legend.text=element_text(size = 18),
        legend.title=element_text(size = 18))
####End

#Average included device utilization data graph
####Begin
### Getting the data - different placements ONLY
result_data_csv <- read.csv(file="./RandomBeginningDevice/6fi/resultsParsed_UtilizationDifferent_40rep_DeviceOnlyVar_6replicas_Std10_RequestDeviceRandom.csv", header=TRUE, sep=",")
#Adding the load level column
result_data_csv$LoadLevel <- result_data_csv$Scenario*10

#Create a dataframe with only the device utilization information
utilization=data.frame(result_data_csv$Device0,result_data_csv$Device1,result_data_csv$Device2,result_data_csv$Device3,
                       result_data_csv$Device4,result_data_csv$Device5,result_data_csv$Device6,result_data_csv$Device7,
                       result_data_csv$Device8,result_data_csv$Device9,result_data_csv$Device10)

#Calculating the mean utilization for each data line
meanUt=rowMeans(utilization,na.rm=TRUE)

#Create data frame for plotting
mean_data_utilization= data.frame(result_data_csv$LoadLevel,result_data_csv$Alternative,meanUt)

###Plot - Statistics about the utilization, violin plot
ggplot(data=mean_data_utilization, aes(x=factor(result_data_csv$LoadLevel), y=meanUt, fill=result_data_csv$Alternative)) +
  geom_violin()+
  theme_minimal()+
  ylab("Mean device utilization when placements are different (%)")+
  xlab("Average load level in %")+
  labs(fill = "Optimization objective")+
  scale_fill_manual(values=c("#F0E442","#0072B2"))+
  theme(legend.position = "top",axis.title.x = element_text(size = 18),
        axis.text.x = element_text(size = 18),
        axis.title.y = element_text(size = 18),
        axis.text.y = element_text(size = 18),
        legend.text=element_text(size = 18),
        legend.title=element_text(size = 18))
####End

#Completion Time graph for different placements 
#### Begin
## Getting the data - different placements ONLY
result_data_csv_ut_DifferentOnly <- read.csv(file="./RandomBeginningDevice/6fi/resultsParsed_UtilizationDifferent_40rep_DeviceOnlyVar_6replicas_Std10_RequestDeviceRandom.csv", header=TRUE, sep=",")
## Getting the data - all placements
result_data_csv_ev_All <- read.csv(file="./RandomBeginningDevice/6fi/resultsParsed_40rep_DeviceOnlyVar_6replicas_Std10_RequestDeviceRandom.csv", header=TRUE, sep=",")
result_data_csv_ev_All$LoadLevel <- result_data_csv_ev_All$Scenario*10 

##Adding a column for the combination Repetition_Scenario to be able to filter
result_data_csv_ut_DifferentOnly$id <- paste(result_data_csv_ut_DifferentOnly$Repetition,result_data_csv_ut_DifferentOnly$Scenario,sep = "_")
result_data_csv_ev_All$id <- paste(result_data_csv_ev_All$Repetition,result_data_csv_ev_All$Scenario,sep = "_")

##Filter the all data from the combination Repetition/Scenario/Alternative? to get only the info when placements are different
library(dplyr)
result_data_csv_ev_DifferentOnly = result_data_csv_ev_All %>% filter(id %in% result_data_csv_ut_DifferentOnly$id)

#Boxplot
ggplot(data=result_data_csv_ev_DifferentOnly, aes(x=factor(LoadLevel), y=CompletionTime,
                                                  fill=Alternative)) +
  geom_boxplot()+
  theme_minimal()+
  ylab("Request completion time when placements are different (ms)")+
  xlab("Average load level in %")+
  labs(fill = "Optimization objective")+
  ylim(0,100)+
  scale_fill_manual(values=c("#F0E442","#0072B2"))+
  theme(legend.position = "top",axis.title.x = element_text(size = 18),
        axis.text.x = element_text(size = 18),
        axis.title.y = element_text(size = 18),
        axis.text.y = element_text(size = 18),
        legend.text=element_text(size = 18),
        legend.title=element_text(size = 18))