install.packages("BiocManager")
Error in install.packages : Updating loaded packages
BiocManager::install("Biobase")
'getOption("repos")' replaces Bioconductor standard repositories, see
'help("repositories", package = "BiocManager")' for details.
Replacement repositories:
    CRAN: https://cran.rstudio.com/
Bioconductor version 3.16 (BiocManager 1.30.20), R 4.2.2 (2022-10-31)
Warning: package(s) not installed when version(s) same as or greater than current; use
  `force = TRUE` to re-install: 'Biobase'
BiocManager::install("ALL")
'getOption("repos")' replaces Bioconductor standard repositories, see
'help("repositories", package = "BiocManager")' for details.
Replacement repositories:
    CRAN: https://cran.rstudio.com/
Bioconductor version 3.16 (BiocManager 1.30.20), R 4.2.2 (2022-10-31)
Installing package(s) 'ALL'
Warning: downloaded length 0 != reported length 6873Warning: cannot open URL 'https://bioconductor.org/packages/3.16/data/annotation/bin/macosx/big-sur-arm64/contrib/4.2/PACKAGES.rds': HTTP status was '404 Not Found'Warning: downloaded length 0 != reported length 6873Warning: cannot open URL 'https://bioconductor.org/packages/3.16/data/annotation/bin/macosx/big-sur-arm64/contrib/4.2/PACKAGES.gz': HTTP status was '404 Not Found'Warning: downloaded length 0 != reported length 6873Warning: cannot open URL 'https://bioconductor.org/packages/3.16/data/experiment/bin/macosx/big-sur-arm64/contrib/4.2/PACKAGES.rds': HTTP status was '404 Not Found'Warning: downloaded length 0 != reported length 6873Warning: cannot open URL 'https://bioconductor.org/packages/3.16/data/experiment/bin/macosx/big-sur-arm64/contrib/4.2/PACKAGES.gz': HTTP status was '404 Not Found'Warning: downloaded length 0 != reported length 6873Warning: cannot open URL 'https://bioconductor.org/packages/3.16/workflows/bin/macosx/big-sur-arm64/contrib/4.2/PACKAGES.rds': HTTP status was '404 Not Found'Warning: downloaded length 0 != reported length 6873Warning: cannot open URL 'https://bioconductor.org/packages/3.16/workflows/bin/macosx/big-sur-arm64/contrib/4.2/PACKAGES.gz': HTTP status was '404 Not Found'Warning: downloaded length 0 != reported length 6873Warning: cannot open URL 'https://bioconductor.org/packages/3.16/books/bin/macosx/big-sur-arm64/contrib/4.2/PACKAGES.rds': HTTP status was '404 Not Found'Warning: downloaded length 0 != reported length 6873Warning: cannot open URL 'https://bioconductor.org/packages/3.16/books/bin/macosx/big-sur-arm64/contrib/4.2/PACKAGES.gz': HTTP status was '404 Not Found'installing the source package ‘ALL’

trying URL 'https://bioconductor.org/packages/3.16/data/experiment/src/contrib/ALL_1.40.0.tar.gz'
Content type 'application/x-gzip' length 11383132 bytes (10.9 MB)
==================================================
downloaded 10.9 MB

* installing *source* package ‘ALL’ ...
** using staged installation
** R
** data
** inst
** byte-compile and prepare package for lazy loading
** help
*** installing help indices
** building package indices
** installing vignettes
** testing if installed package can be loaded from temporary location
** testing if installed package can be loaded from final location
** testing if installed package keeps a record of temporary installation path
* DONE (ALL)

The downloaded source packages are in
    ‘/private/var/folders/v3/vq_nw_j931j4mvyt1xqc2dr80000gn/T/Rtmp3RlWFu/downloaded_packages’
library(Biobase)
library(ALL)
data(ALL)
ALL
ExpressionSet (storageMode: lockedEnvironment)
assayData: 12625 features, 128 samples 
  element names: exprs 
protocolData: none
phenoData
  sampleNames: 01005 01010 ... LAL4 (128 total)
  varLabels: cod diagnosis ... date last seen (21 total)
  varMetadata: labelDescription
featureData: none
experimentData: use 'experimentData(object)'
  pubMedIds: 14684422 16243790 
Annotation: hgu95av2 

pD <- phenoData(ALL)
varMetadata(pD)
table(ALL$BT)

 B B1 B2 B3 B4  T T1 T2 T3 T4 
 5 19 36 23 12  5  1 15 10  2 
table(ALL$mol.biol)

ALL1/AF4  BCR/ABL E2A/PBX1      NEG   NUP-98  p15/p16 
      10       37        5       74        1        1 
table(ALL$BT, ALL$mol.bio)
    
     ALL1/AF4 BCR/ABL E2A/PBX1 NEG NUP-98 p15/p16
  B         0       2        1   2      0       0
  B1       10       1        0   8      0       0
  B2        0      19        0  16      0       1
  B3        0       8        1  14      0       0
  B4        0       7        3   2      0       0
  T         0       0        0   5      0       0
  T1        0       0        0   1      0       0
  T2        0       0        0  15      0       0
  T3        0       0        0   9      1       0
  T4        0       0        0   2      0       0
featureNames(ALL)[1:10]
 [1] "1000_at"   "1001_at"   "1002_f_at" "1003_s_at" "1004_at"  
 [6] "1005_at"   "1006_at"   "1007_s_at" "1008_f_at" "1009_at"  
sampleNames(ALL)[1:5]
[1] "01005" "01010" "03002" "04006" "04007"
tgt.cases <- which(ALL$BT %in% levels(ALL$BT)[1:5] & 
                   ALL$mol.bio %in% levels(ALL$mol.bio)[1:4])
ALLb <- ALL[,tgt.cases]
ALLb
ExpressionSet (storageMode: lockedEnvironment)
assayData: 12625 features, 94 samples 
  element names: exprs 
protocolData: none
phenoData
  sampleNames: 01005 01010 ... LAL5 (94 total)
  varLabels: cod diagnosis ... date last seen (21 total)
  varMetadata: labelDescription
featureData: none
experimentData: use 'experimentData(object)'
  pubMedIds: 14684422 16243790 
Annotation: hgu95av2 
ALLb$BT <- factor(ALLb$BT)
ALLb$mol.bio <- factor(ALLb$mol.bio)

save(ALLb, file = "myALL.Rdata")
es <- exprs(ALLb)
dim(es)
[1] 12625    94
summary(as.vector(es))
   Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
  1.985   4.122   5.469   5.624   6.829  14.045 
BiocManager::install("genefilter")
'getOption("repos")' replaces Bioconductor standard repositories, see
'help("repositories", package = "BiocManager")' for details.
Replacement repositories:
    CRAN: https://cran.rstudio.com/
Bioconductor version 3.16 (BiocManager 1.30.20), R 4.2.2 (2022-10-31)
Warning: package(s) not installed when version(s) same as or greater than
  current; use `force = TRUE` to re-install: 'genefilter'
#source("http://bioconductor.org/biocLite.R")
library(genefilter)
library(genefilter)
library(ggplot2)
exprVs <- data.frame(exprVal=as.vector(es))
ds <- data.frame(Stat=c("1stQ","Median","3rdQ","Shorth"),
                 Value=c(quantile(exprVs$exprVal, 
                         probs=c(0.25, 0.5, 0.75)),
                         shorth(exprVs$exprVal)),
                 Color=c("red","green","red","yellow"))
ggplot(exprVs,aes(x=exprVal)) + geom_histogram(fill="lightgrey") + 
    geom_vline(data=ds,aes(xintercept=Value,color=Color)) + 
    geom_text(data=ds,aes(x=Value-0.2,y=0,label=Stat,colour=Color),
              angle=90,hjust="left") +
    xlab("Expression Levels") + guides(colour="none", fill="none") 

library(genefilter)
library(ggplot2)
exprVs <- data.frame(exprVal=as.vector(es))
ds <- data.frame(Stat=c("1stQ","Median","3rdQ","Shorth"),
                 Value=c(quantile(exprVs$exprVal, probs=c(0.25, 0.5, 0.75)),
                     shorth(exprVs$exprVal)),
                 Color=c("red","green","red","yellow"))
