Nothing
bn.calculation <- function(
bnInputFile, moduleNum=60, numClust=2,
perJob=10, algo='hc', scoring='bde',
indivBNs=TRUE, restart=0, pertFrac=0.1, pertFrac0=0,
resultPath, ind='', seed=NULL, bnStartFile="None", start=NULL,
doRevblk=FALSE, randomInit=TRUE, revBlkRate=0, selected=NULL,
Data=NULL, blacklist="Auto", verbose=0,
maxSeconds=5*60, doShuffle=TRUE)
{
## Feel free to edit, but please do not unnecessarily remove comments! --Amir
## bnInputFile is the output of make.bn.input.R,
## bnInputFile contains bnInp,
## a list that has Data (discretesized expression, and optionally Disease, beAML, dummies) blacklist
## if indivBNs==T, bn.boot is used and individual networks are saved along with a strength summary,
## otherwise boot.strength is used and only the strength summary is saved.
## If restart > 0, then at each restart, hc's perturb argument will be set
##to (pertFrac* (number of nodes)).
## ind helps with the future implementation of wrapper/harvester function, use numbers
## bnStartFile: contanins the starting BN. Set to "None" to disable.
## doRevblk: If TRUE and bnStartFile is "None", the reverse of all edges in the blacklist
## will be in the starting (initial) network.
## randomInit: Boolean; start from a random network; ignored if either start or bnStartFile are given.
## pertFrac0: Is start is provided, its arcs will be perturbated (removed, pruned) by this portion.
## maxSeconds: The maximum time allowed for learning the bn if indivBNs=FALSE.
## For a network with 30-40 nodes, maxSeconds=5*60 is recommended.
## Beyond this limit, the computation is intrupted and nothing is saved.
## If it is not Inf, only 1 core will be used, even if numClust > 1.
## blacklist: Set to "Auto" to read from the bnInp list in bnInputFile.
result <- list()
files <- c()
startTime <- Sys.time()
message.if(paste("Learning", perJob, " BNs using", algo, " started at:"), verbose=verbose)
message.if(as.character(startTime), verbose=verbose)
message.if(paste("doRevblk:", doRevblk), verbose=verbose)
result[["timedOut"]] <- FALSE
##
result[["seed"]] <- seed
if(!is.null(seed)){
set.seed(seed)
message.if(paste("Random seed is set to:", seed), verbose=verbose)
}
bnInp <- get(load(bnInputFile)) ## bnInp
##^ bnInputFile contains bnInp,
##which has Data (discretesized expression)
##and optionally blacklist for Disease, beAML, and dummies.
if(is.null(Data))
Data <- bnInp$Data
if(is.null(Data))
stop("Data cannot be NULL!")
if(blacklist=="Auto")
blacklist <- bnInp$blacklist
if(is.null(blacklist))
warning("blacklist is NULL!")
if(!bnStartFile=="None"){
if(!is.null(start))
stop("Please set either start to NULL, or bnStartFile to 'None'. Too many inputs!")
load(bnStartFile) ## selected
start <- selected$BN
} else {
if(doRevblk){ ## Add the reverse of blacklist in the start network
nodes1 <- colnames(Data)
arcs1 <- blacklist[, c("to", "from")]
colnames(arcs1) <- c("from", "to")
start <- empty.graph(nodes=nodes1)
arcs(start) <- arcs1
}
}## Enf if(!bnStartFile=="None").
## Initial network:
message.if("Preparing the initial network...", verbose=verbose-1)
w1 <- "IGNORING randomInit , because start or bnStartFile had been provided !!"
if(randomInit==TRUE){
if(!is.null(start) ){
warning(w1)
} else { ## no start,
nodesOrdered <- colnames(Data)
if("Disease" %in% nodesOrdered)
## Move Disease to the begining.
nodesOrdered <- c("Disease", nodesOrdered[-which(nodesOrdered=="Disease")])
start <- sample.network(nodes=nodesOrdered, blacklist=blacklist,
revBlkRate=revBlkRate, doShuffle=doShuffle,
verbose=verbose-1)
}
}
##
arglist <- list()
## specifying the initial network (start) works with hc,
##^but might not work with other learning methods
if(algo %in% c('hc', 'tabu')){
arglist <- list('blacklist'=blacklist, 'score'=scoring, 'start'=start, 'restart'=restart,
'perturb'=round(pertFrac*ncol(Data)))
}else{
arglist <- list('blacklist'=blacklist, 'score'=scoring, 'restart'=restart ,
'perturb'=round(pertFrac*ncol(Data)))
}##end algo is hc
##
if(!is.null(start)){
result[["bdeBefore"]] <- score(start, data=Data, type="bde")
message.if("BDe score before trainig:", verbose=verbose-1)
message.if(result[["bdeBefore"]], verbose=verbose-1)
## Perturbation:
arcNum <- nrow(arcs(start))
pertNum <- round(pertFrac0*arcNum)
if(pertNum>0){
arcs(start) <- arcs(start)[-sample(size=pertNum, 1:arcNum, replace=FALSE), ]
result[["bdeBeforePerturb"]] <- score(start, data=Data, type="bde")
message.if("BDe score before trainig, perturbed:", verbose=verbose-1)
message.if(result[["bdeBeforePerturb"]], verbose=verbose-1)
}
}
result[["realStart"]] <- start
result[["arglist"]] <- arglist
clustOrNot <- NULL
if(maxSeconds==Inf){
clustOrNot <- parallel::makeCluster(numClust)
##^ We can change the number of clusters. On stampede numClust can be 16-32 or more
## To fix the warning related to makeCluster
fixArgs <- c("cluster", "MPIcluster", "PVMcluster", "SOCKcluster")
assignInNamespace("supported.clusters",fixArgs, "bnlearn")
}
## BN Calculation
if(! indivBNs ){
bnet <- boot.strength(data=Data, R=perJob, algorithm=algo, cluster=clustOrNot,
algorithm.args=arglist )
}else{
limited.bn.boot <- function(maxSeconds){ ## To disallow long time computation.
setTimeLimit(cpu=maxSeconds, transient=TRUE)
bb <- bn.boot(data=Data, R=perJob, algorithm=algo, statistic=arcs,
algorithm.args=arglist, cluster=clustOrNot)
setTimeLimit(cpu=Inf, elapsed=Inf)
return(bb)
}
tried <- try(bnet.indv <- limited.bn.boot(maxSeconds=maxSeconds), silent=TRUE)
if(inherits(tried, "try-error")){ ## Timed out.
m1 <- "Computation of bn.boot() was terminated as its running time exceeded"
message.if(paste(m1, maxSeconds, "seconds."), verbose=verbose)
## Clean up
if(!is.null(clustOrNot))
parallel::stopCluster(clustOrNot)
result[["timedOut"]] <- TRUE
return(result)
}
## Clean up
if(!is.null(clustOrNot))
parallel::stopCluster(clustOrNot)
## save the collection of individual networks
fn <- indFileName(moduleNum=moduleNum, perJob=perJob, ind=ind, typePhrase="bnet.indv")$names
files["bnet.indv"] <- combinedPath(resultPath, fn)
bnets <- list("bnet.indv"=bnet.indv)
##message.if(paste("Saving bnets in:", files["bnet.indv"]))
save.if(bnets, file=files["bnet.indv"], verbose=verbose)
candlist1 <- cbind(files["bnet.indv"], 1:perJob)
colnames(candlist1) <- c("File", "Index")
bnets[["scores"]] <- scoreCandidates(candlist=candlist1, Data=Data,
scoring='bde', saveFile=NULL, verbose=verbose-1)
##save.if(bnet.indv, bnet.indv.scores, file=files["bnet.indv"])
save.if(bnets, file=files["bnet.indv"], verbose=verbose-1)
s1 <- summary(as.numeric(bnets[["scores"]]$candidates[, "Score"]))
message.if(paste("Summary of ", perJob, " scores:"), verbose=verbose-1)
message.if(s1, verbose=verbose-1)
## make a summary
bnet <- custom.strength(bnet.indv, colnames(Data))
}##end else (i.e. indivBNs==TRUE)
##
## End time:
message.if("Learning BN took:", verbose=verbose)
timeTaken <- Sys.time()-startTime
message.if(as.character(timeTaken), verbose=verbose)
result[["timeTaken"]] <- timeTaken
## save the summary
fn <- indFileName(moduleNum=moduleNum, perJob=perJob, ind=ind, typePhrase="bnet.strength")$names
files["bnet"] <- combinedPath(resultPath, fn)
message.if(paste("Saving bnet in:", files["bnet"]), verbose=verbose)
result[["files"]] <- files
result[["algo"]] <- algo
result[["bnet"]] <- bnet
bnCalculated <- result
##save.if(bnet, learnt, file=files["bnet"])
save.if(bnCalculated, file=files["bnet"], verbose=verbose)
##print("bnCalculated was saved in:", file=files["bnet"])
return(result)
} ## End of function.
Any scripts or data that you put into this service are public.
Add the following code to your website.
For more information on customizing the embed code, read Embedding Snippets.