package org.societies.context.user.refinement.impl.bayesianLibrary.inference.structures.impl; import java.io.IOException; import java.io.Serializable; import java.io.Writer; import java.util.ArrayList; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.societies.context.user.refinement.impl.bayesianLibrary.inference.structures.interfaces.ConnectingNodes; import org.societies.context.user.refinement.impl.bayesianLibrary.inference.structures.interfaces.HasProbabilityTable; /** * @author fran_ko * */ public class DAG implements Serializable{ /** * default ID for serialization */ private static final long serialVersionUID = 1L; private static Logger logger = LoggerFactory.getLogger(DAG.class); private ArrayList<HasProbabilityTable> nodesSet; private ArrayList<ConnectingNodes> edgesSet; private String name; private boolean debug=false; public DAG(ArrayList<HasProbabilityTable> nodes, ArrayList<ConnectingNodes> edges){ nodesSet = nodes; edgesSet = edges; name = getNodes().toString(); } /** * Constructor for Bayeslets * */ public DAG() { nodesSet = new ArrayList<HasProbabilityTable>(); edgesSet = new ArrayList<ConnectingNodes>(); } public void addNode(Node n) { nodesSet.add(n); } public void addEdge(UndirectedEdge e){ edgesSet.add(e); e.getBorder2().updateProbTable(this); } public void removeEdge(Edge e){ edgesSet.remove(e); e.getTarget().updateProbTable(this); e.getTarget().removeIncoming(e); e.getSource().removeOutgoing(e); } public void removeNode(Node n) { nodesSet.remove(n); for(int i=0; i<edgesSet.size();i++){ Edge e = (Edge)edgesSet.get(i); if (e.getSource() == n || e.getTarget() == n) removeEdge(e); } } public Node[] getNodes(){ return nodesSet.toArray(new Node[0]); } public Edge[] getEdges(){ return edgesSet.toArray(new Edge[0]); } public String toString(){ String part1 = ""; if(logger.isDebugEnabled()) logger.debug("DAG:toString - Entered"); if(logger.isDebugEnabled()) logger.debug("DAG:toString - nodeSetsize="+nodesSet.size()); for(int i=0; i<nodesSet.size();i++){ Node n = (Node)nodesSet.get(i); part1+=n.getName()+"\t"; //DEBUG if(logger.isDebugEnabled()) logger.debug("Prob-TableLength of Node "+n+"="+n.getProbTable().getProbabilities().length); //if(n.getName().equals("f1")) privatString(n); } part1+="\n\n"; String part2=""; if(logger.isDebugEnabled()) logger.debug("DAG:toString - edgesSetsize="+edgesSet.size()); for(int i=0; i<edgesSet.size();i++){ Edge e = (Edge)edgesSet.get(i); part2+=e+"\n"; } part2+="\n\n"; String part3=""; if(logger.isDebugEnabled()) logger.debug("DAG:toString - nodeSetsize="+nodesSet.size()); for(int i=0; i<nodesSet.size();i++){ if(logger.isDebugEnabled()) logger.debug("DAG:toString - inProbTablePrinting Runthrough="+i+" Node="+nodesSet.get(i)); Node n = (Node)nodesSet.get(i); part3+=n.getProbTable()+"\n"; if(logger.isDebugEnabled()) logger.debug("DAG:toString - inProbTablePrinting End of Runthrough="+i); } if(debug) System.out.println("DAG:toString - Left"); return part1+part2+part3; } public void printToFile(Writer fw) throws IOException{ String part1 = ""; for(int i=0; i<nodesSet.size();i++){ Node n = (Node)nodesSet.get(i); part1+=n.getName()+"\t Number of States: "+n.countStates()+"\t Length of Probability Table: "+n.getProbTable().getProbabilities().length+"\n"; //DEBUG if(logger.isDebugEnabled()) logger.debug("Prob-TableLength of Node "+n+"="+n.getProbTable().getProbabilities().length); } part1+="\n\n"; String part2=""; for(int i=0; i<edgesSet.size();i++){ Edge e = (Edge)edgesSet.get(i); part2+=e+"\n"; } fw.write(part1+part2); fw.flush(); } public String getName() { return name; } public ArrayList<HasProbabilityTable> getNodesArrayList() { return nodesSet; } public ArrayList<ConnectingNodes> getEdgesArrayList() { return edgesSet; } }