Debug+Do Simulations

This commit is contained in:
Loic Guegan 2019-04-26 11:13:36 +02:00
parent 79ef212a8c
commit 89d815f81e
70 changed files with 190288 additions and 312708 deletions

View file

@ -2,35 +2,91 @@
* Run simulations
To run all the simulations, execute the following call:
#+NAME: runSim
#+CALL: runBW(lat=runLat(nbSens=runNbSensors(nbHop=runNbHop())))
#+RESULTS: runSim
** Experiments
*** Number of sensors
*** Bandwidth
#+NAME: runBW
#+BEGIN_SRC bash :noweb yes :results output
<<singleRun>>
for sensorsNumber in $(seq 0 20)
simKey="BW"
sensorsNumber=10
for linksBandwidth in $(seq 10 20 100)
do
run
done
done
#+END_SRC
#+RESULTS: runBW
#+RESULTS:
*** Latency
#+NAME: runLat
#+BEGIN_SRC bash :noweb yes :results output
<<singleRun>>
simKey="LATENCY"
sensorsNumber=10
for linksLatency in $(seq 1 1 10)
do
run
done
#+END_SRC
#+RESULTS: runLat
#+RESULTS:
*** Number of sensors
#+NAME: runNbSensors
#+BEGIN_SRC bash :noweb yes :results output
<<singleRun>>
simKey="NBSENSORS"
for sensorsNumber in $(seq 1 5)
do
run
done
#+END_SRC
#+RESULTS:
*** Number of Hop
#+NAME: runNbHop
#+BEGIN_SRC bash :noweb yes :results output
<<singleRun>>
simKey="NBHOP"
for nbHop in $(seq 1 10)
do
run
done
#+END_SRC
** Single Run
#+NAME: singleRun
#+BEGIN_SRC bash :noweb yes
simulator="ns3-simulator/simulator"
#+BEGIN_SRC bash :eval never :noweb yes :results output
simulator="simulator/simulator"
parseEnergyScript="./parseEnergy.awk"
parseDelayScript="./parseDelay.awk"
logFolder="logs/"
export LD_LIBRARY_PATH=${LD_LIBRARY_PATH}:${NS3_PATH}/build/lib
# Default Parameters
sensorsSendInterval=10
sensorsPktSize=5 # 1 byte temperature (-128 à +128 °C) and 4Byte sensorsId
sensorsNumber=10
nbHop=10 # Cf paper AC/Yunbo
linksBandwidth=10
linksLatency=2
simKey="NOKEY"
run () {
[ -z ${sensorsSendInterval+x} ] && sensorsSendInterval=1
[ -z ${sensorsPktSize+x} ] && sensorsPktSize=10
[ -z ${sensorsNumber+x} ] && sensorsNumber=2
[ -z ${nbHop+x} ] && nbHop=2
[ -z ${linksBandwidth+x} ] && linksBandwidth=10
[ -z ${linksLatency+x} ] && linksLatency=10
logFile="${logFolder}/ns-3_${sensorsSendInterval}SSI_${sensorsPktSize}SPS_${sensorsNumber}SN_${nbHop}NH_${linksBandwidth}LB_${linksLatency}LL.org"
logFile="${logFolder}/${simKey}_${sensorsSendInterval}SSI_${sensorsPktSize}SPS_${sensorsNumber}SN_${nbHop}NH_${linksBandwidth}LB_${linksLatency}LL.org"
[ -f "$logFile" ] && return
simCMD="$simulator --sensorsSendInterval=${sensorsSendInterval} --sensorsPktSize=${sensorsPktSize} --sensorsNumber=${sensorsNumber} --nbHop=${nbHop} --linksBandwidth=${linksBandwidth} --linksLatency=${linksLatency} 2>&1"
log=$(bash -c "$simCMD")
@ -53,19 +109,123 @@
echo "* Energy CSV (negative nodeId = WIFI, 0 = AP (Wireless+Wired), positive nodeId = ECOFEN" >> $logFile
echo "$energyLog" >> $logFile
echo "* Metrics" >> $logFile
echo "-METRICSLINE- sensorsSendInterval:${sensorsSendInterval} sensorsPktSize:${sensorsPktSize} sensorsNumber:${sensorsNumber} nbHop:${nbHop} linksBandwidth:${linksBandwidth} linksLatency:${linksLatency} totalEnergy:$totalEnergy nbPacketCloud:$nbPacketCloud nbNodes:$nbNodes avgDelay:${avgDelay} ns3Version:${ns3Version}" >> $logFile
echo "-METRICSLINE- sensorsSendInterval:${sensorsSendInterval} sensorsPktSize:${sensorsPktSize} sensorsNumber:${sensorsNumber} nbHop:${nbHop} linksBandwidth:${linksBandwidth} linksLatency:${linksLatency} totalEnergy:$totalEnergy nbPacketCloud:$nbPacketCloud nbNodes:$nbNodes avgDelay:${avgDelay} ns3Version:${ns3Version} simKey:${simKey}" >> $logFile
}
#+END_SRC
* Logs Analysis
To Generate all the plots, please execute the following line:
#+NAME: runAnalysis
#+CALL: plotToPDF(plots=genAllPlots(data=logToCSV()))
#+RESULTS: runAnalysis
** R Scripts
*** Generate all plots script
Available variables:
|---------------------|
| Name |
|---------------------|
| sensorsSendInterval |
| sensorsPktSize |
| sensorsNumber |
| nbHop |
| linksBandwidth |
| linksLatency |
| totalEnergy |
| nbPacketCloud |
| nbNodes |
| avgDelay |
| simKey |
|---------------------|
#+NAME: genAllPlots
#+BEGIN_SRC R :noweb yes :results output
<<RUtils>>
easyPlot("linksLatency","totalEnergy", "LATENCY")
easyPlot("linksBandwidth","totalEnergy", "BW")
easyPlot("sensorsNumber","totalEnergy", "NBSENSORS")
easyPlot("nbHop","totalEnergy", "NBHOP")
#+END_SRC
*** 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(nbNodes="Number of nodes",nbSensors="Number of sensors",totalEnergy="Total Energy (J)",
nbHop="Number of hop (AP to Cloud)", linksBandwidth="Links Bandwidth (Mbps)",
linksLatency="Links Latency (ms)")
# Load Data
data=read_csv("logs/data.csv")
# Get label according to varName
getLabel=function(varName){
if(is.na(labels[varName])){
return(varName)
}
return(labels[varName])
}
easyPlot=function(X,Y,KEY){
curData=data%>%filter(simKey==KEY)
stopifnot(NROW(curData)>0)
ggplot(curData,aes_string(x=X,y=Y))+geom_point()+geom_line()+xlab(getLabel(X))+ylab(getLabel(Y))
ggsave(paste0("plots/",KEY,"-",X,"_",Y,".png"))
}
#+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
#+RESULTS:
: Processing logs/logs/log.txt
: Processing logs/logs/log.txt.csv-energy.csv
: Processing logs/logs/log.txt.csv
: Processing logs/logs/log.txt-energy.csv
* Logs Analysis
** Log -> CSV
** Log -> CSV
logToCSV extract usefull data from logs and put them into logs/data.csv.
#+NAME: logToCSV
#+BEGIN_SRC bash :results none
csvOutput="logs/data.csv"
@ -82,27 +242,7 @@
echo $metrics | awk '{for(i=1;i<=NF;i++){split($i,elem,":");printf(elem[2]);if(i<NF)printf(",");else{print("")}}}' >> $csvOutput
done
#+END_SRC
** R Scripts
*** Load Data
#+NAME: loadData
#+BEGIN_SRC R :var genLog=logToCSV()
library("tidyverse")
getLabel=function(varName){
labels=c(nbNodes="Node Number",nbSensors="Sensor Number",totalEnergy="Total Energy (J)")
if(is.na(labels[varName])){
return(varName)
}
return(labels[varName])
}
# Load Data
data=read_csv("logs/data.csv")
ggplot(data,aes(x=nbNodes,y=totalEnergy))+geom_point()+geom_line()+xlab(getLabel("nbNodes"))+ylab(getLabel("totalEnergy"))
ggsave("plot.png")
#+END_SRC