mirror of
https://gitlab.com/manzerbredes/paper-lowrate-iot.git
synced 2025-04-19 04:09:43 +00:00
292 lines
10 KiB
Org Mode
292 lines
10 KiB
Org Mode
|
|
|
|
|
|
|
|
* Logs Analysis
|
|
** R Scripts
|
|
*** Plots script
|
|
#+BEGIN_SRC R :results output :noweb yes :file second-final/plot.png
|
|
<<RUtils>>
|
|
dataOrig=loadData("./second-final/data.csv")
|
|
|
|
data=dataOrig%>%filter(simKey=="nbSensors")%>%filter(state=="sim",nbSensors==100)
|
|
dataIDLE=dataOrig%>%filter(simKey=="nbSensors")%>%filter(state!="sim",nbSensors==100)
|
|
data=data%>%mutate(meanEnergy=mean(energy))
|
|
dataIDLE=dataIDLE%>%mutate(meanEnergy=mean(energy))
|
|
data=rbind(data,dataIDLE)
|
|
ggplot(data,aes(x=time,y=energy))+geom_point(position="jitter")+xlab(getLabel("time"))+expand_limits(y=0)+facet_wrap(~state)+geom_hline(aes(color=state,yintercept=mean(meanEnergy)))
|
|
ggsave("./second-final/plot.png",dpi=180)
|
|
#+END_SRC
|
|
|
|
#+RESULTS:
|
|
#+begin_example
|
|
# A tibble: 3,050 x 8
|
|
ts energy simKey vmSize nbSensors time state meanEnergy
|
|
<dbl> <dbl> <chr> <dbl> <dbl> <dbl> <chr> <dbl>
|
|
1 1558429001. 90.2 nbSensors 2048 100 0 IDLE 90.8
|
|
2 1558429001. 89 nbSensors 2048 100 0.0199 IDLE 90.8
|
|
3 1558429001. 89 nbSensors 2048 100 0.0399 IDLE 90.8
|
|
4 1558429001. 90.8 nbSensors 2048 100 0.0599 IDLE 90.8
|
|
5 1558429001. 91 nbSensors 2048 100 0.0799 IDLE 90.8
|
|
6 1558429001. 90.5 nbSensors 2048 100 0.1000 IDLE 90.8
|
|
7 1558429001. 89.9 nbSensors 2048 100 0.120 IDLE 90.8
|
|
8 1558429001. 88.6 nbSensors 2048 100 0.140 IDLE 90.8
|
|
9 1558429001. 88.6 nbSensors 2048 100 0.160 IDLE 90.8
|
|
10 1558429001. 90.5 nbSensors 2048 100 0.180 IDLE 90.8
|
|
# … with 3,040 more rows
|
|
#+end_example
|
|
|
|
|
|
|
|
|
|
|
|
|
|
**** Final plot
|
|
|
|
#+BEGIN_SRC R :results graphics :noweb yes :file second-final/plot-final.png :session *R*
|
|
<<RUtils>>
|
|
data=loadData("./second-final/data.csv")
|
|
data=data%>%filter(state=="sim",simKey=="nbSensors")
|
|
|
|
|
|
# Cloud
|
|
data10=data%>%filter(nbSensors==20)%>%mutate(meanEnergy=mean(energy)) %>% slice(1L)
|
|
data100=data%>%filter(nbSensors==100)%>%mutate(meanEnergy=mean(energy)) %>% slice(1L)
|
|
data300=data%>%filter(nbSensors==300)%>%mutate(meanEnergy=mean(energy)) %>% slice(1L)
|
|
dataCloud=rbind(data10,data100,data300)%>%mutate(nbSensors=as.character(nbSensors))
|
|
|
|
# Network
|
|
dataNet=loadData("../../ns3-simulations/logs/data.csv")
|
|
dataNet=dataNet%>%filter(simKey=="NBSENSORS")
|
|
data5=dataNet%>%filter(sensorsNumber==5)%>%select(networkEnergy,sensorsNumber)
|
|
data10=dataNet%>%filter(sensorsNumber==10)%>%select(networkEnergy,sensorsNumber)
|
|
|
|
print(data20)
|
|
|
|
ggplot(dataCloud)+geom_bar(aes(x=nbSensors,y=meanEnergy),stat="identity")+xlab("Sensors Number")+ylab("Power Consumption (W)")
|
|
ggsave("./second-final/plot-final.png",dpi=80)
|
|
|
|
#+END_SRC
|
|
|
|
#+RESULTS:
|
|
|
|
|
|
|
|
|
|
#+BEGIN_SRC R :noweb yes :results graphics :file final.png :session *R*
|
|
<<RUtils>>
|
|
|
|
|
|
data=loadData("./second-final/data.csv")
|
|
data=data%>%filter(state=="sim",simKey=="nbSensors")
|
|
|
|
# Cloud
|
|
data10=data%>%filter(nbSensors==20)%>%mutate(energy=mean(energy)) %>% slice(1L)
|
|
data100=data%>%filter(nbSensors==100)%>%mutate(energy=mean(energy)) %>% slice(1L)
|
|
data300=data%>%filter(nbSensors==300)%>%mutate(energy=mean(energy)) %>% slice(1L)
|
|
dataCloud=rbind(data10,data100,data300)%>%mutate(sensorsNumber=nbSensors)%>%mutate(type="Cloud")%>%select(sensorsNumber,energy,type)
|
|
|
|
|
|
|
|
approx=function(data1, data2,nbSensors){
|
|
x1=data1$sensorsNumber
|
|
y1=data1$energy
|
|
|
|
x2=data2$sensorsNumber
|
|
y2=data2$energy
|
|
|
|
a=((y2-y1)/(x2-x1))
|
|
b=y1-a*x1
|
|
|
|
return(a*nbSensors+b)
|
|
|
|
}
|
|
|
|
|
|
simTime=1800
|
|
|
|
# Network
|
|
data=read_csv("../../ns3-simulations/logs/data.csv")
|
|
data=data%>%filter(simKey=="NBSENSORS")
|
|
dataC5=data%>%filter(sensorsNumber==5)%>% mutate(energy=networkEnergy/simTime) %>%select(energy,sensorsNumber)
|
|
dataC10=data%>%filter(sensorsNumber==10)%>%mutate(energy=networkEnergy/simTime) %>%select(energy,sensorsNumber)
|
|
dataNet=rbind(dataC5,dataC10)%>%mutate(type="Network")
|
|
|
|
# Sensors
|
|
dataS5=data%>%filter(sensorsNumber==5)%>% mutate(energy=sensorsEnergy/simTime) %>%select(energy,sensorsNumber)
|
|
dataS10=data%>%filter(sensorsNumber==10)%>%mutate(energy=sensorsEnergy/simTime) %>%select(energy,sensorsNumber)
|
|
dataS=rbind(dataS5,dataS10)%>%mutate(type="Sensors")
|
|
|
|
fakeNetS=tibble(
|
|
sensorsNumber=c(20,100,300,20,100,300),
|
|
energy=c(dataC10$energy,approx(dataC5,dataC10,100),approx(dataC5,dataC10,300),dataS10$energy,approx(dataS5,dataS10,100),approx(dataS5,dataS10,300)),
|
|
type=c("Network","Network","Network","Sensors","Sensors","Sensors")
|
|
)
|
|
|
|
fakeNetS=fakeNetS%>%mutate(sensorsNumber=as.character(sensorsNumber))
|
|
dataCloud=dataCloud%>%mutate(sensorsNumber=as.character(sensorsNumber))
|
|
|
|
data=rbind(fakeNetS,dataCloud)%>%mutate(sensorsNumber=as.character(sensorsNumber))
|
|
|
|
|
|
data=data%>%mutate(sensorsNumber=fct_reorder(sensorsNumber,as.numeric(sensorsNumber)))
|
|
|
|
ggplot(data)+geom_bar(position="dodge2",colour="black",aes(x=sensorsNumber,y=energy,fill=type),stat="identity")+
|
|
xlab("Sensors Number")+ylab("Power Consumption (W)")+guides(fill=guide_legend(title="Part"))
|
|
ggsave("final.png",dpi=80)
|
|
|
|
#+END_SRC
|
|
|
|
#+RESULTS:
|
|
[[file:final.png]]
|
|
|
|
|
|
|
|
|
|
|
|
*** R Utils
|
|
RUtils is intended to load logs (data.csv) and providing
|
|
simple plot function for them.
|
|
|
|
#+NAME: RUtils
|
|
#+BEGIN_SRC R :eval never
|
|
library("tidyverse")
|
|
|
|
# Fell free to update the following
|
|
labels=c(time="Time (s)")
|
|
|
|
loadData=function(path){
|
|
data=read_csv(path)
|
|
}
|
|
|
|
# Get label according to varName
|
|
getLabel=function(varName){
|
|
if(is.na(labels[varName])){
|
|
return(varName)
|
|
}
|
|
return(labels[varName])
|
|
}
|
|
#+END_SRC
|
|
|
|
** Plots -> PDF
|
|
Merge all plots in plots/ folder into a pdf file.
|
|
#+NAME: plotToPDF
|
|
#+BEGIN_SRC bash :results output :noweb yes
|
|
orgFile="plots/plots.org"
|
|
<<singleRun>> # To get all default arguments
|
|
|
|
# Write helper function
|
|
function write {
|
|
echo "$1" >> $orgFile
|
|
}
|
|
|
|
echo "#+TITLE: Analysis" > $orgFile
|
|
write "#+LATEX_HEADER: \usepackage{fullpage}"
|
|
write "#+OPTIONS: toc:nil"
|
|
# Default arguments
|
|
write '\begin{center}'
|
|
write '\begin{tabular}{lr}'
|
|
write 'Parameters & Values\\'
|
|
write '\hline'
|
|
write "sensorsPktSize & ${sensorsPktSize} bytes\\\\"
|
|
write "sensorsSendInterval & ${sensorsSendInterval}s\\\\"
|
|
write "sensorsNumber & ${sensorsNumber}\\\\"
|
|
write "nbHop & ${nbHop}\\\\"
|
|
write "linksBandwidth & ${linksBandwidth}Mbps\\\\"
|
|
write "linksLatency & ${linksLatency}ms\\\\"
|
|
write '\end{tabular}'
|
|
write '\newline'
|
|
write '\end{center}'
|
|
|
|
for plot in $(find plots/ -type f -name "*.png")
|
|
do
|
|
write "\includegraphics[width=0.5\linewidth]{$(basename ${plot})}"
|
|
done
|
|
|
|
# Export to pdf
|
|
emacs $orgFile --batch -f org-latex-export-to-pdf --kill
|
|
#+END_SRC
|
|
|
|
|
|
** CSVs -> CSV
|
|
Merge all energy file into one (and add additional fields).
|
|
|
|
#+NAME: mergeCSV
|
|
#+BEGIN_SRC sh
|
|
#!/bin/bash
|
|
|
|
whichLog="second-final"
|
|
|
|
|
|
logFile="$(dirname $(readlink -f $0))"/$whichLog/simLogs.txt
|
|
dataFile=$(dirname "$logFile")/data.csv
|
|
|
|
|
|
getValue () {
|
|
line=$(echo "$1" | grep "Simulation para"|sed "s/Simulation parameters: //g")
|
|
key=$2
|
|
echo "$line"|awk 'BEGIN{RS=" ";FS=":"}"'$key'"==$1{gsub("\n","",$0);print $2}'
|
|
}
|
|
|
|
##### Add extract info to energy #####
|
|
IFS=$'\n'
|
|
for cmd in $(cat $logFile|grep "Simulation parameters")
|
|
do
|
|
nodeName=$(getValue $cmd serverNodeName)
|
|
from=$(getValue $cmd simStart)
|
|
to=$(getValue $cmd simEnd)
|
|
vmSize=$(getValue $cmd vmSize)
|
|
nbSensors=$(getValue $cmd nbSensors)
|
|
simKey=$(getValue $cmd simKey)
|
|
csvFile="$whichLog/${simKey}_${vmSize}VMSIZE_${nbSensors}NBSENSORS_${from}${to}.csv"
|
|
csvFileIDLE="$whichLog/${simKey}_${vmSize}VMSIZE_${nbSensors}NBSENSORS_${from}${to}_IDLE.csv"
|
|
tmpFile=${csvFile}_tmp
|
|
echo ts,energy,simKey,vmSize,nbSensors,time,state > $tmpFile
|
|
minTs=$(tail -n+2 $csvFile|awk -F"," 'BEGIN{min=0}$1<min||min==0{min=$1}END{print(min)}') # To compute ts field
|
|
minTsIDLE=$(tail -n+2 $csvFileIDLE|awk -F"," 'BEGIN{min=0}$1<min||min==0{min=$1}END{print(min)}') # To compute ts field
|
|
tail -n+2 ${csvFile} | awk -F"," '{print $0",'$simKey','$vmSize','$nbSensors',"$1-'$minTs'",sim"}' >> $tmpFile
|
|
tail -n+2 ${csvFileIDLE} | awk -F"," '{print $0",'$simKey','$vmSize','$nbSensors',"$1-'$minTsIDLE'",IDLE"}' >> $tmpFile
|
|
done
|
|
|
|
|
|
##### Fill dataFile #####
|
|
echo ts,energy,simKey,vmSize,nbSensors,time,state > $dataFile
|
|
for tmpFile in $(find ${whichLog}/*_tmp -type f)
|
|
do
|
|
tail -n+2 $tmpFile >> $dataFile
|
|
rm $tmpFile # Pay attention to this line :D
|
|
done
|
|
#+END_SRC
|
|
|
|
#+RESULTS: mergeCSV
|
|
|
|
|
|
|
|
** Custom Plots
|
|
|
|
#+NAME: ssiNet
|
|
#+BEGIN_SRC R :noweb yes :results graphics :file plots/sensorsSendInterval-net.png
|
|
<<RUtils>>
|
|
|
|
data%>%filter(simKey=="SENDINTERVAL",sensorsNumber==20) %>% ggplot(aes(x=sensorsSendInterval,y=networkEnergy))+xlab(getLabel("sensorsSendInterval"))+ylab(getLabel("networkEnergy"))+
|
|
geom_line()+labs(title="For 20 sensors")
|
|
ggsave("plots/sensorsSendInterval-net.png",dpi=80)
|
|
#+END_SRC
|
|
|
|
#+RESULTS:
|
|
[[file:plots/sensorsSendInterval-net.png]]
|
|
|
|
|
|
#+NAME: ssiWifi
|
|
#+BEGIN_SRC R :noweb yes :results graphics :file plots/sensorsSendInterval-wifi.png
|
|
<<RUtils>>
|
|
data%>%filter(simKey=="SENDINTERVAL",sensorsNumber==20) %>% ggplot(aes(x=sensorsSendInterval,y=sensorsEnergy))+xlab(getLabel("sensorsSendInterval"))+ylab(getLabel("sensorsEnergy"))+
|
|
geom_line() + geom_line()+labs(title="For 20 sensors")
|
|
ggsave("plots/sensorsSendInterval-wifi.png",dpi=80)
|
|
#+END_SRC
|
|
|
|
#+RESULTS: ssiWifi
|
|
[[file:plots/sensorsSendInterval-wifi.png]]
|
|
|
|
#+RESULTS:
|
|
[[file:plots/sensorsSendInterval.png]]
|