Structural learning in R

source("bayesserver.R")

# Manually construct a network to keep the example simple.
createNetworkNoLinks <- function() {
  network <- new(Network)
  
  # Instead of manually constructing a network
  # you could also load from a file using
  # network$load("path-to-file")
  
  for (name in c("A", "B", "C"))
  {
    node = new(Node, name, c("False", "True"))
    network$getNodes()$add(node)
  }
  
  # We are not adding links here, as we are going to learn them from data.
  
  return(network)
}

# Manually creating a data frame here,
# but you could also create a data frame from a file or database
# or you could use DatabaseDataReader to connect Bayes Server directly to a database
# by-passing the creation of a data frame

da = c("True",  "True",     "True",     "False",    "False",    "False",    "False",    "True",     "True",     "True",     "True",     "False",    "True",     "True",     "False",    "True",     "False",    "False",    "True",     "False",    "False",    "True",     "False",    "True",     "False",    "True",     "False",    "False",    "True",     "False",    "True",     "False",    "True",     "True",     "True",     "True",     "True",     "True",     "False",    "True",     "True",     "False",    "True",     "False",    "False",    "True",     "True",     "True",     "False",    "True",     "True",     "True",     "True",     "True",     "True",     "True",     "True",     "True",     "False",    "True",     "False",    "False",    "True",     "False",    "True",     "False",    "False",    "True",     "False",    "False",    "True",     "True",     "False",    "False",    "True",     "True",     "True",     "False",    "True",     "False",    "True",     "True",     "True",     "True",     "False",    "True",     "True",     "False",    "True",     "True",     "True",     "False",    "False",    "True",     "True",     "True",     "True",     "False",    "True",     "True" ) 
db = c("False",     "True",     "False",    "False",    "True",     "False",    "True",     "False",    "True",     "False",    "False",    "True",     "True",     "True",     "False",    "False",    "True",     "False",    "False",    "True",     "False",    "False",    "False",    "True",     "False",    "False",    "False",    "False",    "True",     "False",    "False",    "False",    "False",    "False",    "False",    "True",     "True",     "False",    "False",    "False",    "True",     "True",     "False",    "False",    "False",    "False",    "True",     "False",    "False",    "True",     "True",     "True",     "False",    "False",    "False",    "False",    "False",    "False",    "False",    "False",    "True",     "False",    "True",     "True",     "True",     "True",     "False",    "True",     "False",    "False",    "True",     "False",    "False",    "False",    "False",    "False",    "True",     "True",     "False",    "True",     "True",     "True",     "True",     "False",    "True",     "False",    "False",    "False",    "False",    "False",    "True",     "False",    "True",     "False",    "False",    "True",     "True",     "True",     "True",     "False") 
dc = c("True",  "True",     "True",     "False",    "True",     "False",    "True",     "True",     "True",     "True",     "True",     "True",     "True",     "True",     "False",    "True",     "True",     "False",    "True",     "True",     "False",    "True",     "False",    "True",     "False",    "True",     "False",    "False",    "True",     "False",    "True",     "False",    "True",     "True",     "True",     "True",     "True",     "True",     "False",    "True",     "True",     "True",     "True",     "False",    "False",    "True",     "True",     "True",     "False",    "True",     "True",     "True",     "True",     "True",     "True",     "True",     "True",     "True",     "False",    "True",     "True",     "False",    "True",     "True",     "True",     "True",     "False",    "True",     "False",    "False",    "True",     "True",     "False",    "False",    "True",     "True",     "True",     "True",     "True",     "True",     "True",     "True",     "True",     "True",     "True",     "True",     "True",     "False",    "True",     "True",     "True",     "False",    "True",     "True",     "True",     "True",     "True",     "True",     "True",     "True") 
df = data.frame(A=da, B=db, C=dc)       # df is a data frame


network <- createNetworkNoLinks()  # we manually construct the network here, but it could be loaded from a file

learning = new(PCStructuralLearning)

dataTable <- toDataTable(df)

dataReaderCommand <- new(DataTableDataReaderCommand, dataTable)

variableReferences = lapply(network$getVariables(), function(v) {
  return(new(VariableReference, v, ColumnValueType$NAME, v$getName()))
})

evidenceReaderCommand <- new(
  DefaultEvidenceReaderCommand,
  dataReaderCommand,
  toVariableReferenceList(variableReferences),
  new(ReaderOptions)
)

options <- new(PCStructuralLearningOptions)

output <- learning$learn(evidenceReaderCommand, network$getNodes(), options)