bnlearn的并行化(并行包)

时间:2015-02-09 17:27:58

标签: r parallel-processing

我正在使用Rbnlearn来估算贝叶斯网络结构。它使用parallel包进行内置并行化。但是,这不起作用。

使用联系人bnlearn::parallel integration中的示例:

library(parallel)
library(bnlearn)

cl = makeCluster(2)

# check it works.
clusterEvalQ(cl, runif(10))    # -> this works

data(learning.test)
res = gs(learning.test, cluster = cl)

我收到错误"Error in check.cluster(cluster) : cluster is not a valid cluster object."

有人知道如何让这个工作吗?

1 个答案:

答案 0 :(得分:6)

这是一个错误。请将其报告给软件包维护者。

以下是check.cluster的代码:

function (cluster) 
{
    if (is.null(cluster)) 
        return(TRUE)
    if (any(class(cluster) %!in% supported.clusters)) 
        stop("cluster is not a valid cluster object.")
    if (!requireNamespace("parallel")) 
        stop("this function requires the parallel package.")
    if (!isClusterRunning(cluster)) 
        stop("the cluster is stopped.")
}

现在,如果你看一下cl的课程:

class(cl)
#[1] "SOCKcluster" "cluster" 

让我们重现一下检查:

bnlearn:::supported.clusters
#[1] "MPIcluster"  "PVMcluster"  "SOCKcluster"

`%!in%` <- function (x, table) {
  match(x, table, nomatch = 0L) == 0L
}
any(class(cl) %!in% bnlearn:::supported.clusters)
#[1] TRUE

cluster不在supported.clusters中。我相信,该函数应该只检查集群是否有受支持的类,而不是它是否有不受支持的类。

作为一种解决方法,您可以更改supported.clusters

assignInNamespace("supported.clusters", 
                  c("cluster", "MPIcluster",  
                    "PVMcluster", "SOCKcluster"), 
                  "bnlearn")