ggplot(exprVs,aes(x=exprVal)) + geom_histogram(fill="lightgrey") + 
    geom_vline(data=ds,aes(xintercept=Value,color=Color)) + 
    geom_text(data=ds,aes(x=Value-0.2,y=0,label=Stat,colour=Color),angle=90,hjust="left") +
    xlab("Expression Levels") + guides(colour="none", fill="none")    

sapply(levels(ALLb$mol.bio), 
       function(x) summary(as.vector(es[, which(ALLb$mol.bio == x)])))
         ALL1/AF4   BCR/ABL  E2A/PBX1       NEG
Min.     2.266403  2.194858  2.267802  1.984919
1st Qu.  4.140797  4.124414  4.152339  4.111435
Median   5.454388  5.467834  5.496825  5.469887
Mean     5.620976  5.627016  5.630445  5.621616
3rd Qu.  6.805440  6.832862  6.818587  6.832056
Max.    14.031235 14.044896 13.812578 13.949564
library(hgu95av2.db)
Loading required package: AnnotationDbi
Loading required package: stats4
Loading required package: IRanges
Loading required package: S4Vectors

Attaching package: ‘S4Vectors’

The following object is masked from ‘package:xts’:

    first

The following objects are masked from ‘package:dplyr’:

    first, rename

The following objects are masked from ‘package:base’:

    expand.grid, I, unname


Attaching package: ‘IRanges’

The following object is masked from ‘package:sp’:

    %over%

The following objects are masked from ‘package:dplyr’:

    collapse, desc, slice


Attaching package: ‘AnnotationDbi’

The following object is masked from ‘package:dplyr’:

    select

Loading required package: org.Hs.eg.db
rowIQRs <- function(em) 
    rowQ(em,ceiling(0.75*ncol(em))) - rowQ(em,floor(0.25*ncol(em)))
library(ggplot2)
dg <- data.frame(rowMed=rowMedians(es), rowIQR=rowIQRs(es))
ggplot(dg,aes(x=rowMed, y=rowIQR)) + geom_point() +
    xlab("Median expression level") + ylab("IQR expression level") +
    ggtitle("Main Characteristics of Genes Expression Levels")

rowIQRs <- function(em) rowQ(em,ceiling(0.75*ncol(em))) - rowQ(em,floor(0.25*ncol(em)))
library(ggplot2)
dg <- data.frame(rowMed=rowMedians(es), rowIQR=rowIQRs(es))
ggplot(dg,aes(x=rowMed, y=rowIQR)) + geom_point() +
    xlab("Median expression level") + ylab("IQR expression level") +
    ggtitle("Main Characteristics of Genes Expression Levels")

library(genefilter)
resFilter <- nsFilter(ALLb,
                 var.func=IQR,
                 var.cutoff=IQR(as.vector(es))/5, 
                 feature.exclude="^AFFX")
resFilter
$eset
ExpressionSet (storageMode: lockedEnvironment)
assayData: 4025 features, 94 samples 
  element names: exprs 
protocolData: none
phenoData
  sampleNames: 01005 01010 ... LAL5 (94 total)
  varLabels: cod diagnosis ... mol.bio (22 total)
  varMetadata: labelDescription
featureData: none
experimentData: use 'experimentData(object)'
  pubMedIds: 14684422 16243790 
Annotation: hgu95av2 

$filter.log
$filter.log$numDupsRemoved
[1] 2888

$filter.log$numLowVar
[1] 4751

$filter.log$numRemoved.ENTREZID
[1] 942

$filter.log$feature.exclude
[1] 19
ALLb <- resFilter$eset
es <- exprs(ALLb)
dim(es)
[1] 4025   94
f <- Anova(ALLb$mol.bio, p = 0.01)
ff <- filterfun(f)
selGenes <- genefilter(exprs(ALLb), ff)
sum(selGenes)
[1] 751
ALLb <- ALLb[selGenes, ]
ALLb
ExpressionSet (storageMode: lockedEnvironment)
assayData: 751 features, 94 samples 
  element names: exprs 
protocolData: none
phenoData
  sampleNames: 01005 01010 ... LAL5 (94 total)
  varLabels: cod diagnosis ... mol.bio (22 total)
  varMetadata: labelDescription
featureData: none
experimentData: use 'experimentData(object)'
  pubMedIds: 14684422 16243790 
Annotation: hgu95av2 
es <- exprs(ALLb)
dim(es)
[1] 751  94
dg <- data.frame(rowMed=rowMedians(es), rowIQR=rowIQRs(es))
ggplot(dg,aes(x=rowMed, y=rowIQR)) + geom_point() +
    xlab("Median expression level") + ylab("IQR expression level") +
    ggtitle("Distribution Properties of the Selected Genes")

library(randomForest)
dt <- data.frame(t(es), Mut = ALLb$mol.bio)
dt$Mut <- droplevels(dt$Mut)
set.seed(1234)
rf <- randomForest(Mut ~ ., dt, importance = TRUE)
imp <- importance(rf)
rf.genes <- rownames(imp)[order(imp[,"MeanDecreaseAccuracy"], 
                                decreasing = TRUE)[1:30]]
library(tidyr)

Attaching package: ‘tidyr’

The following object is masked from ‘package:S4Vectors’:

    expand
library(dplyr)
d <- gather(dt[,c(rf.genes,"Mut")],Gene,ExprValue,1:length(rf.genes))
dat <- group_by(d,Mut,Gene) %>% 
    summarise(med=median(ExprValue), iqr=IQR(ExprValue))
`summarise()` has grouped output by 'Mut'. You can override using the `.groups` argument.
ggplot(dat, aes(x=med,y=iqr,color=Mut)) +  
    geom_point(size=6) + facet_wrap(~ Gene) + 
    labs(x="MEDIAN expression level",y="IQR expression level",color="Mutation")

install.packages('Hmisc')
also installing the dependency ‘htmlTable’

trying URL 'https://cran.rstudio.com/bin/macosx/big-sur-arm64/contrib/4.2/htmlTable_2.4.1.tgz'
Content type 'application/x-gzip' length 419727 bytes (409 KB)
==================================================
downloaded 409 KB

trying URL 'https://cran.rstudio.com/bin/macosx/big-sur-arm64/contrib/4.2/Hmisc_5.0-1.tgz'
Content type 'application/x-gzip' length 3434580 bytes (3.3 MB)
==================================================
downloaded 3.3 MB

The downloaded binary packages are in
    /var/folders/v3/vq_nw_j931j4mvyt1xqc2dr80000gn/T//Rtmp3RlWFu/downloaded_packages
library(Hmisc)
Registered S3 method overwritten by 'htmlwidgets':
  method           from         
  print.htmlwidget tools:rstudio

Attaching package: ‘Hmisc’

The following object is masked from ‘package:AnnotationDbi’:

    contents

The following object is masked from ‘package:Biobase’:

    contents

The following objects are masked from ‘package:TeachingDemos’:

    cnvrt.coords, subplot

The following object is masked from ‘package:e1071’:

    impute

The following object is masked from ‘package:quantmod’:

    Lag

The following objects are masked from ‘package:dplyr’:

    src, summarize

The following objects are masked from ‘package:base’:

    format.pval, units
vc <- varclus(t(es))
clus30 <- cutree(vc$hclust, 30)
table(clus30)
clus30
 1  2  3  4  5  6  7  8  9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 
21 16 37 18 44 19 28 38 28 30 35 54 20 47 18 45 17 14 25 18 22 31 28 
24 25 26 27 28 29 30 
15  7 15 11 18 19 13 
getVarsSet <- function(cluster,nvars=30,seed=NULL,verb=FALSE) {
    if (!is.null(seed)) set.seed(seed)
    
    cls <- cutree(cluster,nvars)
    tots <- table(cls)
    vars <- c()
    vars <- sapply(1:nvars,function(clID)
    {
        if (!length(tots[clID])) stop('Empty cluster! (',clID,')')
        x <- sample(1:tots[clID],1)
        names(cls[cls==clID])[x]
    })
    if (verb)  structure(vars,clusMemb=cls,clusTots=tots)
    else       vars
}
getVarsSet(vc$hclust)
 [1] "37579_at"   "33371_s_at" "34362_at"   "36008_at"   "39224_at"  
 [6] "1207_at"    "36403_s_at" "41123_s_at" "2036_s_at"  "37842_at"  
