library("mosaic") library("dplyr") library("foreach") library("doParallel") #setup parallel backend to use many processors cores=detectCores() cl <- makeCluster(cores[1]-1) #not to overload your computer registerDoParallel(cl) args = commandArgs(trailingOnly=TRUE) if (length(args)==0) { runtype="timedump_253048_1873f6_all/timedump" target="waters_int" outputpath="~/code/FRET/LibAFL/fuzzers/FRET/benchmark/" #MY_SELECTION <- c('state', 'afl', 'graph', 'random') SAVE_FILE=TRUE } else { runtype=args[1] target=args[2] outputpath=args[3] MY_SELECTION <- args[4:length(args)] SAVE_FILE=TRUE } worst_cases <- list(waters=0, waters_int=0, tmr=405669, micro_longint=0) worst_case <- worst_cases[[target]] if (is.null(worst_case)) { worst_case = 0 } #MY_COLORS=c("green","blue","red", "orange", "pink", "black") MY_COLORS <- c("green", "blue", "red", "magenta", "orange", "cyan", "pink", "gray", "orange", "black", "yellow","brown") BENCHDIR=sprintf("~/code/FRET/LibAFL/fuzzers/FRET/benchmark/%s",runtype) BASENAMES=Filter(function(x) x!="" && substr(x,1,1)!='.',list.dirs(BENCHDIR,full.names=FALSE)) PATTERNS="%s.[0-9]*$" #RIBBON='sd' #RIBBON='span' RIBBON='both' DRAW_WC = worst_case > 0 LEGEND_POS="topright" #LEGEND_POS="bottomright" CONTINUE_LINE_TO_END=FALSE # https://www.r-bloggers.com/2013/04/how-to-change-the-alpha-value-of-colours-in-r/ alpha <- function(col, alpha=1){ if(missing(col)) stop("Please provide a vector of colours.") apply(sapply(col, col2rgb)/255, 2, function(x) rgb(x[1], x[2], x[3], alpha=alpha)) } # Trimm a list of data frames to common length trim_data <- function(input,len=NULL) { if (is.null(len)) { len <- min(sapply(input, function(v) dim(v)[1])) } return(lapply(input, function(d) slice_head(d,n=len))) } length_of_data <- function(input) { min(sapply(input, function(v) dim(v)[1])) } # Takes a flat list trace2maxline <- function(tr) { maxline = tr for (var in seq_len(length(maxline))[2:length(maxline)]) { #if (maxline[var]>1000000000) { # maxline[var]=maxline[var-1] #} else { maxline[var] = max(maxline[var],maxline[var-1]) #} } #plot(seq_len(length(maxline)),maxline,"l",xlab="Index",ylab="WOET") return(maxline) } # Take a list of data frames, output same form but maxlines data2maxlines <- function(tr) { min_length <- min(sapply(tr, function(v) dim(v)[1])) maxline <- tr for (var in seq_len(length(tr))) { maxline[[var]][[1]]=trace2maxline(tr[[var]][[1]]) } return(maxline) } # Take a multi-column data frame, output same form but maxlines frame2maxlines <- function(tr) { for (var in seq_len(length(tr))) { tr[[var]]=trace2maxline(tr[[var]]) } return(tr) } trace2maxpoints <- function(tr) { minval = tr[1,1] collect = tr[1,] for (i in seq_len(dim(tr)[1])) { if (minval < tr[i,1]) { collect = rbind(collect,tr[i,]) minval = tr[i,1] } } tmp = tr[dim(tr)[1],] tmp[1] = minval[1] collect = rbind(collect,tmp) return(collect) } sample_maxpoints <- function(tr,po) { index = 1 collect=NULL endpoint = dim(tr)[1] for (p in po) { if (p<=tr[1,2]) { tmp = tr[index,] tmp[2] = p collect = rbind(collect, tmp) } else if (p>=tr[endpoint,2]) { tmp = tr[endpoint,] tmp[2] = p collect = rbind(collect, tmp) } else { for (i in seq(index,endpoint)-1) { if (p >= tr[i,2] && p 0) { runtypetables_reduced <- foreach(i=seq_len(length(runtypefiles))) %dopar% { rtable = read.csv(runtypefiles[[i]], col.names=c(sprintf("%s%d",bn,i),sprintf("times%d",i))) trace2maxpoints(rtable) } #runtypetables <- lapply(seq_len(length(runtypefiles)), # function(i)read.csv(runtypefiles[[i]], col.names=c(sprintf("%s%d",bn,i),sprintf("times%d",i)))) #runtypetables_reduced <- lapply(runtypetables, trace2maxpoints) runtypetables_reduced #all_runtypetables = c(all_runtypetables, list(runtypetables_reduced)) } } all_runtypetables = all_runtypetables[lapply(all_runtypetables, length) > 0] all_min_points = foreach(rtt=all_runtypetables,.combine = cbind) %do% { bn = substr(names(rtt[[1]])[1],1,nchar(names(rtt[[1]])[1])-1) ret = data.frame(min(unlist(lapply(rtt, function(v) v[dim(v)[1],2])))) names(ret)[1] = bn ret/(3600 * 1000) } all_max_points = foreach(rtt=all_runtypetables,.combine = cbind) %do% { bn = substr(names(rtt[[1]])[1],1,nchar(names(rtt[[1]])[1])-1) ret = data.frame(max(unlist(lapply(rtt, function(v) v[dim(v)[1],2])))) names(ret)[1] = bn ret/(3600 * 1000) } all_points = sort(unique(Reduce(c, lapply(all_runtypetables, function(v) Reduce(c, lapply(v, function(w) w[[2]])))))) all_maxlines <- foreach (rtt=all_runtypetables) %do% { bn = substr(names(rtt[[1]])[1],1,nchar(names(rtt[[1]])[1])-1) runtypetables_sampled = foreach(v=rtt) %dopar% { sample_maxpoints(v, all_points)[1] } #runtypetables_sampled = lapply(rtt, function(v) sample_maxpoints(v, all_points)[1]) tmp_frame <- Reduce(cbind, runtypetables_sampled) statframe <- data.frame(rowMeans(tmp_frame),apply(tmp_frame, 1, sd),apply(tmp_frame, 1, min),apply(tmp_frame, 1, max), apply(tmp_frame, 1, median)) names(statframe) <- c(bn, sprintf("%s_sd",bn), sprintf("%s_min",bn), sprintf("%s_max",bn), sprintf("%s_med",bn)) #statframe[sprintf("%s_times",bn)] = all_points round(statframe) #all_maxlines = c(all_maxlines, list(round(statframe))) } one_frame<-data.frame(all_maxlines) one_frame[length(one_frame)+1] <- all_points/(3600 * 1000) names(one_frame)[length(one_frame)] <- 'time' typenames = names(one_frame)[which(names(one_frame) != 'time')] typenames = typenames[which(!endsWith(typenames, "_sd"))] typenames = typenames[which(!endsWith(typenames, "_med"))] ylow=min(one_frame[typenames]) yhigh=max(one_frame[typenames],worst_case) typenames = typenames[which(!endsWith(typenames, "_min"))] typenames = typenames[which(!endsWith(typenames, "_max"))] ml2lines <- function(ml,lim) { lines = NULL last = 0 for (i in seq_len(dim(ml)[1])) { if (!CONTINUE_LINE_TO_END && lim