public void Merge() { Queue<SemiTagNode> openlist = new LinkedList<SemiTagNode>(); for (SemiTagNode n : allnodes) { if (n.IsLowerIncomplete()) { openlist.add(n); } } while (!openlist.isEmpty()) { SemiTagNode head = openlist.poll(); // merge to successors for (SemiTagEdge oe : head.outegdes) { SemiTagNode t = oe.target; // if(t.IsComplete() || t.IsLowerIncomplete()) // throw new Error("the tag is // illegal"+head.Value.getFiniteStrings()+"+++"+t.Value.getFiniteStrings()); SemiTagNode nn = new SemiTagNode(); nn.sigs.addAll(head.sigs); nn.sigs.addAll(t.sigs); nn.Value = head.Value.concatenate(t.Value); nn.setStatus(); // set the relationship to predecessors; for (SemiTagEdge ie : head.inegdes) { SemiTagEdge nie = new SemiTagEdge(ie.source, nn, ie.methodsig); ie.source.outegdes.remove(ie); ie.source.outegdes.add(nie); nn.inegdes.add(nie); nn.inegdes.remove(ie); } // set the relationship to successors; for (SemiTagEdge toe : t.outegdes) { SemiTagEdge noe = new SemiTagEdge(nn, toe.target, toe.methodsig); toe.target.inegdes.remove(toe); toe.target.inegdes.add(noe); nn.outegdes.add(noe); nn.outegdes.remove(toe); } allnodes.add(nn); if (heads.contains(head)) heads.add(nn); if (tails.contains(t)) tails.add(nn); if (!nn.IsComplete()) openlist.add(nn); allnodes.remove(t); heads.remove(t); tails.remove(t); // if(!nn.IsComplete()) // openlist.add(nn); } allnodes.remove(head); heads.remove(head); tails.remove(head); } }
public SemiTagTree clone() { SemiTagTree newtree = new SemiTagTree(); Hashtable<SemiTagNode, SemiTagNode> dup = new Hashtable<SemiTagNode, SemiTagNode>(); for (SemiTagNode hn : allnodes) dup.put(hn, new SemiTagNode()); for (SemiTagNode hn : allnodes) { SemiTagNode shadow = dup.get(hn); for (SemiTagEdge p : hn.inegdes) shadow.inegdes.add(new SemiTagEdge(dup.get(p.source), dup.get(p.target), p.methodsig)); for (SemiTagEdge s : hn.outegdes) shadow.outegdes.add(new SemiTagEdge(dup.get(s.source), dup.get(s.target), s.methodsig)); shadow.Value = hn.Value.clone(); shadow.status = hn.status; shadow.gene = hn.gene; shadow.sigs = hn.sigs; } for (SemiTagNode hn : heads) newtree.heads.add(dup.get(hn)); for (SemiTagNode hn : tails) newtree.tails.add(dup.get(hn)); for (SemiTagNode hn : allnodes) newtree.allnodes.add(dup.get(hn)); return newtree; }