[11] "36188_at"   "106_at"     "41853_at"   "41715_at"   "41126_at"  
[16] "763_at"     "39049_at"   "1389_at"    "37015_at"   "41872_at"  
[21] "32607_at"   "2062_at"    "37304_at"   "33266_at"   "32612_at"  
[26] "905_at"     "37027_at"   "38081_at"   "39649_at"   "33777_at"  
getVarsSet(vc$hclust)
 [1] "41139_at"   "32585_at"   "31508_at"   "39410_at"   "36089_at"  
 [6] "33796_at"   "32169_at"   "36577_at"   "32725_at"   "38352_at"  
[11] "41606_at"   "40480_s_at" "38651_at"   "37039_at"   "37251_s_at"
[16] "40419_at"   "38014_at"   "317_at"     "33339_g_at" "33305_at"  
[21] "36203_at"   "37680_at"   "41146_at"   "33429_at"   "37485_at"  
[26] "40369_f_at" "36142_at"   "38078_at"   "40425_at"   "40454_at"  
library(performanceEstimation)
library(DMwR2)
data(iris)
exp <- performanceEstimation(
    PredTask(Species ~ ., iris), 
    Workflow(learner="rpartXse", predictor.pars=list(type="class")),
    EstimationTask(metrics="acc",method=Bootstrap(nReps=100)))


##### PERFORMANCE ESTIMATION USING  BOOTSTRAP  #####

** PREDICTIVE TASK :: iris.Species

++ MODEL/WORKFLOW :: rpartXse 
Task for estimating  acc  using
100  repetitions of  e0  Bootstrap experiment
     Run with seed =  1234 
Iteration :  1  2  3  4  5  6  7  8  9  10  11  12  13  14  15  16  17  18  19  20  21  22  23  24  25  26  27  28  29  30  31  32  33  34  35  36  37  38  39  40  41  42  43  44  45  46  47  48  49  50  51  52  53  54  55  56  57  58  59  60  61  62  63  64  65  66  67  68  69  70  71  72  73  74  75  76  77  78  79  80  81  82  83  84  85  86  87  88  89  90  91  92  93  94  95  96  97  98  99  100
summary(exp)

== Summary of a  Bootstrap Performance Estimation Experiment ==

Task for estimating  acc  using
100  repetitions of  e0  Bootstrap experiment
     Run with seed =  1234 

* Predictive Tasks ::  iris.Species
* Workflows  ::  rpartXse 

-> Task:  iris.Species
  *Workflow: rpartXse 
               acc
avg     0.94183656
std     0.02784701
med     0.94392034
iqr     0.03637634
min     0.86666667
max     1.00000000
invalid 0.00000000
#install.packages('class')
library(class)
data(iris)
idx <- sample(1:nrow(iris), as.integer(0.7 * nrow(iris)))
tr <- iris[idx, ]
ts <- iris[-idx, ]
preds <- knn(tr[, -5], ts[, -5], tr[, 5], k = 3)
table(preds, ts[, 5])
            
preds        setosa versicolor virginica
  setosa         15          0         0
  versicolor      0         10         3
  virginica       0          1        16
kNN <- function(form, train, test, stand = TRUE, stand.stats = NULL, ...) {
    require(class, quietly = TRUE)
    tgtCol <- which(colnames(train) == as.character(form[[2]]))
    if (stand) {
        if (is.null(stand.stats)) 
            tmp <- scale(train[, -tgtCol], center = TRUE, scale = TRUE)
        else tmp <- scale(train[, -tgtCol], center = stand.stats[[1]], 
                          scale = stand.stats[[2]])
        train[, -tgtCol] <- tmp
        ms <- attr(tmp, "scaled:center")
        ss <- attr(tmp, "scaled:scale")
        test[, -tgtCol] <- scale(test[, -tgtCol], center = ms, scale = ss)
    }
    knn(train[, -tgtCol], test[, -tgtCol], train[, tgtCol], ...)
}
preds.stand <- kNN(Species ~ ., tr, ts, k = 3)
table(preds.stand,ts[, 5])
            
preds.stand  setosa versicolor virginica
  setosa         15          0         0
  versicolor      0         10         5
  virginica       0          1        14
preds.notStand <- kNN(Species ~ ., tr, ts, stand = FALSE, k = 3)
table(preds.notStand, ts[, 5]) 
              
preds.notStand setosa versicolor virginica
    setosa         15          0         0
    versicolor      0         10         3
    virginica       0          1        16
varsEnsemble <- function(tgt,train,test,
                         fs.meth,
                         baseLearner,blPars,
                         predictor,predPars,
                         verb=FALSE)
{
    require(Hmisc,quietly=TRUE)
    v <- varclus(as.matrix(train[,-which(colnames(train)==tgt)]))
    varsSets <- lapply(1:fs.meth[[3]],function(x)
        getVarsSet(v$hclust,nvars=fs.meth[[2]]))
    
    preds <- matrix(NA,ncol=length(varsSets),nrow=NROW(test))
    for(v in seq(along=varsSets)) {
        if (baseLearner=='knn')
            preds[,v] <- do.call("kNN",
                                 c(list(as.formula(paste(tgt,
                                                 paste(varsSets[[v]],
                                                       collapse='+'),
                                                 sep='~')),
                                        train[,c(tgt,varsSets[[v]])],
                                        test[,c(tgt,varsSets[[v]])]),
                                   blPars)
                                 )
        else {
            m <- do.call(baseLearner,
                         c(list(as.formula(paste(tgt,
                                                 paste(varsSets[[v]],
                                                       collapse='+'),
                                                 sep='~')),
                                train[,c(tgt,varsSets[[v]])]),
                           blPars)
                         )
            preds[,v] <- do.call(predictor,
                                 c(list(m,test[,c(tgt,varsSets[[v]])]),
                                   predPars))
        }
    }

    ps <- apply(preds,1,function(x)
        levels(factor(x))[which.max(table(factor(x)))])
    factor(ps,
           levels=1:nlevels(train[,tgt]),
           labels=levels(train[,tgt]))
}
ALLb.wf <- function(form, train, test,
                    learner, learner.pars=NULL,
                    predictor="predict",predictor.pars=NULL,
                    featSel.meth = "s2", 
                    available.fsMethods=list(s1=list("all"),s2=list('rf',30),
                                             s3=list('varclus',30,50)),
                    .model=FALSE,
                    ...)
{
    ## The characteristics of the selected feature selection method
    fs.meth <- available.fsMethods[[featSel.meth]] 
    
    ## The target variable
    tgt <- as.character(form[[2]])
    tgtCol <- which(colnames(train)==tgt)

    ## Anova filtering  
    f <- Anova(train[,tgt],p=0.01)
    ff <- filterfun(f)
    genes <- genefilter(t(train[,-tgtCol]),ff)
    genes <- names(genes)[genes]
    train <- train[,c(tgt,genes)]
    test <- test[,c(tgt,genes)]
    tgtCol <- 1

    ## Specific filtering 
    if (fs.meth[[1]]=='varclus') {
      pred <- varsEnsemble(tgt,train,test,fs.meth,
                            learner,learner.pars,
                            predictor,predictor.pars,
                            list(...))

    } else {
      if (fs.meth[[1]]=='rf') {
        require(randomForest,quietly=TRUE)
        rf <- randomForest(form,train,importance=TRUE)
        imp <- importance(rf)
        rf.genes <- rownames(imp)[order(imp[,"MeanDecreaseAccuracy"], 
                                        decreasing = TRUE)[1:fs.meth[[2]]]]
        train <- train[,c(tgt,rf.genes)]
        test <- test[,c(tgt,rf.genes)]
      }

      if (learner == 'knn') 
        pred <- kNN(form,train,test,
                    stand.stats=list(rowMedians(t(as.matrix(train[,-tgtCol]))),
                        rowIQRs(t(as.matrix(train[,-tgtCol])))),
                    ...)
      else {
        model <- do.call(learner,c(list(form,train),learner.pars))
        pred <- do.call(predictor,c(list(model,test),predictor.pars))
      }

    }

    return(list(trues=responseValues(form,test), preds=pred, 
                model=if (.model && learner!="knn") model else NULL))

}
vars <- list()
vars$randomForest <- list(learner.pars=list(ntree=c(500,750,1000),
                                            mtry=c(5,15)),
                          preditor.pars=list(type="response"))
