internal FA SynthesizeOneOrNone(FA synth) { FA tempFA = new FA(); //2.Merge graph CGraph.CMergeGraphOperation merged = tempFA.Merge(synth, CGraph.CMergeGraphOperation.MergeOptions.MO_DEFAULT); merged.MergeGraphInfo(synth, GraphElementType.ET_EDGE, FA.m_FAINFOKEY); merged.MergeGraphInfo(synth, GraphElementType.ET_GRAPH, FA.m_FAINFOKEY); merged.MergeGraphInfo(synth, GraphElementType.ET_NODE, FA.m_FAINFOKEY); CGraphNode il = tempFA.CreateGraphNode <CGraphNode>(); tempFA.AddGraphEdge <CGraphEdge, CGraphNode>(il, merged.GetMirrorNode(synth.M_Initial), GraphType.GT_DIRECTED); CGraphNode fl = tempFA.CreateGraphNode <CGraphNode>(); tempFA.AddGraphEdge <CGraphEdge, CGraphNode>(merged.GetMirrorNode(synth.GetFinalStates()[0]), fl, GraphType.GT_DIRECTED); //4.Create the initial and the final node tempFA.M_Initial = il; tempFA.SetFinalState(fl); tempFA.UpdateAlphabet(); tempFA.AddGraphEdge <CGraphEdge, CGraphNode>(il, fl, GraphType.GT_DIRECTED); //7.Return result return(tempFA); }
private FA CreateNewFA(FA synth) { CGraphNode oldEntryNode, oldExitNode; FA m_currentFA = new FA(); m_ThompsonInfo = new ThompsonInfo(m_currentFA, m_ThompsonInfoKey); m_ThompsonInfo.InitFAInfo(new ThompsonFAInfo()); //2.Merge graph m_mergeOperation = m_currentFA.Merge(synth, CGraph.CMergeGraphOperation.MergeOptions.MO_DEFAULT); m_mergeOperation.MergeGraphInfo(synth, GraphElementType.ET_EDGE, FA.m_FAINFOKEY); m_mergeOperation.MergeGraphInfo(synth, GraphElementType.ET_GRAPH, FA.m_FAINFOKEY); m_mergeOperation.MergeGraphInfo(synth, GraphElementType.ET_NODE, FA.m_FAINFOKEY); m_mergeOperation.MergeGraphInfo(synth, GraphElementType.ET_EDGE, m_ThompsonInfoKey); m_mergeOperation.MergeGraphInfo(synth, GraphElementType.ET_GRAPH, m_ThompsonInfoKey); m_mergeOperation.MergeGraphInfo(synth, GraphElementType.ET_NODE, m_ThompsonInfoKey); // Create boundary nodes m_newFASource = m_currentFA.CreateGraphNode <CGraphNode>(); m_ThompsonInfo.InitNodeInfo(m_newFASource, new ThompsonNodeFAInfo()); m_currentFA.AddGraphEdge <CGraphEdge, CGraphNode>(m_newFASource, m_mergeOperation.GetMirrorNode(synth.M_Initial), GraphType.GT_DIRECTED); m_newFATarget = m_currentFA.CreateGraphNode <CGraphNode>(); m_ThompsonInfo.InitNodeInfo(m_newFATarget, new ThompsonNodeFAInfo()); m_currentFA.AddGraphEdge <CGraphEdge, CGraphNode>(m_mergeOperation.GetMirrorNode(synth.GetFinalStates()[0]), m_newFATarget, GraphType.GT_DIRECTED); //4.Create the initial and the final node oldEntryNode = m_mergeOperation.GetMirrorNode(synth.M_Initial); oldExitNode = m_mergeOperation.GetMirrorNode(synth.GetFinalStates()[0]); m_currentFA.M_Initial = m_newFASource; m_currentFA.SetFinalState(m_newFATarget); m_currentFA.UpdateAlphabet(); // Update closure information from operand closure FAInfo currentFAInfo = UpdateClosureInformation(synth, m_currentFA, m_mergeOperation); // Update closure information from current closure m_currentFAloop = new FALoop(); m_currentFAloop.MEntryNode = oldEntryNode; m_currentFAloop.MExitNode = oldExitNode; m_currentFAloop.MLoopSerial = m_currentClosureSerial; CIt_GraphNodes it = new CIt_GraphNodes(m_currentFA); for (it.Begin(); !it.End(); it.Next()) { if (it.M_CurrentItem != m_currentFA.M_Initial && it.M_CurrentItem != m_currentFA.GetFinalStates()[0]) { m_currentFAloop.MParticipatingNodes.Add(it.M_CurrentItem); } } // Add new closure to the current FA currentFAInfo.AddFALoop(m_currentFAloop); return(m_currentFA); }
internal FA Sythesize(FA l, FA r, CGraph.CMergeGraphOperation.MergeOptions options) { //1.Create FA m_currentFA = new FA(); m_ThompsonInfo = new ThompsonInfo(m_currentFA, m_ThompsonInfoKey); //2.Merge left graph CGraph.CMergeGraphOperation lmerge = m_currentFA.Merge(l, options); //Console.WriteLine(l.ToString()); lmerge.MergeGraphInfo(l, GraphElementType.ET_EDGE, FA.m_FAINFOKEY); lmerge.MergeGraphInfo(l, GraphElementType.ET_GRAPH, FA.m_FAINFOKEY); lmerge.MergeGraphInfo(l, GraphElementType.ET_NODE, FA.m_FAINFOKEY); lmerge.MergeGraphInfo(l, GraphElementType.ET_EDGE, m_ThompsonInfoKey); lmerge.MergeGraphInfo(l, GraphElementType.ET_GRAPH, m_ThompsonInfoKey); lmerge.MergeGraphInfo(l, GraphElementType.ET_NODE, m_ThompsonInfoKey); CGraphNode il = lmerge.GetMirrorNode(l.M_Initial); CGraphNode fl = lmerge.GetMirrorNode(l.GetFinalStates()[0]); //3.Merge right graph CGraph.CMergeGraphOperation rmerge = m_currentFA.Merge(r, options); rmerge.MergeGraphInfo(r, GraphElementType.ET_EDGE, FA.m_FAINFOKEY); rmerge.MergeGraphInfo(r, GraphElementType.ET_GRAPH, FA.m_FAINFOKEY); rmerge.MergeGraphInfo(r, GraphElementType.ET_NODE, FA.m_FAINFOKEY); rmerge.MergeGraphInfo(r, GraphElementType.ET_EDGE, m_ThompsonInfoKey); rmerge.MergeGraphInfo(r, GraphElementType.ET_GRAPH, m_ThompsonInfoKey); rmerge.MergeGraphInfo(r, GraphElementType.ET_NODE, m_ThompsonInfoKey); CGraphNode ir = rmerge.GetMirrorNode(r.M_Initial); CGraphNode fr = rmerge.GetMirrorNode(r.GetFinalStates()[0]); //4.Create the initial and the final node CGraphNode FAinit = m_currentFA.CreateGraphNode <CGraphNode>(); CGraphNode FAfinal = m_currentFA.CreateGraphNode <CGraphNode>(); m_ThompsonInfo.InitNodeInfo(FAinit, new ThompsonNodeFAInfo()); m_ThompsonInfo.InitNodeInfo(FAfinal, new ThompsonNodeFAInfo()); m_currentFA.M_Initial = FAinit; m_currentFA.SetFinalState(FAfinal); m_currentFA.UpdateAlphabet(); m_currentFA.AddGraphEdge <CGraphEdge, CGraphNode>(FAinit, il, GraphType.GT_DIRECTED); m_currentFA.AddGraphEdge <CGraphEdge, CGraphNode>(FAinit, ir, GraphType.GT_DIRECTED); m_currentFA.AddGraphEdge <CGraphEdge, CGraphNode>(fr, FAfinal, GraphType.GT_DIRECTED); m_currentFA.AddGraphEdge <CGraphEdge, CGraphNode>(fl, FAfinal, GraphType.GT_DIRECTED); // Update closure information from operand closure // Update closure information from operand closure UpdateClosureInformation(l, m_currentFA, lmerge); UpdateClosureInformation(r, m_currentFA, rmerge); //7.Return result return(m_currentFA); }
internal FA Synthesize(CCharRangeSet set) { FAGraphQueryInfo FAInfo; m_currentFA = new FA(); m_ThompsonInfo = new ThompsonInfo(m_currentFA, m_ThompsonInfoKey); FAInfo = new FAGraphQueryInfo(m_currentFA, FA.m_FAINFOKEY); //2.Create nodes initial-final CGraphNode init = m_currentFA.CreateGraphNode <CGraphNode>(); CGraphNode final = m_currentFA.CreateGraphNode <CGraphNode>(); m_ThompsonInfo.InitNodeInfo(init, new ThompsonNodeFAInfo()); m_ThompsonInfo.InitNodeInfo(final, new ThompsonNodeFAInfo()); m_currentFA.M_Initial = init; m_currentFA.SetFinalState(final); m_currentFA.M_Alphabet.AddSet(set); //3.Draw the edge including the character CGraphEdge newEdge = m_currentFA.AddGraphEdge <CGraphEdge, CGraphNode>(init, final, GraphType.GT_DIRECTED); FAInfo.Info(newEdge).M_TransitionCharSet = set; return(m_currentFA); }
internal FA Synthesize(FA l, FA r) { FA tempFA = new FA(); //2.Merge left graph CGraph.CMergeGraphOperation lmerge = tempFA.Merge(l, CGraph.CMergeGraphOperation.MergeOptions.MO_DEFAULT); lmerge.MergeGraphInfo(l, GraphElementType.ET_EDGE, FA.m_FAINFOKEY); lmerge.MergeGraphInfo(l, GraphElementType.ET_GRAPH, FA.m_FAINFOKEY); lmerge.MergeGraphInfo(l, GraphElementType.ET_NODE, FA.m_FAINFOKEY); CGraphNode il = lmerge.GetMirrorNode(l.M_Initial); CGraphNode fl = lmerge.GetMirrorNode(l.GetFinalStates()[0]); //3.Merge right graph CGraph.CMergeGraphOperation rmerge = tempFA.Merge(r, CGraph.CMergeGraphOperation.MergeOptions.MO_DEFAULT); rmerge.MergeGraphInfo(r, GraphElementType.ET_EDGE, FA.m_FAINFOKEY); rmerge.MergeGraphInfo(r, GraphElementType.ET_GRAPH, FA.m_FAINFOKEY); rmerge.MergeGraphInfo(r, GraphElementType.ET_NODE, FA.m_FAINFOKEY); CGraphNode ir = rmerge.GetMirrorNode(r.M_Initial); CGraphNode fr = rmerge.GetMirrorNode(r.GetFinalStates()[0]); //4.Create the initial and the final node tempFA.M_Initial = il; tempFA.SetFinalState(fr); tempFA.AddGraphEdge <CGraphEdge, CGraphNode>(fl, ir, GraphType.GT_DIRECTED); //7.Return result return(tempFA); }
internal FA Sythesize(FA l, FA r, CGraph.CMergeGraphOperation.MergeOptions options) { //1.Create FA FA templateFA = new FA(); //2.Merge left graph CGraph.CMergeGraphOperation lmerge = templateFA.Merge(l, options); //Console.WriteLine(l.ToString()); lmerge.MergeGraphInfo(l, GraphElementType.ET_EDGE, FA.m_FAINFOKEY); lmerge.MergeGraphInfo(l, GraphElementType.ET_GRAPH, FA.m_FAINFOKEY); lmerge.MergeGraphInfo(l, GraphElementType.ET_NODE, FA.m_FAINFOKEY); CGraphNode il = lmerge.GetMirrorNode(l.M_Initial); CGraphNode fl = lmerge.GetMirrorNode(l.GetFinalStates()[0]); //3.Merge right graph CGraph.CMergeGraphOperation rmerge = templateFA.Merge(r, options); rmerge.MergeGraphInfo(r, GraphElementType.ET_EDGE, FA.m_FAINFOKEY); rmerge.MergeGraphInfo(r, GraphElementType.ET_GRAPH, FA.m_FAINFOKEY); rmerge.MergeGraphInfo(r, GraphElementType.ET_NODE, FA.m_FAINFOKEY); CGraphNode ir = rmerge.GetMirrorNode(r.M_Initial); CGraphNode fr = rmerge.GetMirrorNode(r.GetFinalStates()[0]); //4.Create the initial and the final node CGraphNode FAinit = templateFA.CreateGraphNode <CGraphNode>(); CGraphNode FAfinal = templateFA.CreateGraphNode <CGraphNode>(); templateFA.M_Initial = FAinit; templateFA.SetFinalState(FAfinal); templateFA.UpdateAlphabet(); templateFA.AddGraphEdge <CGraphEdge, CGraphNode>(FAinit, il, GraphType.GT_DIRECTED); templateFA.AddGraphEdge <CGraphEdge, CGraphNode>(FAinit, ir, GraphType.GT_DIRECTED); templateFA.AddGraphEdge <CGraphEdge, CGraphNode>(fr, FAfinal, GraphType.GT_DIRECTED); templateFA.AddGraphEdge <CGraphEdge, CGraphNode>(fl, FAfinal, GraphType.GT_DIRECTED); //7.Return result return(templateFA); }
internal FA SynthesizeNoneOrMul(FA synth) { // Create a serial to identify this closure m_currentClosureSerial = ThompsonFAInfo.GetNewClosureSerial(); // 1. Create new FA FA m_currentFA = CreateNewFA(synth); // Draw closure override edge that connects the initial and the final node m_currentFA.AddGraphEdge <CGraphEdge, CGraphNode>(m_newFASource, m_newFATarget, GraphType.GT_DIRECTED); // Draw the closure loop edge m_currentFA.AddGraphEdge <CGraphEdge, CGraphNode>(m_mergeOperation.GetMirrorNode(synth.GetFinalStates()[0]), m_mergeOperation.GetMirrorNode(synth.M_Initial), GraphType.GT_DIRECTED); m_ThompsonInfo.SetNodeClosureEntrance(m_mergeOperation.GetMirrorNode(synth.M_Initial), m_currentClosureSerial); m_ThompsonInfo.SetNodeClosureExpression(m_mergeOperation.GetMirrorNode(synth.M_Initial), m_closureText); m_ThompsonInfo.SetNodeClosureExit(m_mergeOperation.GetMirrorNode(synth.GetFinalStates()[0]), m_currentClosureSerial); m_ThompsonInfo.SetNodeClosureExpression(m_mergeOperation.GetMirrorNode(synth.GetFinalStates()[0]), m_closureText); // Update current FA closure Info m_currentFAloop.MLoopSerial = m_currentClosureSerial; m_currentFAloop.MClosureType = FALoop.ClosureType.CT_NONEORMULT; //7.Return result return(m_currentFA); }
internal FA Synthesize(FA l, FA r) { FA m_currentFA = new FA(); m_ThompsonInfo = new ThompsonInfo(m_currentFA, m_ThompsonInfoKey); //2.Merge left graph CGraph.CMergeGraphOperation lmerge = m_currentFA.Merge(l, CGraph.CMergeGraphOperation.MergeOptions.MO_DEFAULT); lmerge.MergeGraphInfo(l, GraphElementType.ET_EDGE, FA.m_FAINFOKEY); lmerge.MergeGraphInfo(l, GraphElementType.ET_GRAPH, FA.m_FAINFOKEY); lmerge.MergeGraphInfo(l, GraphElementType.ET_NODE, FA.m_FAINFOKEY); lmerge.MergeGraphInfo(l, GraphElementType.ET_EDGE, m_ThompsonInfoKey); lmerge.MergeGraphInfo(l, GraphElementType.ET_GRAPH, m_ThompsonInfoKey); lmerge.MergeGraphInfo(l, GraphElementType.ET_NODE, m_ThompsonInfoKey); CGraphNode il = lmerge.GetMirrorNode(l.M_Initial); CGraphNode fl = lmerge.GetMirrorNode(l.GetFinalStates()[0]); //3.Merge right graph CGraph.CMergeGraphOperation rmerge = m_currentFA.Merge(r, CGraph.CMergeGraphOperation.MergeOptions.MO_DEFAULT); rmerge.MergeGraphInfo(r, GraphElementType.ET_EDGE, FA.m_FAINFOKEY); rmerge.MergeGraphInfo(r, GraphElementType.ET_GRAPH, FA.m_FAINFOKEY); rmerge.MergeGraphInfo(r, GraphElementType.ET_NODE, FA.m_FAINFOKEY); rmerge.MergeGraphInfo(r, GraphElementType.ET_EDGE, m_ThompsonInfoKey); rmerge.MergeGraphInfo(r, GraphElementType.ET_GRAPH, m_ThompsonInfoKey); rmerge.MergeGraphInfo(r, GraphElementType.ET_NODE, m_ThompsonInfoKey); CGraphNode ir = rmerge.GetMirrorNode(r.M_Initial); CGraphNode fr = rmerge.GetMirrorNode(r.GetFinalStates()[0]); //4.Create the initial and the final node m_currentFA.M_Initial = il; m_currentFA.SetFinalState(fr); m_currentFA.AddGraphEdge <CGraphEdge, CGraphNode>(fl, ir, GraphType.GT_DIRECTED); // Update closure information from operand closure UpdateClosureInformation(l, m_currentFA, lmerge); UpdateClosureInformation(r, m_currentFA, rmerge); //7.Return result return(m_currentFA); }
public HashSet <CGraphNode> Start() { GraphLibrary.CGraphNode Qprime, Q; CGraphEdge e; CCharRangeSet set; //q0 ← -closure({n0}); HashSet <CGraphNode> q0 = CEclosureAlgorithm.Init(m_NFA, new HashSet <CGraphNode>() { m_NFA.M_Initial }).Start(); m_NFA.UpdateAlphabet(); // Create DFA m_DFA = new FA(); // DEBUG m_reporting.AddDFA(0, m_DFA); m_DFAInfo = new FAGraphQueryInfo(m_DFA, FA.m_FAINFOKEY); m_configurations = new CConfigurations(m_DFA, m_NFA); m_configurations.CreateDFANode(q0); //WorkList ← { q0}; m_workList.Enqueue(q0); while (m_workList.Count != 0) { HashSet <CGraphNode> q = m_workList.Dequeue(); Q = m_configurations.GetDFANode(q); // ********* DEBUG ************* CSubsetConstructionReporting.IterationRecord cRecord = m_reporting.AddIteration(0, q, Q); // for each NFA alphabet character foreach (CCharRange range in m_NFA.M_Alphabet) { foreach (Int32 i in range) { CDeltaAlgorithm delta = CDeltaAlgorithm.Init(m_NFA, i, q); HashSet <CGraphNode> deltaResult = delta.Start(); CEclosureAlgorithm eClosure = CEclosureAlgorithm.Init(m_NFA, deltaResult); HashSet <CGraphNode> qprime = eClosure.Start(); if (qprime.Count != 0) { Qprime = m_configurations.GetDFANode(qprime); if (Qprime == null) { m_workList.Enqueue(qprime); Qprime = m_configurations.CreateDFANode(qprime); } // Check if an edge between Q and Qprime alredy exists e = m_DFA.Edge(Q, Qprime); if (e == null) { e = m_DFA.AddGraphEdge <CGraphEdge, CGraphNode>(Q, Qprime, GraphType.GT_DIRECTED); set = new CCharRangeSet(false); m_DFAInfo.SetDFAEdgeTransitionCharacterSet(e, set); } else { set = m_DFAInfo.GetDFAEdgeTransitionCharacterSet(e); } set.AddRange(i); // ********** DEBUG ************ CSubsetConstructionReporting.EdgeRecord charRecord = cRecord.AddEdgeRecord(deltaResult, qprime, e); charRecord.AddCharacterCode(i); } } } } m_DFA.UpdateAlphabet(); m_DFA.RegisterGraphPrinter(new FAGraphVizPrinter(m_DFA, new UOPCore.Options <ThompsonOptions>())); m_DFA.Generate(@"mergeDFA.dot", true); // DEBUG m_reporting.Report("SubsetREPORT.txt"); return(null); }
public void Init() { // List of DFA nodes in minimized DFA node List <CGraphNode> configurationAcc, configurationNonAcc; // Create configuration (min-DFA node) for accepted nodes CGraphNode acceptedConf = m_minimizedDFA.CreateGraphNode <CGraphNode>(); // Create a list of initial-DFA nodes that are registered as accepted nodes configurationAcc = new List <CGraphNode>(); // Store the list for initial-DFA accepted nodes in the min-DFA for accepted nodes SetNodesInConfiguration(acceptedConf, configurationAcc); // Create configuration (min-DFA node) for non-accepted nodes CGraphNode non_acceptedConf = m_minimizedDFA.CreateGraphNode <CGraphNode>(); // Create a list for initial-DFA nodes that are registered as non-accepted nodes configurationNonAcc = new List <CGraphNode>(); // Store the list of initial-DFA non-accepted node in the min-DFA for accepted nodes SetNodesInConfiguration(non_acceptedConf, configurationNonAcc); // Separate accepted from non-accepted nodes into two distinct // configurations. Iterate over the input DFA and place the // accepted node into configurationAcc and none accepted nodes // into configurationNonAcc CIt_GraphNodes it = new CIt_GraphNodes(m_DFA); for (it.Begin(); !it.End(); it.Next()) { if (m_DFA.GetFinalStates().Contains(it.M_CurrentItem)) { // Record in the input DFA node the in which minimized DFA node // will be placed SetNodeConfiguration(it.M_CurrentItem, acceptedConf); configurationAcc.Add(it.M_CurrentItem); } else { // Record in the input DFA node the in which minimized DFA node // will be placed SetNodeConfiguration(it.M_CurrentItem, non_acceptedConf); configurationNonAcc.Add(it.M_CurrentItem); } } // ************************* Debug Initialization *************************** m_DFA.RegisterGraphPrinter(new FATextPrinter(m_DFA)); m_DFA.Generate("HopCroft_InitialDFA_.txt"); m_reporting.SetInitialMinDFAStatesContents(acceptedConf, configurationAcc, non_acceptedConf, configurationNonAcc); int nodeCount = 0; int iteration_count = 0; CIt_GraphNodes minDFA_it = new CIt_GraphNodes(m_minimizedDFA); // Iterate while the algorithm reaches a fixed point state while (nodeCount != m_minimizedDFA.M_NumberOfNodes) { nodeCount = m_minimizedDFA.M_NumberOfNodes; // ************************* Debug *************************** CIterationRecord currentIteration = m_reporting.AddIteration(iteration_count); for (minDFA_it.Begin(); !minDFA_it.End(); minDFA_it.Next()) { // ************************* Debug *************************** currentIteration.M_NodesToInspect.Add(minDFA_it.M_CurrentItem); currentIteration.M_InitialNodesConfiguration.Add(minDFA_it.M_CurrentItem, new List <CGraphNode>(GetNodesInConfiguration(minDFA_it.M_CurrentItem))); Split(minDFA_it.M_CurrentItem); } } // Draw the final edges // Edges between nodes of the initial DFA are mapped to edges between // configurations in minimized-DFA. Thus, edges are drawn between two // min-DFA related configurations when their corresponding nodes are // connected and their transition character set is combined CIt_GraphNodes minit1 = new CIt_GraphNodes(m_minimizedDFA); CIt_GraphNodes minit2 = new CIt_GraphNodes(m_minimizedDFA); List <CGraphNode> confs, conft; CGraphEdge edge, newedge; for (minit1.Begin(); !minit1.End(); minit1.Next()) { for (minit2.Begin(); !minit2.End(); minit2.Next()) { confs = GetNodesInConfiguration(minit1.M_CurrentItem); conft = GetNodesInConfiguration(minit2.M_CurrentItem); foreach (CGraphNode snode in confs) { foreach (CGraphNode tnode in conft) { edge = m_DFA.Edge(snode, tnode); if (edge != null) { // Disallow duplicate edges between nodes of the minimized DFA newedge = m_minimizedDFA.Edge(minit1.M_CurrentItem, minit2.M_CurrentItem); if (newedge == null) { newedge = m_minimizedDFA.AddGraphEdge <CGraphEdge, CGraphNode>(minit1.M_CurrentItem, minit2.M_CurrentItem, GraphType.GT_DIRECTED); } // Add transition characters if (GetMinDFAStateTransitionCharacterSet(newedge) == null) { SetMinDFAStateTransitionCharacterSet(newedge, new CCharRangeSet(false)); m_minimizedDFA.SetFAEdgeInfo(newedge, new CCharRangeSet(false)); } CCharRangeSet charset = GetMinDFAStateTransitionCharacterSet(newedge); m_minimizedDFA.GetFAEdgeInfo(newedge).AddSet(m_DFA.GetFAEdgeInfo(edge)); } } } } } // Detect accepted nodes in minimized DFA CIt_GraphNodes it1 = new CIt_GraphNodes(m_minimizedDFA); for (it1.Begin(); !it1.End(); it1.Next()) { List <CGraphNode> configuration = GetNodesInConfiguration(it1.M_CurrentItem); List <CGraphNode> finals = m_DFA.GetFinalStates(); foreach (CGraphNode node in configuration) { if (finals.Contains(node)) { m_minimizedDFA.SetFinalState(it1.M_CurrentItem); } } } // Detect initial state of minimized DFA for (it1.Begin(); !it1.End(); it1.Next()) { List <CGraphNode> configuration = GetNodesInConfiguration(it1.M_CurrentItem); CGraphNode initial = m_DFA.M_Initial; foreach (CGraphNode node in configuration) { if (initial == node) { m_minimizedDFA.M_Initial = it1.M_CurrentItem; } } } // Set Final minimized-DFA labels for (it1.Begin(); !it1.End(); it1.Next()) { List <CGraphNode> conf = GetNodesInConfiguration(it1.M_CurrentItem); foreach (CGraphNode iNode in conf) { HashSet <string> prefs = m_DFA.GetFANodePrefixLabels(iNode); foreach (string s in prefs) { m_minimizedDFA.SetFANodePrefix(s, it1.M_CurrentItem); } foreach (uint dependency in m_DFA.GetFANodeLineDependencies(iNode)) { m_minimizedDFA.SetFANodeLineDependency(dependency, it1.M_CurrentItem); } } m_minimizedDFA.PrefixElementLabel(m_minimizedDFA.GetFANodePrefix(it1.M_CurrentItem), it1.M_CurrentItem); } m_reporting.Report("HOPCROFTReport.txt"); FASerializer serializer = new FASerializer(m_minimizedDFA); serializer.Print(); m_DFA.RegisterGraphPrinter(new FAGraphVizPrinter(m_minimizedDFA, new UOPCore.Options <ThompsonOptions>())); m_DFA.Generate(@"minimizedDFA.dot", true); }