library("tidyverse") library("gridExtra") library("patchwork") library("knitr") library(RColorBrewer) r_=function(x){round(x,digits=2)} color=function(){scale_fill_brewer(palette = "Accent")} color2=function(){scale_fill_brewer(palette = "Set2")} nolegend=function(){theme(legend.position="none")} simkeys=unique(read_csv("../results/ccgrid2023.csv")$simkey) nsimkeys=length(simkeys) s_=function(x){if(x<0){return("")}else{return("+")}} simkey_rename=function(key){ if(key=="hint") return("Hints") if(key=="baseline") return("Baseline") if(key=="extended") return("Extended") if(key=="hintandextended") return("Hints+Extended") return(key) } dformat=function(data){ data%>%rowwise()%>%mutate(simkey=simkey_rename(simkey))%>%mutate(wireless=ifelse(wireless=="lora","LoRa","NbIoT")) } build_stats=function(file){ data=read_csv(file) energy60=data%>%filter(wakeupfor==60) energy60Snd=energy60%>%filter(isSender==1)%>%group_by(simkey,wireless)%>%summarise(sd=sd(energy),sd_energy=sd(energy),energy=mean(energy),type="Sender") energy60Rcv=energy60%>%filter(isSender==0)%>%group_by(simkey,wireless)%>%summarise(sd=sd(energy),sd_energy=sd(energy),energy=mean(energy),type="Receiver") energy60=energy60Snd%>%ungroup()%>%rbind(energy60Rcv) energy60=energy60%>%mutate(sd_min=energy-sd,sd_max=energy+sd)%>%mutate(sd_min_txt=paste0("-",r_(sd_min)))%>%mutate(sd_max_txt=paste0("+",r_(sd_max))) energy60Baseline=energy60%>%filter(simkey=="baseline")%>%uncount(nsimkeys,.id="id")%>%mutate(simkey=simkeys[id]) energy60=energy60%>%left_join(energy60Baseline,by=c("simkey","wireless","type"),suffix = c("","_baseline")) energy60=energy60%>%mutate(ovhd=energy*100/energy_baseline-100) energy60=energy60%>%rowwise()%>%mutate(ovhd_txt=paste0("(",s_(ovhd),r_(ovhd),"%)")) success60Snd=data%>%filter(wakeupfor==60)%>%filter(isSender!=0)%>%group_by(simkey,wireless,wakeupfor)%>%summarise(success_orig=mean(nSend),success=mean(nSend),type="Sender") success60Rcv=data%>%filter(wakeupfor==60)%>%filter(isSender!=0)%>%group_by(simkey,wireless,wakeupfor)%>%summarise(success_orig=mean(nSend),success=mean(nSend),type="Receiver") success60=rbind(success60Snd,success60Rcv) success60=success60%>%rowwise()%>%mutate(success_txt=paste0("[",success,"]")) energy60=energy60%>%left_join(success60)%>%rowwise()%>%mutate(infos_txt=paste0(ovhd_txt,"\n{",r_(energy/success_orig),"}"),infos=energy/success_orig) energy60=energy60%>%mutate(type=factor(type,levels = c("Sender","Receiver")),wakeupfor=60) energy180=data%>%filter(wakeupfor==180) energy180Snd=energy180%>%filter(isSender==1)%>%group_by(simkey,wireless)%>%summarise(sd=sd(energy),sd_energy=sd(energy),energy=mean(energy),type="Sender") energy180Rcv=energy180%>%filter(isSender==0)%>%group_by(simkey,wireless)%>%summarise(sd=sd(energy),sd_energy=sd(energy),energy=mean(energy),type="Receiver") energy180=energy180Snd%>%ungroup()%>%rbind(energy180Rcv)%>%mutate(type=factor(type,levels = c("Sender","Receiver"))) energy180=energy180%>%mutate(sd_min=energy-sd,sd_max=energy+sd)%>%mutate(sd_min_txt=paste0("-",r_(sd_min)))%>%mutate(sd_max_txt=paste0("+",r_(sd_max))) energy180Baseline=energy180%>%filter(simkey=="baseline")%>%uncount(nsimkeys,.id="id")%>%mutate(simkey=simkeys[id]) energy180=energy180%>%left_join(energy180Baseline,by=c("simkey","wireless","type"),suffix = c("","_baseline")) energy180=energy180%>%mutate(ovhd=energy*100/energy_baseline-100) energy180=energy180%>%rowwise()%>%mutate(ovhd_txt=paste0("(",s_(ovhd),r_(ovhd),"%)")) success180Snd=data%>%filter(wakeupfor==180)%>%filter(isSender!=0)%>%group_by(simkey,wireless,wakeupfor)%>%summarise(success_orig=mean(nSend),success=mean(nSend),type="Sender") success180Rcv=data%>%filter(wakeupfor==180)%>%filter(isSender!=0)%>%group_by(simkey,wireless,wakeupfor)%>%summarise(success_orig=mean(nSend),success=mean(nSend),type="Receiver") success180=rbind(success180Snd,success180Rcv) success180=success180%>%rowwise()%>%mutate(success_txt=paste0("[",success,"]")) energy180=energy180%>%left_join(success180)%>%rowwise()%>%mutate(infos_txt=paste0(ovhd_txt,"\n{",r_(energy/success_orig),"}"),infos=energy/success_orig) energy180=energy180%>%mutate(type=factor(type,levels = c("Sender","Receiver")),wakeupfor=180) totalUptime60=data%>%filter(wakeupfor==60) totalUptime60Snd=totalUptime60%>%filter(isSender==1)%>%group_by(simkey,wireless)%>%summarise(sd=sd(totalUptime),totalUptime=mean(totalUptime),type="Sender") totalUptime60Rcv=totalUptime60%>%filter(isSender==0)%>%group_by(simkey,wireless)%>%summarise(sd=sd(totalUptime),totalUptime=mean(totalUptime),type="Receiver") totalUptime60=totalUptime60Snd%>%ungroup()%>%rbind(totalUptime60Rcv)%>%mutate(type=factor(type,levels = c("Sender","Receiver"))) totalUptime60=totalUptime60%>%mutate(sd_min=totalUptime-sd,sd_max=totalUptime+sd)%>%mutate(sd_min_txt=paste0("-",r_(sd_min)))%>%mutate(sd_max_txt=paste0("+",r_(sd_max))) totalUptime60Baseline=totalUptime60%>%filter(simkey=="baseline")%>%uncount(nsimkeys,.id="id")%>%mutate(simkey=simkeys[id]) totalUptime60=totalUptime60%>%left_join(totalUptime60Baseline,by=c("simkey","wireless","type"),suffix = c("","_baseline")) totalUptime60=totalUptime60%>%mutate(ovhd=totalUptime-totalUptime_baseline) totalUptime60=totalUptime60%>%rowwise()%>%mutate(ovhd_txt=paste0("(",s_(ovhd),r_(ovhd),")")) totalUptime60=totalUptime60%>%mutate(type=factor(type,levels = c("Sender","Receiver")),,wakeupfor=60) totalUptime180=data%>%filter(wakeupfor==180) totalUptime180Snd=totalUptime180%>%filter(isSender==1)%>%group_by(simkey,wireless)%>%summarise(sd=sd(totalUptime),totalUptime=mean(totalUptime),type="Sender") totalUptime180Rcv=totalUptime180%>%filter(isSender==0)%>%group_by(simkey,wireless)%>%summarise(sd=sd(totalUptime),totalUptime=mean(totalUptime),type="Receiver") totalUptime180=totalUptime180Snd%>%ungroup()%>%rbind(totalUptime180Rcv)%>%mutate(type=factor(type,levels = c("Sender","Receiver"))) totalUptime180=totalUptime180%>%mutate(sd_min=totalUptime-sd,sd_max=totalUptime+sd)%>%mutate(sd_min_txt=paste0("-",r_(sd_min)))%>%mutate(sd_max_txt=paste0("+",r_(sd_max))) totalUptime180Baseline=totalUptime180%>%filter(simkey=="baseline")%>%uncount(nsimkeys,.id="id")%>%mutate(simkey=simkeys[id]) totalUptime180=totalUptime180%>%left_join(totalUptime180Baseline,by=c("simkey","wireless","type"),suffix = c("","_baseline")) totalUptime180=totalUptime180%>%mutate(ovhd=totalUptime-totalUptime_baseline) totalUptime180=totalUptime180%>%rowwise()%>%mutate(ovhd_txt=paste0("(",s_(ovhd),r_(ovhd),")")) totalUptime180=totalUptime180%>%mutate(type=factor(type,levels = c("Sender","Receiver")),wakeupfor=180) totalUptime=rbind(totalUptime60,totalUptime180) energy=rbind(energy60,energy180) totalUptime%>%left_join(energy,by=c("simkey","wireless","wakeupfor","type"),suffix = c("","")) } build_table=function(strategy_csv){ # Load stats stats=build_stats(paste0("../results/",strategy_csv,".csv")) stats_prev=build_stats("../results/ccgrid2023.csv") stats=stats%>%left_join(stats_prev,by=c("simkey","wireless","wakeupfor","type"),suffix=c("","_prev")) # Additional computations stats=stats%>%mutate(energy_diff=energy-energy_prev) stats=stats%>%mutate(success_diff=success-success_prev) stats=stats%>%mutate(ovhd_diff=ovhd-ovhd_prev) stats=stats%>%mutate(infos_diff=infos-infos_prev) # Final results stats=stats%>%select(simkey,wireless,wakeupfor,type,energy,energy_diff,success_diff,ovhd_diff,infos_diff,ovhd,infos,success) tf=paste0("figures/table_",strategy_csv,".org") fw=function(str){write(str,file=tf,append = TRUE)} df=function(d,rcolor=FALSE){ if(is.na(d)||is.infinite(d)){ return("") } else if(d<0){ c="green!60" if(rcolor){c="red!60"} return(paste0(r"(~{\color{)",c,r"(}\textbf{)",r_(d),"}}")) } else if (d>0){ c="red!60" if(rcolor){c="green!60"} return(paste0(r"(~{\color{)",c,r"(}\textbf{+)",r_(d),"}}")) } r"(~{\color{blue!60}\textbf{=}})" } mbox=function(v,d,alpha){ if(is.infinite(v)) v="--" paste0(r"(\makebox[)",alpha,r"(cm]{\hfill )",v,r"(})",d) } write_table=function(techno){ stats%>%filter(wireless==techno)%>%group_by(wakeupfor)%>%group_walk(function(d1,g1){ uptime=as.numeric(g1) first=TRUE d1%>%group_by(simkey)%>%group_walk(function(d2,g2){ scenario=as.character(g2) senders=d2%>%filter(type=="Sender") receivers=d2%>%filter(type=="Receiver") #### Stats sender_energy=r_(as.numeric(senders%>%select(energy))) receiver_energy=r_(as.numeric(receivers%>%select(energy))) sender_ovhd=r_(as.numeric(senders%>%select(ovhd))) if(sender_ovhd>0) sender_ovhd=paste0("+",sender_ovhd) receiver_ovhd=r_(as.numeric(receivers%>%select(ovhd))) if(receiver_ovhd>0) receiver_ovhd=paste0("+",receiver_ovhd) sender_eff=r_(as.numeric(senders%>%select(infos))) receiver_eff=r_(as.numeric(receivers%>%select(infos))) succ=r_(as.numeric(senders%>%select(success))) #### Diff sender_energy_diff=df(r_(as.numeric(senders%>%select(energy_diff)))) receiver_energy_diff=df(r_(as.numeric(receivers%>%select(energy_diff)))) sender_ovhd_diff=df(r_(as.numeric(senders%>%select(ovhd_diff)))) receiver_ovhd_diff=df(r_(as.numeric(receivers%>%select(ovhd_diff)))) sender_eff_diff=df(r_(as.numeric(senders%>%select(infos_diff)))) receiver_eff_diff=df(r_(as.numeric(receivers%>%select(infos_diff)))) succ_diff=df(r_(as.numeric(senders%>%select(success_diff))),rcolor = TRUE) tw=paste0("&",scenario,"&", mbox(succ,succ_diff,0.5),"&", mbox(sender_energy,sender_energy_diff,0.8),"&", mbox(receiver_energy,receiver_energy_diff,0.8),"&", mbox(sender_ovhd,sender_ovhd_diff,0.7),"&", mbox(receiver_ovhd,receiver_ovhd_diff,0.7),"&", mbox(sender_eff,sender_eff_diff,0.65),"&", mbox(receiver_eff,receiver_eff_diff,0.65)) if(first) tw=paste0(r"(\multirow{4}{*}{)",uptime,"}",tw) fw(paste0(tw,r"(\\)")) first<<-FALSE }) if(uptime==60) fw(r"(\midrule)") }) } header=paste0(r"(\begin{table*} \centering \caption{)","Simulation results using the ",strategy_csv,r"( strategy. Comparison between our previous results\cite{prev} are in color. Green indicates improvements, red shows regressions and blue indicates no change.)",r"(} \begin{tabular}{crlllllll} \toprule \multirow{2}{*}{Uptime} & \multirow{2}{*}{Scenario} & \multirow{2}{*}{$\# Succ_p$} & \multicolumn{2}{c}{Energy Consumption (J)} & \multicolumn{2}{c}{$eOvhd(p)$ (\%)} & \multicolumn{2}{c}{$eff(p)$ (J)}\\ \cmidrule(lr){4-5}\cmidrule(lr){6-7}\cmidrule(lr){8-9} &&&Sender & Receiver&Sender & Receiver&Sender & Receiver\\ \midrule)") footer=r"(\bottomrule \end{tabular} \end{table*})" write("",file=tf) fw(header) fw(r"(\multicolumn{9}{c}{LoRa}\\)") fw(r"(\midrule)") write_table("lora") fw(r"(\midrule)") fw(r"(\multicolumn{9}{c}{NbIoT}\\)") fw(r"(\midrule)") write_table("nbiot") fw(footer) } build_table("strategy_sor") build_table("strategy_uor") build_table("strategy_farhint") build_table("strategy_combined") ## Print energy sd infos stats_sor=build_stats("../results/strategy_sor.csv") stats_uor=build_stats("../results/strategy_uor.csv") stats_farhint=build_stats("../results/strategy_farhint.csv") stats_combined=build_stats("../results/strategy_combined.csv") message(paste0("Energy std SOR: min=", round(min(stats_sor$sd_energy)), " max=",round(max(stats_sor$sd_energy)), " median=",round(median(stats_sor$sd_energy)))) message(paste0("Energy std UOR: min=", round(min(stats_uor$sd_energy)), " max=",round(max(stats_uor$sd_energy)), " median=",round(median(stats_uor$sd_energy)))) message(paste0("Energy std FARHINT: min=", round(min(stats_farhint$sd_energy)), " max=",round(max(stats_farhint$sd_energy)), " median=",round(median(stats_farhint$sd_energy)))) message(paste0("Energy std combined: min=", round(min(stats_combined$sd_energy)), " max=",round(max(stats_combined$sd_energy)), " median=",round(median(stats_combined$sd_energy))))