## Usage: launch R, and then: source("script.r") ## save, and chane default options osp <- options("scipen") options(scipen=3) ## load dataset (variable is "ds") load("data.rda") ## extract data for plain algorithms, in real mode #ds.base <- subset(ds, Mode == "R" & grepl("[lt]_plain", Algo)) ## extract data for one experiment #xx <- subset(ds, # Mode == "R" & Distrib == 1 & Ratio == "1:1" & # Platform == "cluster" & Size == 16 & Topo == "line") draw <- function(dset = ds, draw_mode = "R", draw_distrib = 1, draw_ratio = "1:1", draw_platform = "cluster", draw_topo = "hcube") { ## extract desired data dset <- subset(dset, Mode == draw_mode & Distrib == draw_distrib & Ratio == draw_ratio & Platform == draw_platform & Topo == draw_topo) ## reorder lines (first "plain", then "bookkeeping") dset <- rbind(subset(dset, grepl("plain", Algo)), subset(dset, grepl("bookkeeping", Algo))) dset <- dset[order(dset$Size), ] ## finally, add an "Index" attribute(, for further processing dset <- cbind(dset, Index=seq(1, length(dset$Size))) # FIXME #print(dset) ## save the graphical parameters p <- par(no.readonly=TRUE) par(mar=c(13, 4, 4, 4) + 0.1, # change margins mgp=c(11, 1, 0)) par(las=3) # always draw labels vertically ## compute the time range: 0..max+20% time_range <- c(0, range(dset$Conv_max)[2] * 1.2) ## first draw the bars barplot(dset$Conv_max, axes=FALSE, col="red", names=dset$Algo, ylim=time_range) barplot(dset$Conv_avg, axes=FALSE, col="green", add=TRUE) barplot(dset$Idle_avg, axes=FALSE, col="blue", add=TRUE) ## draw the time axis on the left axis(2, labels=TRUE) mtext("Simulated time (s)", side=2, line=2.5) title(xlab="Algorithms") ## compute the data range x_data_range <- c(0.6, length(dset$Algo) + 0.4) data_range <- c(0, range(dset$Data_amnt)[2] * 1.04) ## draw the data amnt line graphs for (alg in unique(dset$Algo)) { print(alg); dset.da <- subset(dset, Algo == alg) ## start a new graph, but drawn on the same device par(new=TRUE) plot(dset.da$Index, dset.da$Data_amnt, axes=FALSE, xlab="", type="b", xlim=x_data_range, yaxs="i", ylim=data_range) } ## draw the data amnt axis on the right axis(4, labels=TRUE) mtext("Data amount (relative)", side=4, line=2.5) ## finally, set title t <- paste0(dset$Mode[1], dset$Distrib[1], " / ", dset$Ratio[1], " / ", dset$Platform[1], " / ", dset$Topo[1]) title(main=t) ## restore the graphical parameters par(p) return(dset) } draw2 <- function(dset = ds, draw_mode = "R", draw_distrib = 1, draw_ratio = "1:1", draw_platform = "cluster", draw_topo = "hcube") { ## extract desired data dset <- subset(dset, Mode == draw_mode & Distrib == draw_distrib & Ratio == draw_ratio & Platform == draw_platform & Topo == draw_topo) ## reorder lines (first "plain", then "bookkeeping") dset <- rbind(subset(dset, grepl("plain", Algo)), subset(dset, grepl("bookkeeping", Algo))) dset <- dset[order(dset$Size), ] ## keep only useful data dset.long <- data.frame(Algo=dset$Algo, Size=dset$Size, Idle_avg=dset$Idle_avg, Conv_avg=dset$Conv_avg, Conv_max=dset$Conv_max) ## reshape data -> wide dset.wide <- reshape(dset.long, direction="wide", idvar="Algo", timevar="Size") ## rename rows rownames(dset.wide) <- sub("bookkeeping", "virtual", dset.wide$Algo) #colnames(dset.wide) <- sub("^[^.]*\\.", "", colnames(dset.wide)) ## remove first column (aka "Algo") dset.mat <- as.matrix(dset.wide[-1]) dset.plot <- dset.mat[, c(FALSE,FALSE,TRUE)] barplot(dset.plot, beside=TRUE, names.arg=sub("^[^.]*\\.", "", colnames(dset.plot)), col=rainbow(nrow(dset.mat), s=.5)) dset.plot <- dset.mat[, c(FALSE,TRUE,FALSE)] barplot(dset.plot, beside=TRUE, axes=FALSE, axisnames=FALSE, add=TRUE, legend.text=TRUE, args.legend=list(x="topleft", inset=c(.02,0), title="Algorithms"), col=rainbow(nrow(dset.mat))) dset.plot <- dset.mat[, c(TRUE,FALSE,FALSE)] barplot(dset.plot, beside=TRUE, axes=FALSE, axisnames=FALSE, add=TRUE, col=rainbow(nrow(dset.mat), v=.5)) ## finally, set titles t <- paste0(dset$Mode[1], dset$Distrib[1], " / ", dset$Ratio[1], " / ", dset$Platform[1], " / ", dset$Topo[1]) title(xlab="Platform size", ylab="Simulated time (s)", main=t) } msg <- function(text, wait = TRUE) { if (wait) readline("Press to continue\n") message(text) } if (FALSE) { msg("First test, with algorithms \"plain\"...", wait = FALSE); draw(subset(ds, grepl("[lt]_plain", Algo)), draw_distrib="N") msg("... with draw2()...") draw2(subset(ds, grepl("[lt]_plain", Algo)), draw_distrib="N") msg("Second test, with algorithms \"bookkeeping\"..."); draw(subset(ds, grepl("[lt]_bookkeeping", Algo)), draw_distrib="N") msg("... with draw2()...") draw2(subset(ds, grepl("[lt]_bookkeeping", Algo)), draw_distrib="N") msg("Third test, with all algorithms..."); draw(draw_distrib="N") msg("... with draw2()...") draw2(draw_distrib="N") } system("mkdir -pv graphs") for (m in c("R", "I")) { for (d in c("1", "N")) { for (r in c("10:1", "1:1", "1:10")) { for (t in c("line", "torus", "hcube")) { for (p in c("grid", "cluster")) { message(sprintf(">>> Drawing: %s%s / %s / %s / %s", m, d, r, p, t)) filename <- sprintf("graphs/%s%s-%s-%s-%s.pdf", m, d, r, p, t) pdf(file=filename) draw2(#subset(ds, grepl("[lt]_plain", Algo)), draw_mode=m, draw_distrib=d, draw_ratio=r, draw_topo=t, draw_platform=p) dev.off() embedFonts(file=filename, options="-dPDFSETTINGS=/prepress") } } } } } ## restore default options options(scipen=osp)