vars$svm <- list(learner.pars=list(cost=c(1,100),
                                   gamma=c(0.01,0.001,0.0001)))
vars$knn <- list(learner.pars=list(k=c(3,5,7),
                                   stand=c(TRUE,FALSE)))
vars$featureSel <- list(featSel.meth=c("s1", "s2", "s3"))
library(performanceEstimation)
library(class)
library(randomForest)
randomForest 4.7-1.1
Type rfNews() to see new features/changes/bug fixes.
library(e1071)
library(genefilter)
load('myALL.Rdata')  # loading the previously saved object with the data
Warning: cannot open compressed file 'myALL.Rdata', probable reason 'No such file or directory'Error in readChar(con, 5L, useBytes = TRUE) : cannot open the connection
setwd("~/Downloads")
Warning: The working directory was changed to /Users/christianpetersen/Downloads inside a notebook chunk. The working directory will be reset when the chunk is finished running. Use the knitr root.dir option in the setup chunk to change the working directory for notebook chunks.
load("myALL.Rdata")
load("knn.Rdata")
load("svm.Rdata")
load("randomForest.Rdata")
rankWorkflows(svm, maxs = TRUE)
$ALL
$ALL$acc
NANA
rankWorkflows(all.trials, top=10, maxs = TRUE)
$ALL
$ALL$acc
NANA
getWorkflow("svm.v8", all.trials)
Workflow Object:
    Workflow ID       ::  svm.v8 
    Workflow Function ::  ALLb.wf
         Parameter values:
         learner.pars  -> cost=100 gamma=0.01 
         learner  -> svm 
         featSel.meth  -> s2 
top10WFnames <- rankWorkflows(all.trials, top=10, 
                              maxs = TRUE)[["ALL"]][["acc"]][,"Workflow"]
sapply(top10WFnames, function(WFid) getWorkflow(WFid,all.trials)@pars$featSel.meth)
 svm.v8 svm.v12  knn.v7  knn.v8  knn.v9 knn.v10 knn.v11 knn.v12 
   "s2"    "s2"    "s2"    "s2"    "s2"    "s2"    "s2"    "s2" 
svm.v10  svm.v6 
   "s2"    "s1" 
plot(subset(all.trials,workflows=top10WFnames))

ps <- pairedComparisons(subset(all.trials,workflows=top10WFnames),baseline="svm.v8")
Warning: With less 2 tasks the Friedman, Nemenyi and Bonferroni-Dunn tests are not calculated.
ps$acc$WilcoxonSignedRank.test
, , ALL

         MedScore DiffMedScores   p.value
svm.v8  0.8235294            NA        NA
svm.v12 0.8235294   0.000000000 0.7000463
knn.v7  0.8169856   0.006543766 0.7941389
knn.v8  0.8169856   0.006543766 0.7941389
knn.v9  0.8169856   0.006543766 0.7941389
knn.v10 0.8169856   0.006543766 0.7941389
knn.v11 0.8169856   0.006543766 0.7941389
knn.v12 0.8169856   0.006543766 0.7941389
svm.v10 0.8086312   0.014898200 0.2240278
svm.v6  0.8055556   0.017973856 0.4055620
iteration <- 1  # any number between 1 and 100 in this case
itInfo <- getIterationsInfo(all.trials,workflow="svm.v8",it=iteration)
table(itInfo$trues, itInfo$preds)
          
           ALL1/AF4 BCR/ABL E2A/PBX1 NEG
  ALL1/AF4        3       0        0   0
  BCR/ABL         0      12        0   3
  E2A/PBX1        0       0        0   1
  NEG             0       1        1  14
