+ private Set<HNode> removeTransitivelyReachToNode(Descriptor desc, HNode startNode,
+ Set<HNode> endNodeSet) {
+
+ // if an end node is not directly connected to the start node in the SC graph
+ // replace it with a directly connected one which transitively reaches to it.
+
+ HierarchyGraph scGraph = infer.getSkeletonCombinationHierarchyGraph(desc);
+ Set<HNode> newEndNodeSet = new HashSet<HNode>();
+
+ for (Iterator iterator = endNodeSet.iterator(); iterator.hasNext();) {
+ HNode endNode = (HNode) iterator.next();
+ if (scGraph.isDirectlyConnectedTo(startNode, endNode)) {
+ newEndNodeSet.add(endNode);
+ } else {
+ HNode newEndNode =
+ getDirectlyReachableNodeFromStartNodeReachToEndNode(scGraph, startNode, endNode);
+ System.out.println("#### old END NODE=" + endNode + " --->" + newEndNode);
+ newEndNodeSet.add(newEndNode);
+ }
+ }
+
+ System.out.println("removeTransitivelyReachToNode=" + endNodeSet + " newSet=" + newEndNodeSet);
+
+ return newEndNodeSet;
+
+ }
+
+ private HNode getDirectlyReachableNodeFromStartNodeReachToEndNode(HierarchyGraph scGraph,
+ HNode startNode, HNode endNode) {
+ Set<HNode> connected = new HashSet<HNode>();
+ recurDirectlyReachableNodeFromStartNodeReachToEndNode(scGraph, startNode, endNode, connected);
+ return connected.iterator().next();
+ }
+
+ private void recurDirectlyReachableNodeFromStartNodeReachToEndNode(HierarchyGraph scGraph,
+ HNode startNode, HNode curNode, Set<HNode> connected) {
+
+ Set<HNode> inNodeSet = scGraph.getIncomingNodeSet(curNode);
+ for (Iterator iterator = inNodeSet.iterator(); iterator.hasNext();) {
+ HNode inNode = (HNode) iterator.next();
+ if (inNode.equals(startNode)) {
+ connected.add(curNode);
+ } else {
+ System.out.println("inNode=" + inNode);
+ recurDirectlyReachableNodeFromStartNodeReachToEndNode(scGraph, startNode, inNode, connected);
+ }
+ }
+
+ }
+