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=