/** * Assign unique ids to decision nodes. * * @param graph * @return the number of different decision nodes */ private int setUniqueDecisionNodeIds(DirectedGraph graph) { int i = 0; for (DecisionNode d : graph.getDecisionNodes()) { d.setUniqueDecisionNodeId(++i); } return i; }
private void printDecisionNodes(DirectedGraph graph, DataOutput out, PrintWriter pw) throws IOException { for (DecisionNode decNode : graph.getDecisionNodes()) { int id = decNode.getUniqueDecisionNodeId(); String nodeDefinition = decNode.getNodeDefinition(); int featureIndex = decNode.getFeatureIndex(); DecisionNode.Type nodeType = decNode.getDecisionNodeType(); if (out != null) { // dump in binary form to output out.writeInt(featureIndex); out.writeInt(nodeType.ordinal()); // Now, questionValue, which depends on nodeType switch (nodeType) { case BinaryByteDecisionNode: out.writeInt(((BinaryByteDecisionNode) decNode).getCriterionValueAsByte()); assert decNode.getNumberOfDaugthers() == 2; break; case BinaryShortDecisionNode: out.writeInt(((BinaryShortDecisionNode) decNode).getCriterionValueAsShort()); assert decNode.getNumberOfDaugthers() == 2; break; case BinaryFloatDecisionNode: out.writeFloat(((BinaryFloatDecisionNode) decNode).getCriterionValueAsFloat()); assert decNode.getNumberOfDaugthers() == 2; break; case ByteDecisionNode: case ShortDecisionNode: out.writeInt(decNode.getNumberOfDaugthers()); } // The child nodes for (int i = 0, n = decNode.getNumberOfDaugthers(); i < n; i++) { Node daughter = decNode.getDaughter(i); if (daughter == null) { out.writeInt(0); } else if (daughter.isDecisionNode()) { int daughterID = ((DecisionNode) daughter).getUniqueDecisionNodeId(); // Mark as decision node: daughterID |= DirectedGraphReader.DECISIONNODE << 30; out.writeInt(daughterID); } else if (daughter.isLeafNode()) { int daughterID = ((LeafNode) daughter).getUniqueLeafId(); // Mark as leaf node: if (daughterID != 0) daughterID |= DirectedGraphReader.LEAFNODE << 30; out.writeInt(daughterID); } else if (daughter.isDirectedGraphNode()) { int daughterID = ((DirectedGraphNode) daughter).getUniqueGraphNodeID(); // Mark as directed graph node: if (daughterID != 0) daughterID |= DirectedGraphReader.DIRECTEDGRAPHNODE << 30; out.writeInt(daughterID); } } } if (pw != null) { // dump to print writer StringBuilder strNode = new StringBuilder("-" + id + " " + nodeDefinition); for (int i = 0, n = decNode.getNumberOfDaugthers(); i < n; i++) { strNode.append(" "); Node daughter = decNode.getDaughter(i); if (daughter == null) { strNode.append("0"); } else if (daughter.isDecisionNode()) { int daughterID = ((DecisionNode) daughter).getUniqueDecisionNodeId(); strNode.append("-").append(daughterID); out.writeInt(daughterID); } else if (daughter.isLeafNode()) { int daughterID = ((LeafNode) daughter).getUniqueLeafId(); if (daughterID == 0) strNode.append("0"); else strNode.append("id").append(daughterID); } else if (daughter.isDirectedGraphNode()) { int daughterID = ((DirectedGraphNode) daughter).getUniqueGraphNodeID(); if (daughterID == 0) strNode.append("0"); else strNode.append("DGN").append(daughterID); } } pw.println(strNode.toString()); } } }