LS0tCnRpdGxlOiAiQ2FzZSBTdHVkeSA0IgpvdXRwdXQ6IGh0bWxfbm90ZWJvb2sKLS0tCgoKYGBge3J9Cmluc3RhbGwucGFja2FnZXMoIkJpb2NNYW5hZ2VyIikKbGlicmFyeShCaW9jTWFuYWdlcikKCmBgYAoKYGBge3J9CgpgYGAKCmBgYHtyfQpCaW9jTWFuYWdlcjo6aW5zdGFsbCgiQmlvYmFzZSIpCkJpb2NNYW5hZ2VyOjppbnN0YWxsKCJBTEwiKQpsaWJyYXJ5KEJpb2Jhc2UpCmxpYnJhcnkoQUxMKQpkYXRhKEFMTCkKYGBgCgpgYGB7cn0KQUxMCmBgYApgYGB7cn0KCnBEIDwtIHBoZW5vRGF0YShBTEwpCnZhck1ldGFkYXRhKHBEKQp0YWJsZShBTEwkQlQpCnRhYmxlKEFMTCRtb2wuYmlvbCkKdGFibGUoQUxMJEJULCBBTEwkbW9sLmJpbykKYGBgCgoKYGBge3J9CmZlYXR1cmVOYW1lcyhBTEwpWzE6MTBdCmBgYAoKCmBgYHtyfQpzYW1wbGVOYW1lcyhBTEwpWzE6NV0KYGBgCgoKYGBge3J9CnRndC5jYXNlcyA8LSB3aGljaChBTEwkQlQgJWluJSBsZXZlbHMoQUxMJEJUKVsxOjVdICYgCiAgICAgICAgICAgICAgICAgICBBTEwkbW9sLmJpbyAlaW4lIGxldmVscyhBTEwkbW9sLmJpbylbMTo0XSkKQUxMYiA8LSBBTExbLHRndC5jYXNlc10KQUxMYgpgYGAKCgpgYGB7cn0KQUxMYiRCVCA8LSBmYWN0b3IoQUxMYiRCVCkKQUxMYiRtb2wuYmlvIDwtIGZhY3RvcihBTExiJG1vbC5iaW8pCmBgYAoKCgpgYGB7cn0KCnNhdmUoQUxMYiwgZmlsZSA9ICJteUFMTC5SZGF0YSIpCmBgYAoKCgpgYGB7cn0KZXMgPC0gZXhwcnMoQUxMYikKZGltKGVzKQpgYGAKYGBge3J9CnN1bW1hcnkoYXMudmVjdG9yKGVzKSkKYGBgCgoKYGBge3J9CiNCaW9jTWFuYWdlcjo6aW5zdGFsbCgiZ2VuZWZpbHRlciIpCgpsaWJyYXJ5KGdlbmVmaWx0ZXIpCmBgYAoKYGBge3J9CmxpYnJhcnkoZ2VuZWZpbHRlcikKbGlicmFyeShnZ3Bsb3QyKQpleHByVnMgPC0gZGF0YS5mcmFtZShleHByVmFsPWFzLnZlY3RvcihlcykpCmRzIDwtIGRhdGEuZnJhbWUoU3RhdD1jKCIxc3RRIiwiTWVkaWFuIiwiM3JkUSIsIlNob3J0aCIpLAogICAgICAgICAgICAgICAgIFZhbHVlPWMocXVhbnRpbGUoZXhwclZzJGV4cHJWYWwsIAogICAgICAgICAgICAgICAgICAgICAgICAgcHJvYnM9YygwLjI1LCAwLjUsIDAuNzUpKSwKICAgICAgICAgICAgICAgICAgICAgICAgIHNob3J0aChleHByVnMkZXhwclZhbCkpLAogICAgICAgICAgICAgICAgIENvbG9yPWMoInJlZCIsImdyZWVuIiwicmVkIiwieWVsbG93IikpCmdncGxvdChleHByVnMsYWVzKHg9ZXhwclZhbCkpICsgZ2VvbV9oaXN0b2dyYW0oZmlsbD0ibGlnaHRncmV5IikgKyAKICAgIGdlb21fdmxpbmUoZGF0YT1kcyxhZXMoeGludGVyY2VwdD1WYWx1ZSxjb2xvcj1Db2xvcikpICsgCiAgICBnZW9tX3RleHQoZGF0YT1kcyxhZXMoeD1WYWx1ZS0wLjIseT0wLGxhYmVsPVN0YXQsY29sb3VyPUNvbG9yKSwKICAgICAgICAgICAgICBhbmdsZT05MCxoanVzdD0ibGVmdCIpICsKICAgIHhsYWIoIkV4cHJlc3Npb24gTGV2ZWxzIikgKyBndWlkZXMoY29sb3VyPSJub25lIiwgZmlsbD0ibm9uZSIpIApgYGAKCmBgYHtyfQpsaWJyYXJ5KGdlbmVmaWx0ZXIpCmxpYnJhcnkoZ2dwbG90MikKZXhwclZzIDwtIGRhdGEuZnJhbWUoZXhwclZhbD1hcy52ZWN0b3IoZXMpKQpkcyA8LSBkYXRhLmZyYW1lKFN0YXQ9YygiMXN0USIsIk1lZGlhbiIsIjNyZFEiLCJTaG9ydGgiKSwKICAgICAgICAgICAgICAgICBWYWx1ZT1jKHF1YW50aWxlKGV4cHJWcyRleHByVmFsLCBwcm9icz1jKDAuMjUsIDAuNSwgMC43NSkpLAogICAgICAgICAgICAgICAgICAgICBzaG9ydGgoZXhwclZzJGV4cHJWYWwpKSwKICAgICAgICAgICAgICAgICBDb2xvcj1jKCJyZWQiLCJncmVlbiIsInJlZCIsInllbGxvdyIpKQpnZ3Bsb3QoZXhwclZzLGFlcyh4PWV4cHJWYWwpKSArIGdlb21faGlzdG9ncmFtKGZpbGw9ImxpZ2h0Z3JleSIpICsgCiAgICBnZW9tX3ZsaW5lKGRhdGE9ZHMsYWVzKHhpbnRlcmNlcHQ9VmFsdWUsY29sb3I9Q29sb3IpKSArIAogICAgZ2VvbV90ZXh0KGRhdGE9ZHMsYWVzKHg9VmFsdWUtMC4yLHk9MCxsYWJlbD1TdGF0LGNvbG91cj1Db2xvciksYW5nbGU9OTAsaGp1c3Q9ImxlZnQiKSArCiAgICB4bGFiKCJFeHByZXNzaW9uIExldmVscyIpICsgZ3VpZGVzKGNvbG91cj0ibm9uZSIsIGZpbGw9Im5vbmUiKSAgICAKYGBgCgoKYGBge3J9CnNhcHBseShsZXZlbHMoQUxMYiRtb2wuYmlvKSwgCiAgICAgICBmdW5jdGlvbih4KSBzdW1tYXJ5KGFzLnZlY3Rvcihlc1ssIHdoaWNoKEFMTGIkbW9sLmJpbyA9PSB4KV0pKSkKYGBgCgoKYGBge3J9CkJpb2NNYW5hZ2VyOjppbnN0YWxsKCJoZ3U5NWF2Mi5kYiIpCgpsaWJyYXJ5KGhndTk1YXYyLmRiKQpgYGAKCgpgYGB7cn0Kcm93SVFScyA8LSBmdW5jdGlvbihlbSkgCiAgICByb3dRKGVtLGNlaWxpbmcoMC43NSpuY29sKGVtKSkpIC0gcm93UShlbSxmbG9vcigwLjI1Km5jb2woZW0pKSkKbGlicmFyeShnZ3Bsb3QyKQpkZyA8LSBkYXRhLmZyYW1lKHJvd01lZD1yb3dNZWRpYW5zKGVzKSwgcm93SVFSPXJvd0lRUnMoZXMpKQpnZ3Bsb3QoZGcsYWVzKHg9cm93TWVkLCB5PXJvd0lRUikpICsgZ2VvbV9wb2ludCgpICsKICAgIHhsYWIoIk1lZGlhbiBleHByZXNzaW9uIGxldmVsIikgKyB5bGFiKCJJUVIgZXhwcmVzc2lvbiBsZXZlbCIpICsKICAgIGdndGl0bGUoIk1haW4gQ2hhcmFjdGVyaXN0aWNzIG9mIEdlbmVzIEV4cHJlc3Npb24gTGV2ZWxzIikKYGBgCgoKYGBge3J9CnJvd0lRUnMgPC0gZnVuY3Rpb24oZW0pIHJvd1EoZW0sY2VpbGluZygwLjc1Km5jb2woZW0pKSkgLSByb3dRKGVtLGZsb29yKDAuMjUqbmNvbChlbSkpKQpsaWJyYXJ5KGdncGxvdDIpCmRnIDwtIGRhdGEuZnJhbWUocm93TWVkPXJvd01lZGlhbnMoZXMpLCByb3dJUVI9cm93SVFScyhlcykpCmdncGxvdChkZyxhZXMoeD1yb3dNZWQsIHk9cm93SVFSKSkgKyBnZW9tX3BvaW50KCkgKwogICAgeGxhYigiTWVkaWFuIGV4cHJlc3Npb24gbGV2ZWwiKSArIHlsYWIoIklRUiBleHByZXNzaW9uIGxldmVsIikgKwogICAgZ2d0aXRsZSgiTWFpbiBDaGFyYWN0ZXJpc3RpY3Mgb2YgR2VuZXMgRXhwcmVzc2lvbiBMZXZlbHMiKQpgYGAKCgpgYGB7cn0KbGlicmFyeShnZW5lZmlsdGVyKQpyZXNGaWx0ZXIgPC0gbnNGaWx0ZXIoQUxMYiwKICAgICAgICAgICAgICAgICB2YXIuZnVuYz1JUVIsCiAgICAgICAgICAgICAgICAgdmFyLmN1dG9mZj1JUVIoYXMudmVjdG9yKGVzKSkvNSwgCiAgICAgICAgICAgICAgICAgZmVhdHVyZS5leGNsdWRlPSJeQUZGWCIpCnJlc0ZpbHRlcgpgYGAKCmBgYHtyfQpBTExiIDwtIHJlc0ZpbHRlciRlc2V0CmVzIDwtIGV4cHJzKEFMTGIpCmRpbShlcykKCmBgYAoKYGBge3J9CmYgPC0gQW5vdmEoQUxMYiRtb2wuYmlvLCBwID0gMC4wMSkKZmYgPC0gZmlsdGVyZnVuKGYpCnNlbEdlbmVzIDwtIGdlbmVmaWx0ZXIoZXhwcnMoQUxMYiksIGZmKQpzdW0oc2VsR2VuZXMpCmBgYAoKCmBgYHtyfQpBTExiIDwtIEFMTGJbc2VsR2VuZXMsIF0KQUxMYgplcyA8LSBleHBycyhBTExiKQpkaW0oZXMpCmBgYAoKYGBge3J9CmRnIDwtIGRhdGEuZnJhbWUocm93TWVkPXJvd01lZGlhbnMoZXMpLCByb3dJUVI9cm93SVFScyhlcykpCmdncGxvdChkZyxhZXMoeD1yb3dNZWQsIHk9cm93SVFSKSkgKyBnZW9tX3BvaW50KCkgKwogICAgeGxhYigiTWVkaWFuIGV4cHJlc3Npb24gbGV2ZWwiKSArIHlsYWIoIklRUiBleHByZXNzaW9uIGxldmVsIikgKwogICAgZ2d0aXRsZSgiRGlzdHJpYnV0aW9uIFByb3BlcnRpZXMgb2YgdGhlIFNlbGVjdGVkIEdlbmVzIikKYGBgCgoKYGBge3J9CmxpYnJhcnkocmFuZG9tRm9yZXN0KQpkdCA8LSBkYXRhLmZyYW1lKHQoZXMpLCBNdXQgPSBBTExiJG1vbC5iaW8pCmR0JE11dCA8LSBkcm9wbGV2ZWxzKGR0JE11dCkKc2V0LnNlZWQoMTIzNCkKcmYgPC0gcmFuZG9tRm9yZXN0KE11dCB+IC4sIGR0LCBpbXBvcnRhbmNlID0gVFJVRSkKaW1wIDwtIGltcG9ydGFuY2UocmYpCnJmLmdlbmVzIDwtIHJvd25hbWVzKGltcClbb3JkZXIoaW1wWywiTWVhbkRlY3JlYXNlQWNjdXJhY3kiXSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVjcmVhc2luZyA9IFRSVUUpWzE6MzBdXQpgYGAKCmBgYHtyfQpsaWJyYXJ5KHRpZHlyKQpsaWJyYXJ5KGRwbHlyKQpkIDwtIGdhdGhlcihkdFssYyhyZi5nZW5lcywiTXV0IildLEdlbmUsRXhwclZhbHVlLDE6bGVuZ3RoKHJmLmdlbmVzKSkKZGF0IDwtIGdyb3VwX2J5KGQsTXV0LEdlbmUpICU+JSAKICAgIHN1bW1hcmlzZShtZWQ9bWVkaWFuKEV4cHJWYWx1ZSksIGlxcj1JUVIoRXhwclZhbHVlKSkKZ2dwbG90KGRhdCwgYWVzKHg9bWVkLHk9aXFyLGNvbG9yPU11dCkpICsgIAogICAgZ2VvbV9wb2ludChzaXplPTYpICsgZmFjZXRfd3JhcCh+IEdlbmUpICsgCiAgICBsYWJzKHg9Ik1FRElBTiBleHByZXNzaW9uIGxldmVsIix5PSJJUVIgZXhwcmVzc2lvbiBsZXZlbCIsY29sb3I9Ik11dGF0aW9uIikKYGBgCgoKYGBge3J9CiNpbnN0YWxsLnBhY2thZ2VzKCdIbWlzYycpCmxpYnJhcnkoSG1pc2MpCnZjIDwtIHZhcmNsdXModChlcykpCmNsdXMzMCA8LSBjdXRyZWUodmMkaGNsdXN0LCAzMCkKdGFibGUoY2x1czMwKQoKCmBgYAoKCmBgYHtyfQpnZXRWYXJzU2V0IDwtIGZ1bmN0aW9uKGNsdXN0ZXIsbnZhcnM9MzAsc2VlZD1OVUxMLHZlcmI9RkFMU0UpIHsKICAgIGlmICghaXMubnVsbChzZWVkKSkgc2V0LnNlZWQoc2VlZCkKICAgIAogICAgY2xzIDwtIGN1dHJlZShjbHVzdGVyLG52YXJzKQogICAgdG90cyA8LSB0YWJsZShjbHMpCiAgICB2YXJzIDwtIGMoKQogICAgdmFycyA8LSBzYXBwbHkoMTpudmFycyxmdW5jdGlvbihjbElEKQogICAgewogICAgICAgIGlmICghbGVuZ3RoKHRvdHNbY2xJRF0pKSBzdG9wKCdFbXB0eSBjbHVzdGVyISAoJyxjbElELCcpJykKICAgICAgICB4IDwtIHNhbXBsZSgxOnRvdHNbY2xJRF0sMSkKICAgICAgICBuYW1lcyhjbHNbY2xzPT1jbElEXSlbeF0KICAgIH0pCiAgICBpZiAodmVyYikgIHN0cnVjdHVyZSh2YXJzLGNsdXNNZW1iPWNscyxjbHVzVG90cz10b3RzKQogICAgZWxzZSAgICAgICB2YXJzCn0KZ2V0VmFyc1NldCh2YyRoY2x1c3QpCmdldFZhcnNTZXQodmMkaGNsdXN0KQoKYGBgCgoKCmBgYHtyfQpsaWJyYXJ5KHBlcmZvcm1hbmNlRXN0aW1hdGlvbikKbGlicmFyeShETXdSMikKZGF0YShpcmlzKQpleHAgPC0gcGVyZm9ybWFuY2VFc3RpbWF0aW9uKAogICAgUHJlZFRhc2soU3BlY2llcyB+IC4sIGlyaXMpLCAKICAgIFdvcmtmbG93KGxlYXJuZXI9InJwYXJ0WHNlIiwgcHJlZGljdG9yLnBhcnM9bGlzdCh0eXBlPSJjbGFzcyIpKSwKICAgIEVzdGltYXRpb25UYXNrKG1ldHJpY3M9ImFjYyIsbWV0aG9kPUJvb3RzdHJhcChuUmVwcz0xMDApKSkKYGBgCgoKYGBge3J9CnN1bW1hcnkoZXhwKQoKYGBgCgoKYGBge3J9CiNpbnN0YWxsLnBhY2thZ2VzKCdjbGFzcycpCmxpYnJhcnkoY2xhc3MpCmRhdGEoaXJpcykKaWR4IDwtIHNhbXBsZSgxOm5yb3coaXJpcyksIGFzLmludGVnZXIoMC43ICogbnJvdyhpcmlzKSkpCnRyIDwtIGlyaXNbaWR4LCBdCnRzIDwtIGlyaXNbLWlkeCwgXQpwcmVkcyA8LSBrbm4odHJbLCAtNV0sIHRzWywgLTVdLCB0clssIDVdLCBrID0gMykKdGFibGUocHJlZHMsIHRzWywgNV0pCmBgYAoKCgoKYGBge3J9CmtOTiA8LSBmdW5jdGlvbihmb3JtLCB0cmFpbiwgdGVzdCwgc3RhbmQgPSBUUlVFLCBzdGFuZC5zdGF0cyA9IE5VTEwsIC4uLikgewogICAgcmVxdWlyZShjbGFzcywgcXVpZXRseSA9IFRSVUUpCiAgICB0Z3RDb2wgPC0gd2hpY2goY29sbmFtZXModHJhaW4pID09IGFzLmNoYXJhY3Rlcihmb3JtW1syXV0pKQogICAgaWYgKHN0YW5kKSB7CiAgICAgICAgaWYgKGlzLm51bGwoc3RhbmQuc3RhdHMpKSAKICAgICAgICAgICAgdG1wIDwtIHNjYWxlKHRyYWluWywgLXRndENvbF0sIGNlbnRlciA9IFRSVUUsIHNjYWxlID0gVFJVRSkKICAgICAgICBlbHNlIHRtcCA8LSBzY2FsZSh0cmFpblssIC10Z3RDb2xdLCBjZW50ZXIgPSBzdGFuZC5zdGF0c1tbMV1dLCAKICAgICAgICAgICAgICAgICAgICAgICAgICBzY2FsZSA9IHN0YW5kLnN0YXRzW1syXV0pCiAgICAgICAgdHJhaW5bLCAtdGd0Q29sXSA8LSB0bXAKICAgICAgICBtcyA8LSBhdHRyKHRtcCwgInNjYWxlZDpjZW50ZXIiKQogICAgICAgIHNzIDwtIGF0dHIodG1wLCAic2NhbGVkOnNjYWxlIikKICAgICAgICB0ZXN0WywgLXRndENvbF0gPC0gc2NhbGUodGVzdFssIC10Z3RDb2xdLCBjZW50ZXIgPSBtcywgc2NhbGUgPSBzcykKICAgIH0KICAgIGtubih0cmFpblssIC10Z3RDb2xdLCB0ZXN0WywgLXRndENvbF0sIHRyYWluWywgdGd0Q29sXSwgLi4uKQp9CgpgYGAKCmBgYHtyfQpwcmVkcy5zdGFuZCA8LSBrTk4oU3BlY2llcyB+IC4sIHRyLCB0cywgayA9IDMpCnRhYmxlKHByZWRzLnN0YW5kLHRzWywgNV0pCnByZWRzLm5vdFN0YW5kIDwtIGtOTihTcGVjaWVzIH4gLiwgdHIsIHRzLCBzdGFuZCA9IEZBTFNFLCBrID0gMykKdGFibGUocHJlZHMubm90U3RhbmQsIHRzWywgNV0pIAoKYGBgCgpgYGB7cn0KdmFyc0Vuc2VtYmxlIDwtIGZ1bmN0aW9uKHRndCx0cmFpbix0ZXN0LAogICAgICAgICAgICAgICAgICAgICAgICAgZnMubWV0aCwKICAgICAgICAgICAgICAgICAgICAgICAgIGJhc2VMZWFybmVyLGJsUGFycywKICAgICAgICAgICAgICAgICAgICAgICAgIHByZWRpY3RvcixwcmVkUGFycywKICAgICAgICAgICAgICAgICAgICAgICAgIHZlcmI9RkFMU0UpCnsKICAgIHJlcXVpcmUoSG1pc2MscXVpZXRseT1UUlVFKQogICAgdiA8LSB2YXJjbHVzKGFzLm1hdHJpeCh0cmFpblssLXdoaWNoKGNvbG5hbWVzKHRyYWluKT09dGd0KV0pKQogICAgdmFyc1NldHMgPC0gbGFwcGx5KDE6ZnMubWV0aFtbM11dLGZ1bmN0aW9uKHgpCiAgICAgICAgZ2V0VmFyc1NldCh2JGhjbHVzdCxudmFycz1mcy5tZXRoW1syXV0pKQogICAgCiAgICBwcmVkcyA8LSBtYXRyaXgoTkEsbmNvbD1sZW5ndGgodmFyc1NldHMpLG5yb3c9TlJPVyh0ZXN0KSkKICAgIGZvcih2IGluIHNlcShhbG9uZz12YXJzU2V0cykpIHsKICAgICAgICBpZiAoYmFzZUxlYXJuZXI9PSdrbm4nKQogICAgICAgICAgICBwcmVkc1ssdl0gPC0gZG8uY2FsbCgia05OIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYyhsaXN0KGFzLmZvcm11bGEocGFzdGUodGd0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFzdGUodmFyc1NldHNbW3ZdXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbGxhcHNlPScrJyksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXA9J34nKSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFpblssYyh0Z3QsdmFyc1NldHNbW3ZdXSldLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGVzdFssYyh0Z3QsdmFyc1NldHNbW3ZdXSldKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBibFBhcnMpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkKICAgICAgICBlbHNlIHsKICAgICAgICAgICAgbSA8LSBkby5jYWxsKGJhc2VMZWFybmVyLAogICAgICAgICAgICAgICAgICAgICAgICAgYyhsaXN0KGFzLmZvcm11bGEocGFzdGUodGd0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFzdGUodmFyc1NldHNbW3ZdXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbGxhcHNlPScrJyksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXA9J34nKSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhaW5bLGModGd0LHZhcnNTZXRzW1t2XV0pXSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGJsUGFycykKICAgICAgICAgICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgcHJlZHNbLHZdIDwtIGRvLmNhbGwocHJlZGljdG9yLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjKGxpc3QobSx0ZXN0WyxjKHRndCx2YXJzU2V0c1tbdl1dKV0pLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZWRQYXJzKSkKICAgICAgICB9CiAgICB9CgogICAgcHMgPC0gYXBwbHkocHJlZHMsMSxmdW5jdGlvbih4KQogICAgICAgIGxldmVscyhmYWN0b3IoeCkpW3doaWNoLm1heCh0YWJsZShmYWN0b3IoeCkpKV0pCiAgICBmYWN0b3IocHMsCiAgICAgICAgICAgbGV2ZWxzPTE6bmxldmVscyh0cmFpblssdGd0XSksCiAgICAgICAgICAgbGFiZWxzPWxldmVscyh0cmFpblssdGd0XSkpCn0KYGBgCgpgYGB7cn0KQUxMYi53ZiA8LSBmdW5jdGlvbihmb3JtLCB0cmFpbiwgdGVzdCwKICAgICAgICAgICAgICAgICAgICBsZWFybmVyLCBsZWFybmVyLnBhcnM9TlVMTCwKICAgICAgICAgICAgICAgICAgICBwcmVkaWN0b3I9InByZWRpY3QiLHByZWRpY3Rvci5wYXJzPU5VTEwsCiAgICAgICAgICAgICAgICAgICAgZmVhdFNlbC5tZXRoID0gInMyIiwgCiAgICAgICAgICAgICAgICAgICAgYXZhaWxhYmxlLmZzTWV0aG9kcz1saXN0KHMxPWxpc3QoImFsbCIpLHMyPWxpc3QoJ3JmJywzMCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMzPWxpc3QoJ3ZhcmNsdXMnLDMwLDUwKSksCiAgICAgICAgICAgICAgICAgICAgLm1vZGVsPUZBTFNFLAogICAgICAgICAgICAgICAgICAgIC4uLikKewogICAgIyMgVGhlIGNoYXJhY3RlcmlzdGljcyBvZiB0aGUgc2VsZWN0ZWQgZmVhdHVyZSBzZWxlY3Rpb24gbWV0aG9kCiAgICBmcy5tZXRoIDwtIGF2YWlsYWJsZS5mc01ldGhvZHNbW2ZlYXRTZWwubWV0aF1dIAogICAgCiAgICAjIyBUaGUgdGFyZ2V0IHZhcmlhYmxlCiAgICB0Z3QgPC0gYXMuY2hhcmFjdGVyKGZvcm1bWzJdXSkKICAgIHRndENvbCA8LSB3aGljaChjb2xuYW1lcyh0cmFpbik9PXRndCkKCiAgICAjIyBBbm92YSBmaWx0ZXJpbmcgIAogICAgZiA8LSBBbm92YSh0cmFpblssdGd0XSxwPTAuMDEpCiAgICBmZiA8LSBmaWx0ZXJmdW4oZikKICAgIGdlbmVzIDwtIGdlbmVmaWx0ZXIodCh0cmFpblssLXRndENvbF0pLGZmKQogICAgZ2VuZXMgPC0gbmFtZXMoZ2VuZXMpW2dlbmVzXQogICAgdHJhaW4gPC0gdHJhaW5bLGModGd0LGdlbmVzKV0KICAgIHRlc3QgPC0gdGVzdFssYyh0Z3QsZ2VuZXMpXQogICAgdGd0Q29sIDwtIDEKCiAgICAjIyBTcGVjaWZpYyBmaWx0ZXJpbmcgCiAgICBpZiAoZnMubWV0aFtbMV1dPT0ndmFyY2x1cycpIHsKICAgICAgcHJlZCA8LSB2YXJzRW5zZW1ibGUodGd0LHRyYWluLHRlc3QsZnMubWV0aCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxlYXJuZXIsbGVhcm5lci5wYXJzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJlZGljdG9yLHByZWRpY3Rvci5wYXJzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgbGlzdCguLi4pKQoKICAgIH0gZWxzZSB7CiAgICAgIGlmIChmcy5tZXRoW1sxXV09PSdyZicpIHsKICAgICAgICByZXF1aXJlKHJhbmRvbUZvcmVzdCxxdWlldGx5PVRSVUUpCiAgICAgICAgcmYgPC0gcmFuZG9tRm9yZXN0KGZvcm0sdHJhaW4saW1wb3J0YW5jZT1UUlVFKQogICAgICAgIGltcCA8LSBpbXBvcnRhbmNlKHJmKQogICAgICAgIHJmLmdlbmVzIDwtIHJvd25hbWVzKGltcClbb3JkZXIoaW1wWywiTWVhbkRlY3JlYXNlQWNjdXJhY3kiXSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWNyZWFzaW5nID0gVFJVRSlbMTpmcy5tZXRoW1syXV1dXQogICAgICAgIHRyYWluIDwtIHRyYWluWyxjKHRndCxyZi5nZW5lcyldCiAgICAgICAgdGVzdCA8LSB0ZXN0WyxjKHRndCxyZi5nZW5lcyldCiAgICAgIH0KCiAgICAgIGlmIChsZWFybmVyID09ICdrbm4nKSAKICAgICAgICBwcmVkIDwtIGtOTihmb3JtLHRyYWluLHRlc3QsCiAgICAgICAgICAgICAgICAgICAgc3RhbmQuc3RhdHM9bGlzdChyb3dNZWRpYW5zKHQoYXMubWF0cml4KHRyYWluWywtdGd0Q29sXSkpKSwKICAgICAgICAgICAgICAgICAgICAgICAgcm93SVFScyh0KGFzLm1hdHJpeCh0cmFpblssLXRndENvbF0pKSkpLAogICAgICAgICAgICAgICAgICAgIC4uLikKICAgICAgZWxzZSB7CiAgICAgICAgbW9kZWwgPC0gZG8uY2FsbChsZWFybmVyLGMobGlzdChmb3JtLHRyYWluKSxsZWFybmVyLnBhcnMpKQogICAgICAgIHByZWQgPC0gZG8uY2FsbChwcmVkaWN0b3IsYyhsaXN0KG1vZGVsLHRlc3QpLHByZWRpY3Rvci5wYXJzKSkKICAgICAgfQoKICAgIH0KCiAgICByZXR1cm4obGlzdCh0cnVlcz1yZXNwb25zZVZhbHVlcyhmb3JtLHRlc3QpLCBwcmVkcz1wcmVkLCAKICAgICAgICAgICAgICAgIG1vZGVsPWlmICgubW9kZWwgJiYgbGVhcm5lciE9ImtubiIpIG1vZGVsIGVsc2UgTlVMTCkpCgp9CmBgYAoKCmBgYHtyfQp2YXJzIDwtIGxpc3QoKQp2YXJzJHJhbmRvbUZvcmVzdCA8LSBsaXN0KGxlYXJuZXIucGFycz1saXN0KG50cmVlPWMoNTAwLDc1MCwxMDAwKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtdHJ5PWMoNSwxNSkpLAogICAgICAgICAgICAgICAgICAgICAgICAgIHByZWRpdG9yLnBhcnM9bGlzdCh0eXBlPSJyZXNwb25zZSIpKQp2YXJzJHN2bSA8LSBsaXN0KGxlYXJuZXIucGFycz1saXN0KGNvc3Q9YygxLDEwMCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2FtbWE9YygwLjAxLDAuMDAxLDAuMDAwMSkpKQp2YXJzJGtubiA8LSBsaXN0KGxlYXJuZXIucGFycz1saXN0KGs9YygzLDUsNyksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhbmQ9YyhUUlVFLEZBTFNFKSkpCnZhcnMkZmVhdHVyZVNlbCA8LSBsaXN0KGZlYXRTZWwubWV0aD1jKCJzMSIsICJzMiIsICJzMyIpKQoKYGBgCgpgYGB7cn0KbGlicmFyeShwZXJmb3JtYW5jZUVzdGltYXRpb24pCmxpYnJhcnkoY2xhc3MpCmxpYnJhcnkocmFuZG9tRm9yZXN0KQpsaWJyYXJ5KGUxMDcxKQpsaWJyYXJ5KGdlbmVmaWx0ZXIpCmxvYWQoJ215QUxMLlJkYXRhJykgICMgbG9hZGluZyB0aGUgcHJldmlvdXNseSBzYXZlZCBvYmplY3Qgd2l0aCB0aGUgZGF0YQoKZXMgPC0gZXhwcnMoQUxMYikKCiMjIHNpbXBsZSBmaWx0ZXJpbmcKQUxMYiA8LSBuc0ZpbHRlcihBTExiLAogICAgICAgICAgICAgICAgIHZhci5mdW5jPUlRUix2YXIuY3V0b2ZmPUlRUihhcy52ZWN0b3IoZXMpKS81LCAKICAgICAgICAgICAgICAgICBmZWF0dXJlLmV4Y2x1ZGU9Il5BRkZYIikKQUxMYiA8LSBBTExiJGVzZXQKCiMjIHRoZSBzb3VyY2UgZGF0YXNldCBhZnRlciB0aGUgYmFzaWMgZmlsdGVyaW5nCmR0IDwtIGRhdGEuZnJhbWUodChleHBycyhBTExiKSksTXV0PUFMTGIkbW9sLmJpbykKCnNldC5zZWVkKDEyMzQpCiMjIFRoZSBsZWFybmVycyB0byBldmFsdWF0ZQpUT0RPIDwtIGMoJ2tubicsJ3N2bScsJ3JhbmRvbUZvcmVzdCcpCmZvcih0ZCBpbiBUT0RPKSB7CiAgICBhc3NpZ24odGQsCiAgICAgICAgIHBlcmZvcm1hbmNlRXN0aW1hdGlvbigKICAgICAgICAgICAgIFByZWRUYXNrKE11dCB+IC4sZHQsJ0FMTCcpLAogICAgICAgICAgICAgZG8uY2FsbCgnd29ya2Zsb3dWYXJpYW50cycsCiAgICAgICAgICAgICAgICAgICAgIGMobGlzdCgnQUxMYi53ZicsbGVhcm5lcj10ZCx2YXJzUm9vdE5hbWU9dGQpLAogICAgICAgICAgICAgICAgICAgICAgIHZhcnNbW3RkXV0sCiAgICAgICAgICAgICAgICAgICAgICAgdmFycyRmZWF0dXJlU2VsCiAgICAgICAgICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgICAgICApLAogICAgICAgICAgICAgRXN0aW1hdGlvblRhc2sobWV0cmljcz0iYWNjIixtZXRob2Q9Qm9vdHN0cmFwKG5SZXBzPTEwMCkpLAogICAgICAgICAgICAgY2x1c3Rlcj1UUlVFCiAgICAgICAgICkKICAgICAgICAgKQogICAgc2F2ZShsaXN0PXRkLGZpbGU9cGFzdGUodGQsJ1JkYXRhJyxzZXA9Jy4nKSkKfQpgYGAKCmBgYHtyfQpzZXR3ZCgifi9Eb3dubG9hZHMiKQoKbG9hZCgibXlBTEwuUmRhdGEiKQpsb2FkKCJrbm4uUmRhdGEiKQpsb2FkKCJzdm0uUmRhdGEiKQpsb2FkKCJyYW5kb21Gb3Jlc3QuUmRhdGEiKQpgYGAKCmBgYHtyfQpyYW5rV29ya2Zsb3dzKHN2bSwgbWF4cyA9IFRSVUUpCmBgYAoKYGBge3J9CmFsbC50cmlhbHMgPC0gbWVyZ2VFc3RpbWF0aW9uUmVzKHN2bSwga25uLCByYW5kb21Gb3Jlc3QsIGJ5ID0id29ya2Zsb3dzIikKCmBgYAoKYGBge3J9CnJhbmtXb3JrZmxvd3MoYWxsLnRyaWFscywgdG9wPTEwLCBtYXhzID0gVFJVRSkKCmBgYAoKYGBge3J9CmdldFdvcmtmbG93KCJzdm0udjgiLCBhbGwudHJpYWxzKQoKYGBgCgpgYGB7cn0KdG9wMTBXRm5hbWVzIDwtIHJhbmtXb3JrZmxvd3MoYWxsLnRyaWFscywgdG9wPTEwLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF4cyA9IFRSVUUpW1siQUxMIl1dW1siYWNjIl1dWywiV29ya2Zsb3ciXQpzYXBwbHkodG9wMTBXRm5hbWVzLCBmdW5jdGlvbihXRmlkKSBnZXRXb3JrZmxvdyhXRmlkLGFsbC50cmlhbHMpQHBhcnMkZmVhdFNlbC5tZXRoKQpgYGAKCgpgYGB7cn0KcGxvdChzdWJzZXQoYWxsLnRyaWFscyx3b3JrZmxvd3M9dG9wMTBXRm5hbWVzKSkKCmBgYAoKYGBge3J9CnBzIDwtIHBhaXJlZENvbXBhcmlzb25zKHN1YnNldChhbGwudHJpYWxzLHdvcmtmbG93cz10b3AxMFdGbmFtZXMpLGJhc2VsaW5lPSJzdm0udjgiKQpwcyRhY2MkV2lsY294b25TaWduZWRSYW5rLnRlc3QKYGBgCgpgYGB7cn0KaXRlcmF0aW9uIDwtIDEgICMgYW55IG51bWJlciBiZXR3ZWVuIDEgYW5kIDEwMCBpbiB0aGlzIGNhc2UKaXRJbmZvIDwtIGdldEl0ZXJhdGlvbnNJbmZvKGFsbC50cmlhbHMsd29ya2Zsb3c9InN2bS52OCIsaXQ9aXRlcmF0aW9uKQp0YWJsZShpdEluZm8kdHJ1ZXMsIGl0SW5mbyRwcmVkcykKYGBgCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgo=