Example #1
0
        public void VisitNode4Imp(int tabs, int pnvalue, List<int> pnIndexes)
        {
            //int occurCounter = 0;
            MakeEdgeVectorHashtable1();
            Console.WriteLine("MakeEdgeVectorHashtable1() finished: " + DateTime.Now.ToString());

            Stack<EdgeStruct> s = new Stack<EdgeStruct>();
            //int[] rootOccurIndexes = new int[2] { -1, -1 };

            OccurNode[] rootOccurSt = new OccurNode[1] { null };
            int[] rootOccurLength = new int[1] { -1 };

            List<Edge> edgeCol = Edge.FindAll1(stn);
            edgeCol.Sort(EdgeComparer);
            foreach (Edge e in edgeCol)
            {
                EdgeStruct es = new EdgeStruct();
                es.e = e;
                es.tabs = 0;
                es.pnValue = 0;
                //es.pnOccurIndexes = rootOccurIndexes;
                es.pnOccurStart = rootOccurSt;
                es.pnOccurLength = rootOccurLength;
                s.Push(es);
            }
            edgeCol.Clear();
            edgeCol = null;
            //int leafCounter = 0;

            while (s.Count != 0)
            {
                EdgeStruct es = s.Pop();
                if (es.e.value != -1)  // node has already been marked
                {
                    es.e.st = es.occurStart[0];
                    es.e.len = es.occurLength[0];
                    //calculatePeriodCounter++;
                    if (IsCalculatePeriod(es.e))
                    {
                        CalculatePeriodImp(es.e);
                        //CalculatePeriod2(es.e);
                    }

                    if (es.pnOccurStart[0] == null)
                    {
                        es.pnOccurStart[0] = es.occurStart[0];
                        es.pnOccurLength[0] = es.occurLength[0];
                    }
                    else
                    {
                        occur.Sort(es.pnOccurStart, es.pnOccurLength[0], es.occurStart, es.occurLength[0]);
                        es.pnOccurLength[0] += es.occurLength[0];
                    }
                }
                else        // node has not been marked yet
                {
                    int myval = 0;
                    if (es.e.last_char_index == (N - 1))        // if it leads to a leaf
                    {
                        myval = N - ((es.e.last_char_index - es.e.first_char_index) + 1 + es.pnValue);

                        occur.Add(myval, es.pnOccurStart, es.pnOccurLength);
                    }
                    else
                    {
                        myval = ((es.e.last_char_index - es.e.first_char_index) + 1 + es.pnValue);
                        es.e.value = myval;

                        //es.occurIndexes = new int[2]{-1,-1};
                        s.Push(es);
                        stn = es.e.end_node;
                        List<Edge> eCol = Edge.FindAll1(stn);
                        eCol.Sort(EdgeComparer);
                        foreach (Edge e in eCol)
                        {
                            EdgeStruct es1 = new EdgeStruct();
                            es1.e = e;
                            es1.tabs = es.tabs + 1;
                            es1.pnValue = es.e.value;
                            es1.pnOccurStart = es.occurStart;
                            es1.pnOccurLength = es.occurLength;
                            //es1.pnOccurIndexes = es.occurIndexes;
                            s.Push(es1);
                        }
                        eCol.Clear();
                        eCol = null;
                    }
                }
            }
        }
Example #2
0
        public void MakeEdgeVectorHashtable1()
        {
            edht.Add(-1, 0);
            Stack <EdgeStruct> s = new Stack <EdgeStruct>();

            //Dictionary<int, int> edht = new Dictionary<int, int>();
            int eidCounter = 0;

            edht.Add(eidCounter++, 0);
            int         stn     = this.stn;
            List <Edge> edgeCol = Edge.FindAll1(stn);

            foreach (Edge e in edgeCol)
            {
                EdgeStruct es = new EdgeStruct();
                es.e = e;
                es.pnIndexesIndex = 0;
                s.Push(es);
            }
            edgeCol.Clear();
            edgeCol = null;

            while (s.Count != 0)
            {
                EdgeStruct es = s.Pop();
                if (es.e.value != -1)  // node has already been marked
                {
                    edht[es.pnIndexesIndex] += edht[es.e.eid];
                    es.e.value = -1; // commented to keep it useful for visitNode4
                }
                else                 // node has not been marked yet
                {
                    //int myval = 0;
                    if (es.e.last_char_index == (N - 1))
                    {
                        edht[es.pnIndexesIndex]++;
                    }
                    else
                    {
                        es.e.value = 0;//myval;
                        edht.Add(eidCounter, 0);
                        es.e.eid = eidCounter++;
                        s.Push(es);
                        stn = es.e.end_node;
                        List <Edge> eCol = Edge.FindAll1(stn);
                        eCol.Sort(EdgeComparer);
                        foreach (Edge e in eCol)
                        {
                            EdgeStruct es1 = new EdgeStruct();
                            es1.e = e;
                            es1.pnIndexesIndex = es.e.eid;
                            s.Push(es1);
                        }
                        eCol.Clear();
                        eCol = null;
                    }
                }
            }

            /*long ccc = 0;
             * for (int i = 0; i < edht.Count; i++)
             * {
             *  ccc += edht[i - 1];
             * }
             * Console.WriteLine("CCC: " + ccc + "Time: " + DateTime.Now);
             */
        }
