AutomatonMinimizer minimizer = new FastExactAutomatonMinimizer(); TransducerGraph.NodeProcessor ntsp = new TransducerGraph.SetToStringNodeProcessor(new PennTreebankLanguagePack()); TransducerGraph.ArcProcessor isp = new TransducerGraph.InputSplittingProcessor();
protected void addSplits(Block block) { Map symbolToTarget = new HashMap(); for (Object member : block.getMembers()) { for (Object o : getInverseArcs(member)) { TransducerGraph.Arc arc = (TransducerGraph.Arc) o; Object symbol = arc.getInput(); Object target = arc.getTargetNode(); Maps.putIntoValueArrayList(symbolToTarget, symbol, target); } } for (Object symbol : symbolToTarget.keySet()) { addSplit(new Split((List) symbolToTarget.get(symbol), symbol, block)); } }
protected void makeBlock(Collection members) { Block block = new Block(new HashSet(members)); for (Object member : block.getMembers()) { if (member != SINK_NODE) { // System.out.println("putting in memberToBlock: " + member + " " + block); memberToBlock.put(member, block); } } addSplits(block); }
public TransducerGraph minimizeFA(TransducerGraph unminimizedFA) { // System.out.println(unminimizedFA); this.unminimizedFA = unminimizedFA; this.splits = new LinkedList(); this.memberToBlock = new HashMap(); //new IdentityHashMap(); // TEG: I had to change this b/c some weren't matching minimize(); return buildMinimizedFA(); }
protected void makeInitialBlocks() { // sink block (for if the automaton isn't complete makeBlock(Collections.singleton(SINK_NODE)); // accepting block Set endNodes = getUnminimizedFA().getEndNodes(); makeBlock(endNodes); // main block Collection nonFinalNodes = new HashSet(getUnminimizedFA().getNodes()); nonFinalNodes.removeAll(endNodes); makeBlock(nonFinalNodes); }
protected void minimize() { makeInitialBlocks(); while (hasSplit()) { Split split = getSplit(); Collection inverseImages = getInverseImages(split); Map inverseImagesByBlock = sortIntoBlocks(inverseImages); for (Object o : inverseImagesByBlock.keySet()) { Block block = (Block) o; Collection members = (Collection) inverseImagesByBlock.get(block); if (members.size() == 0 || members.size() == block.getMembers().size()) { continue; } if (members.size() > block.getMembers().size() - members.size()) { members = difference(block.getMembers(), members); } removeAll(block.getMembers(), members); makeBlock(members); } } }
protected TransducerGraph buildMinimizedFA() { TransducerGraph minimizedFA = new TransducerGraph(); TransducerGraph unminimizedFA = getUnminimizedFA(); for (TransducerGraph.Arc arc : unminimizedFA.getArcs()) { Object source = projectNode(arc.getSourceNode()); Object target = projectNode(arc.getTargetNode()); try { if (minimizedFA.canAddArc(source, target, arc.getInput(), arc.getOutput())) { minimizedFA.addArc(source, target, arc.getInput(), arc.getOutput()); } } catch (Exception e) { //throw new IllegalArgumentException(); } } minimizedFA.setStartNode(projectNode(unminimizedFA.getStartNode())); for (Object o : unminimizedFA.getEndNodes()) { minimizedFA.setEndNode(projectNode(o)); } return minimizedFA; }
protected Collection getInverseArcs(Object member, Object symbol) { if (member != SINK_NODE) { return getUnminimizedFA().getArcsByTargetAndInput(member, symbol); } return getUnminimizedFA().getArcsByInput(symbol); }
protected Map sortIntoBlocks(Collection nodes) { Map blockToMembers = new IdentityHashMap(); for (Object o : nodes) { Block block = getBlock(o); Maps.putIntoValueHashSet(blockToMembers, block, o); } return blockToMembers; }
protected Collection getInverseImages(Split split) { List inverseImages = new ArrayList(); Object symbol = split.getSymbol(); Block block = split.getBlock(); for (Object member : split.getMembers()) { if (!block.getMembers().contains(member)) { continue; } Collection arcs = getInverseArcs(member, symbol); for (Object arc1 : arcs) { TransducerGraph.Arc arc = (TransducerGraph.Arc) arc1; Object source = arc.getSourceNode(); inverseImages.add(source); } } return inverseImages; }
protected void minimize() { makeInitialBlocks(); while (hasSplit()) { Split split = getSplit(); Collection inverseImages = getInverseImages(split); Map inverseImagesByBlock = sortIntoBlocks(inverseImages); for (Object o : inverseImagesByBlock.keySet()) { Block block = (Block) o; Collection members = (Collection) inverseImagesByBlock.get(block); if (members.size() == 0 || members.size() == block.getMembers().size()) { continue; } if (members.size() > block.getMembers().size() - members.size()) { members = difference(block.getMembers(), members); } removeAll(block.getMembers(), members); makeBlock(members); } } }
protected void makeInitialBlocks() { // sink block (for if the automaton isn't complete makeBlock(Collections.singleton(SINK_NODE)); // accepting block Set endNodes = getUnminimizedFA().getEndNodes(); makeBlock(endNodes); // main block Collection nonFinalNodes = new HashSet(getUnminimizedFA().getNodes()); nonFinalNodes.removeAll(endNodes); makeBlock(nonFinalNodes); }
public TransducerGraph minimizeFA(TransducerGraph unminimizedFA) { // System.out.println(unminimizedFA); this.unminimizedFA = unminimizedFA; this.splits = new LinkedList(); this.memberToBlock = new HashMap(); //new IdentityHashMap(); // TEG: I had to change this b/c some weren't matching minimize(); return buildMinimizedFA(); }
protected TransducerGraph buildMinimizedFA() { TransducerGraph minimizedFA = new TransducerGraph(); TransducerGraph unminimizedFA = getUnminimizedFA(); for (Iterator arcI = unminimizedFA.getArcs().iterator(); arcI.hasNext();) { TransducerGraph.Arc arc = (TransducerGraph.Arc) arcI.next(); Object source = projectNode(arc.getSourceNode()); Object target = projectNode(arc.getTargetNode()); try { if (minimizedFA.canAddArc(source, target, arc.getInput(), arc.getOutput())) { minimizedFA.addArc(source, target, arc.getInput(), arc.getOutput()); } } catch (Exception e) { //throw new IllegalArgumentException(); } } minimizedFA.setStartNode(projectNode(unminimizedFA.getStartNode())); for (Iterator endIter = unminimizedFA.getEndNodes().iterator(); endIter.hasNext();) { Object o = endIter.next(); minimizedFA.setEndNode(projectNode(o)); } return minimizedFA; }
protected Collection getInverseArcs(Object member) { if (member != SINK_NODE) { return getUnminimizedFA().getArcsByTarget(member); } return getUnminimizedFA().getArcs(); }
protected Object projectNode(Object node) { Set members = getBlock(node).getMembers(); return members; }
protected Collection getInverseImages(Split split) { List inverseImages = new ArrayList(); Object symbol = split.getSymbol(); Block block = split.getBlock(); for (Iterator memberI = split.getMembers().iterator(); memberI.hasNext();) { Object member = memberI.next(); if (!block.getMembers().contains(member)) { continue; } Collection arcs = getInverseArcs(member, symbol); for (Iterator arcI = arcs.iterator(); arcI.hasNext();) { TransducerGraph.Arc arc = (TransducerGraph.Arc) arcI.next(); Object source = arc.getSourceNode(); inverseImages.add(source); } } return inverseImages; }
protected void minimize() { makeInitialBlocks(); while (hasSplit()) { Split split = getSplit(); Collection inverseImages = getInverseImages(split); Map inverseImagesByBlock = sortIntoBlocks(inverseImages); for (Object o : inverseImagesByBlock.keySet()) { Block block = (Block) o; Collection members = (Collection) inverseImagesByBlock.get(block); if (members.size() == 0 || members.size() == block.getMembers().size()) { continue; } if (members.size() > block.getMembers().size() - members.size()) { members = difference(block.getMembers(), members); } removeAll(block.getMembers(), members); makeBlock(members); } } }
protected void makeInitialBlocks() { // sink block (for if the automaton isn't complete makeBlock(Collections.singleton(SINK_NODE)); // accepting block Set endNodes = getUnminimizedFA().getEndNodes(); makeBlock(endNodes); // main block Collection nonFinalNodes = new HashSet(getUnminimizedFA().getNodes()); nonFinalNodes.removeAll(endNodes); makeBlock(nonFinalNodes); }
public TransducerGraph minimizeFA(TransducerGraph unminimizedFA) { // System.out.println(unminimizedFA); this.unminimizedFA = unminimizedFA; this.splits = new LinkedList(); this.memberToBlock = new HashMap(); //new IdentityHashMap(); // TEG: I had to change this b/c some weren't matching minimize(); return buildMinimizedFA(); }