protected void makeBlock(Collection<Arc> members) { ExactBlock<Arc> block = new ExactBlock<>(Generics.newHashSet(members)); for (Arc member : block.getMembers()) { if (member != SINK_NODE) { memberToBlock.put(member, block); } } for (Object o : getSymbols()) { Arc symbol = (Arc) o; addActivePair(new Pair<>(block, symbol)); } }
protected void minimize() { makeInitialBlocks(); while (hasActivePair()) { Pair<ExactBlock<Arc>, ?> activePair = getActivePair(); ExactBlock<Arc> activeBlock = activePair.first(); Object symbol = activePair.second(); Collection<Object> inverseImages = getInverseImages(activeBlock, symbol); Map<ExactBlock<Arc>, Set<Object>> inverseImagesByBlock = sortIntoBlocks(inverseImages); for (ExactBlock<Arc> block : inverseImagesByBlock.keySet()) { if (block == null) { throw new RuntimeException("block was null"); } Collection members = 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 Collection<Object> getInverseImages(ExactBlock<Arc> block, Object symbol) { List<Object> inverseImages = new ArrayList<>(); for (Arc member : block.getMembers()) { Collection<Arc> arcs = null; if (member != SINK_NODE) { arcs = getUnminimizedFA().getArcsByTargetAndInput(member, symbol); } else { arcs = getUnminimizedFA().getArcsByInput(symbol); if (!sparseMode) { arcs = difference(getUnminimizedFA().getArcs(), arcs); } } if (arcs == null) { continue; } for (Arc arc : arcs) { Object source = arc.getSourceNode(); inverseImages.add(source); } } return inverseImages; }
protected Set<Arc> projectNode(Object node) { return getBlock(node).getMembers(); }