Example #3
0
        public void MakeEdgeVectorHashtable1()
        {
            edht.Add(-1, 0);
            Stack<EdgeStruct> s = new Stack<EdgeStruct>();

            //Dictionary<int, int> edht = new Dictionary<int, int>();
            int eidCounter = 0;
            edht.Add(eidCounter++, 0);
            int stn = this.stn;
            List<Edge> edgeCol = Edge.FindAll1(stn);
            foreach (Edge e in edgeCol)
            {
                EdgeStruct es = new EdgeStruct();
                es.e = e;
                es.pnIndexesIndex = 0;
                s.Push(es);
            }
            edgeCol.Clear();
            edgeCol = null;

            while (s.Count != 0)
            {
                EdgeStruct es = s.Pop();
                if (es.e.value != -1)  // node has already been marked
                {
                    edht[es.pnIndexesIndex] += edht[es.e.eid];
                    es.e.value = -1;  // commented to keep it useful for visitNode4
                }
                else        // node has not been marked yet
                {
                    //int myval = 0;
                    if (es.e.last_char_index == (N - 1))
                    {
                        edht[es.pnIndexesIndex]++;
                    }
                    else
                    {
                        es.e.value = 0;//myval;
                        edht.Add(eidCounter, 0);
                        es.e.eid = eidCounter++;
                        s.Push(es);
                        stn = es.e.end_node;
                        List<Edge> eCol = Edge.FindAll1(stn);
                        eCol.Sort(EdgeComparer);
                        foreach (Edge e in eCol)
                        {
                            EdgeStruct es1 = new EdgeStruct();
                            es1.e = e;
                            es1.pnIndexesIndex = es.e.eid;
                            s.Push(es1);
                        }
                        eCol.Clear();
                        eCol = null;
                    }
                }
            }
            /*long ccc = 0;
            for (int i = 0; i < edht.Count; i++)
            {
                ccc += edht[i - 1];
            }
            Console.WriteLine("CCC: " + ccc + "Time: " + DateTime.Now);
             */
        }
Example #4
0
        public void VisitNode4Imp(int tabs, int pnvalue, List <int> pnIndexes)
        {
            //int occurCounter = 0;
            MakeEdgeVectorHashtable1();
            Console.WriteLine("MakeEdgeVectorHashtable1() finished: " + DateTime.Now.ToString());

            Stack <EdgeStruct> s = new Stack <EdgeStruct>();

            //int[] rootOccurIndexes = new int[2] { -1, -1 };

            OccurNode[] rootOccurSt = new OccurNode[1] {
                null
            };
            int[] rootOccurLength = new int[1] {
                -1
            };

            List <Edge> edgeCol = Edge.FindAll1(stn);

            edgeCol.Sort(EdgeComparer);
            foreach (Edge e in edgeCol)
            {
                EdgeStruct es = new EdgeStruct();
                es.e       = e;
                es.tabs    = 0;
                es.pnValue = 0;
                //es.pnOccurIndexes = rootOccurIndexes;
                es.pnOccurStart  = rootOccurSt;
                es.pnOccurLength = rootOccurLength;
                s.Push(es);
            }
            edgeCol.Clear();
            edgeCol = null;
            //int leafCounter = 0;

            while (s.Count != 0)
            {
                EdgeStruct es = s.Pop();
                if (es.e.value != -1)  // node has already been marked
                {
                    es.e.st  = es.occurStart[0];
                    es.e.len = es.occurLength[0];
                    //calculatePeriodCounter++;
                    if (IsCalculatePeriod(es.e))
                    {
                        CalculatePeriodImp(es.e);
                        //CalculatePeriod2(es.e);
                    }

                    if (es.pnOccurStart[0] == null)
                    {
                        es.pnOccurStart[0]  = es.occurStart[0];
                        es.pnOccurLength[0] = es.occurLength[0];
                    }
                    else
                    {
                        occur.Sort(es.pnOccurStart, es.pnOccurLength[0], es.occurStart, es.occurLength[0]);
                        es.pnOccurLength[0] += es.occurLength[0];
                    }
                }
                else        // node has not been marked yet
                {
                    int myval = 0;
                    if (es.e.last_char_index == (N - 1))        // if it leads to a leaf
                    {
                        myval = N - ((es.e.last_char_index - es.e.first_char_index) + 1 + es.pnValue);

                        occur.Add(myval, es.pnOccurStart, es.pnOccurLength);
                    }
                    else
                    {
                        myval      = ((es.e.last_char_index - es.e.first_char_index) + 1 + es.pnValue);
                        es.e.value = myval;


                        //es.occurIndexes = new int[2]{-1,-1};
                        s.Push(es);
                        stn = es.e.end_node;
                        List <Edge> eCol = Edge.FindAll1(stn);
                        eCol.Sort(EdgeComparer);
                        foreach (Edge e in eCol)
                        {
                            EdgeStruct es1 = new EdgeStruct();
                            es1.e             = e;
                            es1.tabs          = es.tabs + 1;
                            es1.pnValue       = es.e.value;
                            es1.pnOccurStart  = es.occurStart;
                            es1.pnOccurLength = es.occurLength;
                            //es1.pnOccurIndexes = es.occurIndexes;
                            s.Push(es1);
                        }
                        eCol.Clear();
                        eCol = null;
                    }
                }
            }
        }