public static CEclosureAlgorithm Init(FA g, HashSet <CGraphNode> set)
        {
            //Make some checks on the input arguments

            // Create algorithm
            CEclosureAlgorithm newObjectAlgorithm = new CEclosureAlgorithm(g, set);



            return(newObjectAlgorithm);
        }
        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);
        }