package bayesGame.separationGame;
import org.apache.commons.collections15.Factory;
import edu.uci.ics.jung.graph.Graph;
import java.util.Collection;
import java.util.List;
import java.util.ArrayList;
public class BooleanNode {
private int id;
private boolean observed = false;
private boolean startNode = false;
private boolean endNode = false;
private boolean currentNode = false;
private boolean reachable = false;
public boolean isCurrentNode() {
return currentNode;
}
public void setCurrentNode(boolean currentNode) {
this.currentNode = currentNode;
}
public boolean isReachable() {
return reachable;
}
public void setReachable(boolean reachable) {
this.reachable = reachable;
}
public BooleanNode(int id){
this.id = id;
}
public BooleanNode(int id, boolean observed){
this.id = id;
this.observed = observed;
}
public String toString(){
return String.valueOf(id);
}
public boolean isStartNode() {
return startNode;
}
public void setStartNode(boolean startNode) {
this.startNode = startNode;
}
public boolean isEndNode() {
return endNode;
}
public void setEndNode(boolean endNode) {
this.endNode = endNode;
}
public int getId() {
return id;
}
public void setObserved(boolean observed) {
this.observed = observed;
}
public boolean getObserved(){
return observed;
}
public boolean equals(Object other){
boolean result = false;
if (other instanceof BooleanNode){
BooleanNode theOther = (BooleanNode)other;
result = (this.id == theOther.id);
}
return result;
}
public int hashCode(){
return id;
}
public static List<BooleanNode> getActiveTrails(Graph g, BooleanNode startNode, List<BooleanNode> observations){
List<BooleanNode> nodesToVisit = new ArrayList<BooleanNode>(observations);
List<BooleanNode> ancestorNodes = new ArrayList<BooleanNode>();
List<BooleanNode> reachableNodes = new ArrayList<BooleanNode>();
// part 1
while (!nodesToVisit.isEmpty()){
BooleanNode node = nodesToVisit.get(0);
nodesToVisit.remove(0);
if (!ancestorNodes.contains(node)){
Collection<BooleanNode> ancestorCollection = g.getPredecessors(node);
nodesToVisit.addAll(ancestorCollection);
} else {
}
ancestorNodes.add(node);
}
List<DirectedPair> directedNodesToVisit = new ArrayList<DirectedPair>();
List<DirectedPair> visitedNodes = new ArrayList<DirectedPair>();
directedNodesToVisit.add(new DirectedPair(startNode, true));
while (!directedNodesToVisit.isEmpty()){
DirectedPair pair = directedNodesToVisit.get(0);
directedNodesToVisit.remove(0);
BooleanNode node = pair.node;
if (!visitedNodes.contains(pair)){
if (!observations.contains(node)){
reachableNodes.add(node);
System.out.println(node + " is reachable");
}
visitedNodes.add(pair);
if (pair.up && !observations.contains(node)){
BooleanNode[] parents = (BooleanNode[]) g.getPredecessors(node).toArray(new BooleanNode[g.getPredecessorCount(node)]);
for (BooleanNode parentNode : parents){
DirectedPair newPair = new DirectedPair(parentNode, true);
directedNodesToVisit.add(newPair);
}
BooleanNode[] children = (BooleanNode[]) g.getSuccessors(node).toArray(new BooleanNode[g.getSuccessorCount(node)]);
for (BooleanNode childNode : children){
DirectedPair newPair = new DirectedPair(childNode, false);
directedNodesToVisit.add(newPair);
}
} else if (!pair.up) {
if (!observations.contains(node)){
BooleanNode[] children = (BooleanNode[]) g.getSuccessors(node).toArray(new BooleanNode[g.getSuccessorCount(node)]);
for (BooleanNode childNode : children){
DirectedPair newPair = new DirectedPair(childNode, false);
directedNodesToVisit.add(newPair);
}
}
if (ancestorNodes.contains(node)){
BooleanNode[] parents = (BooleanNode[]) g.getPredecessors(node).toArray(new BooleanNode[g.getPredecessorCount(node)]);
for (BooleanNode parentNode : parents){
DirectedPair newPair = new DirectedPair(parentNode, true);
directedNodesToVisit.add(newPair);
}
}
}
}
}
return reachableNodes;
}
public static class BooleanNodeFactory implements Factory<BooleanNode>{
private static int nodeCount = 7;
private static BooleanNodeFactory instance = new BooleanNodeFactory();
public BooleanNode create() {
BooleanNode bn = new BooleanNode(nodeCount);
nodeCount++;
return bn;
}
public static BooleanNodeFactory getInstance(){
return instance;
}
}
}