package aima.core.probability.bayes.impl;
import java.util.ArrayList;
import java.util.LinkedHashMap;
import java.util.LinkedHashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;
import aima.core.probability.RandomVariable;
import aima.core.probability.bayes.BayesianNetwork;
import aima.core.probability.bayes.DynamicBayesianNetwork;
import aima.core.probability.bayes.Node;
import aima.core.util.SetOps;
/**
* Default implementation of the DynamicBayesianNetwork interface.
*
* @author Ciaran O'Reilly
*/
public class DynamicBayesNet extends BayesNet implements DynamicBayesianNetwork {
private Set<RandomVariable> X_0 = new LinkedHashSet<RandomVariable>();
private Set<RandomVariable> X_1 = new LinkedHashSet<RandomVariable>();
private Set<RandomVariable> E_1 = new LinkedHashSet<RandomVariable>();
private Map<RandomVariable, RandomVariable> X_0_to_X_1 = new LinkedHashMap<RandomVariable, RandomVariable>();
private Map<RandomVariable, RandomVariable> X_1_to_X_0 = new LinkedHashMap<RandomVariable, RandomVariable>();
private BayesianNetwork priorNetwork = null;
private List<RandomVariable> X_1_VariablesInTopologicalOrder = new ArrayList<RandomVariable>();
public DynamicBayesNet(BayesianNetwork priorNetwork,
Map<RandomVariable, RandomVariable> X_0_to_X_1,
Set<RandomVariable> E_1, Node... rootNodes) {
super(rootNodes);
for (Map.Entry<RandomVariable, RandomVariable> x0_x1 : X_0_to_X_1
.entrySet()) {
RandomVariable x0 = x0_x1.getKey();
RandomVariable x1 = x0_x1.getValue();
this.X_0.add(x0);
this.X_1.add(x1);
this.X_0_to_X_1.put(x0, x1);
this.X_1_to_X_0.put(x1, x0);
}
this.E_1.addAll(E_1);
// Assert the X_0, X_1, and E_1 sets are of expected sizes
Set<RandomVariable> combined = new LinkedHashSet<RandomVariable>();
combined.addAll(X_0);
combined.addAll(X_1);
combined.addAll(E_1);
if (SetOps.difference(varToNodeMap.keySet(), combined).size() != 0) {
throw new IllegalArgumentException(
"X_0, X_1, and E_1 do not map correctly to the Nodes describing this Dynamic Bayesian Network.");
}
this.priorNetwork = priorNetwork;
X_1_VariablesInTopologicalOrder
.addAll(getVariablesInTopologicalOrder());
X_1_VariablesInTopologicalOrder.removeAll(X_0);
X_1_VariablesInTopologicalOrder.removeAll(E_1);
}
//
// START-DynamicBayesianNetwork
@Override
public BayesianNetwork getPriorNetwork() {
return priorNetwork;
}
@Override
public Set<RandomVariable> getX_0() {
return X_0;
}
@Override
public Set<RandomVariable> getX_1() {
return X_1;
}
@Override
public List<RandomVariable> getX_1_VariablesInTopologicalOrder() {
return X_1_VariablesInTopologicalOrder;
}
@Override
public Map<RandomVariable, RandomVariable> getX_0_to_X_1() {
return X_0_to_X_1;
}
@Override
public Map<RandomVariable, RandomVariable> getX_1_to_X_0() {
return X_1_to_X_0;
}
@Override
public Set<RandomVariable> getE_1() {
return E_1;
}
// END-DynamicBayesianNetwork
//
//
// PRIVATE METHODS
//
}