public SchematicMiniBucket(BeliefNetworkEx bn, int bound) { this.bn = bn; bucketMap = new HashMap<BeliefNode, Bucket>(); // order the variables from X_1 to X_n BeliefNode[] nodes = bn.bn.getNodes(); int[] topOrder = bn.getTopologicalOrder(); // place each CPT in the bucket of the highest index for (int i = topOrder.length - 1; i > -1; i--) { Bucket bucket = new Bucket(nodes[topOrder[i]]); int[] cpt = bn.getDomainProductNodeIndices(nodes[topOrder[i]]); HashSet<BeliefNode> cptNodes = new HashSet<BeliefNode>(); for (int j : cpt) { cptNodes.add(nodes[j]); } BucketVar bv = new BucketVar(cptNodes); bv.setFunction(nodes[topOrder[i]].getCPF()); bucket.addVar(bv); bucketMap.put(nodes[topOrder[i]], bucket); } // partition buckets and create arcs for (int i = topOrder.length - 1; i > -1; i--) { Bucket oldVar = bucketMap.get(nodes[topOrder[i]]); oldVar.partition(bound); HashSet<BucketVar> scopes = oldVar.createScopeFunctions(); for (BucketVar bv : scopes) { // add new variables to the bucket with the highest index BeliefNode node = bv.getMaxNode(bn); bucketMap.get(node).addVar(bv); } } }