<<echo=FALSE>>=
    pct<-function(x, y=NULL, ndigits=0, app='\\\\%'){
        if(length(x)>1) {
            y<-x[2]
            x<-x[1]
        }
        x<-paste(round(x*100, ndigits), app, sep='')
        if(is.null(y)) {
           return(x)
        }
        y<-paste(round(y*100, ndigits), app, sep='')
        return(paste(x, y, sep='--'))
    }

    display_names <- c('ant'='Ant',
                       'jmeter'='JMeter',
                       'jodatime_2.0'='JodaTime',
                       'coverage.related'='Related',
                       'coverage.unrelated'='Unrelated',
                       'coverage.related.cummean'='Related',
                       'coverage.unrelated.cummean'='Unrelated',
                       'coverage.related.mean'='Related (%)',
                       'coverage.unrelated.mean'='Unrelated (%)',
                       'tests.run'='Tests',
                       'tests.total.errors'='Errors & Failures',
                       'coverage.overall'='Coverage (%)',
                       'p.value'='p-value',
                       'BugCountEvaluator'='Prev',
                       'BugLanguageEvaluator'='Rprt',
                       'CorpusEvaluator'='Text',
                       'CoverageEvaluator'='Cov',
                       'StackEvaluator'='Sta',
                       'LinearEvaluator.nocoverage'='Comb',
                       'LinearEvaluator.all'='Comb',
                       'RidgeEvaluator'='Rid',
                       'DecisionTreeEvaluator'='Tree',
                       'RandomForestEvaluator'='For',
                       'SvmEvaluator'='SVM',
                       'NbEvaluator'='NB',
                       'BayesianRidgeEvaluator'='BR',
                       'SimpleEvaluator'='Sim'
                     )

    format_name <- function(x) {
        if(is.factor(x)){
            x <- as.character(x)
        }
        revalue(x, display_names, warn_missing=FALSE)
    }

    format_difference <- function(x) {
        paste(abs(round(x, 1)), '\\\\%', sep='')
    }

    format_breaks <- function(breaks){
        percent<-breaks/rep(breaks[nrow(breaks),], each=nrow(breaks))
        percent<-sapply(percent, pct, app='%')
        ret<-paste(breaks, ' (', percent, ')', sep='')
        ret<-matrix(ret, nrow=nrow(breaks))
        rownames(ret)<-rownames(breaks)
        colnames(ret)<-colnames(breaks)
        ret[nrow(ret),]<-breaks[nrow(breaks),]
        ret
    }

    hits <- function(a) {
        c(sapply(c(1,10,100,1000,Inf), function(x) sum(a$position<=x, na.rm=TRUE)))
    }

    calculate_frm_breaks <- function(pos, evaluator) {
        corpus_frms <- pos
        corpus_frms <- corpus_frms[corpus_frms$latest,]
        corpus_frms <- corpus_frms[corpus_frms$frm,]
        corpus_frms <- corpus_frms[corpus_frms$evaluator==evaluator,]
        corpus_frms$position[is.na(corpus_frms$position)] <- Inf
        corpus_frms <- daply(corpus_frms, .(project), hits)
        corpus_frms <- t(corpus_frms)
        colnames(corpus_frms) <- format_name(colnames(corpus_frms))
        rownames(corpus_frms)<-c('1', '$\\leqslant$10', '$\\leqslant$100', '$\\leqslant$1000', 'Total')
        return(format_breaks(corpus_frms))
    }

    count_top <- function(pos, n) {
        top_n <- pos
        top_n <- top_n[top_n$latest,]
        top_n <- top_n[top_n$frm,]
        top_n$evaluator <- droplevels(top_n$evaluator)
        top_n <- daply(top_n, .(project, evaluator), function(x) sum(x$position<=n, na.rm=TRUE))
        top_n <- t(top_n)
        top_n <- rbind(top_n, daply(pos, .(project), function(x) nlevels(factor(x$bug_id))))
        colnames(top_n) <- format_name(colnames(top_n))
        rownames(top_n) <- format_name(rownames(top_n))
        rownames(top_n)[nrow(top_n)] <- 'No. Bugs'
        top_n <- format_breaks(top_n)
        return(top_n)
    }
@
