Search in sources :

Example 11 with VariableNode

use of IncrementalAnytimeExactBeliefPropagation.Model.Node.VariableNode in project aic-expresso by aic-sri-international.

the class PartitionTree method createPartitionTreeWithBFS.

/*------------------------------------------------------------------------------------------------------------------------*/
/**
 * This class creates a partition based on a BFS process.
 *
 * There are various ways to create the partition tree.
 *
 * In fact any partition tree will provide an exact inference. But some of them will
 * generate so many separator variables (or cutset variables) that the inference time
 * can be close to the Naive computation.
 *
 * The study of the complexity of choosing the optimal tree (or a good heuristic)
 * still needs to be done in the project. (TODO)
 *
 * The choice of a BFS seems intuitively good because it distributes the nodes more or less
 * evenly among the partitions
 *
 * @param model
 */
public void createPartitionTreeWithBFS(Model model) {
    HashMap<Node, PartitionTree> hashTable = new HashMap<>();
    Set<Node> visited = new HashSet<>();
    Queue<Node> queue = new LinkedList<>();
    visited.add(node);
    queue.add(node);
    hashTable.put(this.node, this);
    while (!queue.isEmpty()) {
        Node n = queue.remove();
        PartitionTree parentPartition = hashTable.get(n);
        Set<Node> neighbors = new HashSet<>();
        if (n.isFactor()) {
            Collection<VariableNode> variableNeighbors = model.getExploredGraph().getAsOfB((FactorNode) n);
            neighbors.addAll(variableNeighbors);
        } else {
            Collection<FactorNode> factorNeighbors = model.getExploredGraph().getBsOfA((VariableNode) n);
            neighbors.addAll(factorNeighbors);
        }
        for (Node neighbor : neighbors) {
            if (!visited.contains(neighbor)) {
                queue.add(neighbor);
                visited.add(neighbor);
                PartitionTree pChild = new PartitionTree(neighbor);
                pChild.parent = parentPartition;
                hashTable.put(neighbor, pChild);
                parentPartition.children.add(pChild);
            }
        }
    }
}
Also used : VariableNode(IncrementalAnytimeExactBeliefPropagation.Model.Node.VariableNode) HashMap(java.util.HashMap) Node(IncrementalAnytimeExactBeliefPropagation.Model.Node.Node) FactorNode(IncrementalAnytimeExactBeliefPropagation.Model.Node.FactorNode) VariableNode(IncrementalAnytimeExactBeliefPropagation.Model.Node.VariableNode) LinkedList(java.util.LinkedList) FactorNode(IncrementalAnytimeExactBeliefPropagation.Model.Node.FactorNode) HashSet(java.util.HashSet)

Aggregations

VariableNode (IncrementalAnytimeExactBeliefPropagation.Model.Node.VariableNode)11 Expression (com.sri.ai.expresso.api.Expression)6 HashSet (java.util.HashSet)6 FactorNode (IncrementalAnytimeExactBeliefPropagation.Model.Node.FactorNode)5 DefaultExtensionalMultiSet (com.sri.ai.expresso.core.DefaultExtensionalMultiSet)5 Bound (com.sri.ai.grinder.library.bounds.Bound)5 ArrayList (java.util.ArrayList)5 Set (java.util.Set)3 Node (IncrementalAnytimeExactBeliefPropagation.Model.Node.Node)1 PartitionTree (IncrementalAnytimeExactBeliefPropagation.PartitionTree)1 HashMap (java.util.HashMap)1 LinkedList (java.util.LinkedList)1 NoSuchElementException (java.util.NoSuchElementException)1