package hex.genmodel.algos.tree; import java.io.PrintStream; import java.util.ArrayList; /** * Subgraph for representing a tree. * A subgraph contains nodes. */ class SharedTreeSubgraph { private final int subgraphNumber; private final String name; private SharedTreeNode rootNode; // Even though all the nodes are reachable from rootNode, keep a second handy list of nodes. // For some bookkeeping tasks. private ArrayList<SharedTreeNode> nodesArray; /** * Create a new tree object. * @param sn Tree number * @param n Tree name */ SharedTreeSubgraph(int sn, String n) { subgraphNumber = sn; name = n; nodesArray = new ArrayList<>(); } /** * Make the root node in the tree. * @return The node */ SharedTreeNode makeRootNode() { SharedTreeNode n = new SharedTreeNode(null, subgraphNumber, 0); n.setInclusiveNa(true); nodesArray.add(n); rootNode = n; return n; } /** * Make the left child of a node. * @param parent Parent node * @return The new child node */ SharedTreeNode makeLeftChildNode(SharedTreeNode parent) { SharedTreeNode child = new SharedTreeNode(parent, subgraphNumber, parent.getDepth() + 1); nodesArray.add(child); makeLeftEdge(parent, child); return child; } /** * Make the right child of a node. * @param parent Parent node * @return The new child node */ SharedTreeNode makeRightChildNode(SharedTreeNode parent) { SharedTreeNode child = new SharedTreeNode(parent, subgraphNumber, parent.getDepth() + 1); nodesArray.add(child); makeRightEdge(parent, child); return child; } private void makeLeftEdge(SharedTreeNode parent, SharedTreeNode child) { parent.setLeftChild(child); } private void makeRightEdge(SharedTreeNode parent, SharedTreeNode child) { parent.setRightChild(child); } void print() { System.out.println(""); System.out.println(" ----- " + name + " -----"); System.out.println(" Nodes"); for (SharedTreeNode n : nodesArray) { n.print(); } System.out.println(""); System.out.println(" Edges"); rootNode.printEdges(); } void printDot(PrintStream os, int maxLevelsToPrintPerEdge, boolean detail, String optionalTitle) { os.println(""); os.println("subgraph " + "cluster_" + subgraphNumber + " {"); os.println("/* Nodes */"); int maxLevel = -1; for (SharedTreeNode n : nodesArray) { if (n.getDepth() > maxLevel) { maxLevel = n.getDepth(); } } for (int level = 0; level <= maxLevel; level++) { os.println(""); os.println("/* Level " + level + " */"); os.println("{"); rootNode.printDotNodesAtLevel(os, level, detail); os.println("}"); } os.println(""); os.println("/* Edges */"); for (SharedTreeNode n : nodesArray) { n.printDotEdges(os, maxLevelsToPrintPerEdge); } os.println(""); os.println("fontsize=40"); String title = SharedTreeNode.escapeQuotes((optionalTitle != null) ? optionalTitle : name); os.println("label=\"" + title + "\""); os.println("}"); } }