示例#1
0
        private static void TakeSubsetFromFile(string inputFile, int size, bool filter = false)
        {
            AspectManager AM = new AspectManager();
            ParserWrapper pw = _parser._pool.GetParserWrapper();

            AM.WorkingAspect = AM.DeserializeAspect(inputFile, pw);
            System.Console.WriteLine("Reading finished");

            List <PointOfInterest> points = AM.WorkingAspect.Items;

            if (filter)
            {
                int AmbigRemoved = 0;
                int AmbigRemains = 0;
                int GoodRemoved  = 0;
                int GoodRemains  = 0;
                for (int i = 0; i < points.Count; ++i)
                {
                    if (points[i]?.Title?.StartsWith("+ ") ?? false)
                    {
                        if (points[i].Title.StartsWith("+ using"))
                        {
                            points.RemoveAt(i);
                            i           -= 1;
                            GoodRemoved += 1;
                        }
                        else
                        {
                            GoodRemains += 1;
                        }
                    }
                    else
                    {
                        if (points[i]?.Title?.StartsWith("using") ?? true)
                        {
                            points.RemoveAt(i);
                            i            -= 1;
                            AmbigRemoved += 1;
                        }
                        else
                        {
                            AmbigRemains += 1;
                        }
                    }
                }
                Console.WriteLine("Removed: " + GoodRemoved + " good, " + AmbigRemoved + " ambiguous results");
                Console.WriteLine("Remains: " + GoodRemains + " good, " + AmbigRemains + " ambiguous results");
            }

            if (points.Count > size)
            {
                Shuffle(points);
                points.RemoveRange(size, points.Count - size);
            }

            AM.SerializeAspect(inputFile, true);
            System.Console.WriteLine("Writing finished");
            _parser._pool.ReleaseParserWrapper(pw);
        }
示例#2
0
        private static void ProcessInputFile(string BaseDir, string inputFile)
        {
            AspectManager AM = new AspectManager();
            ParserWrapper pw = _parser._pool.GetParserWrapper();

            AM.WorkingAspect = AM.DeserializeAspect(inputFile, pw);
            _parser._pool.ReleaseParserWrapper(pw);
            int             TotalNodes = AM.WorkingAspect.Items.Count;
            int             NotFound   = 0;
            int             Errors     = 0;
            int             Found      = 0;
            int             NotChanged = 0;
            TreeManager     TM         = new TreeManager();
            PointOfInterest NewAspect  = new PointOfInterest();
            Semaphore       S          = new Semaphore(1, 1);
            int             counter    = 0;

            Parallel.For(0, AM.WorkingAspect.Items.Count, (i) =>
                         //for (int i = 0; i < AM.WorkingAspect.Items.Count; ++i)
            {
                Interlocked.Increment(ref counter);
                if (counter % 10 == 0)
                {
                    S.WaitOne();
                    Console.Write("\rNodes left: " + (AM.WorkingAspect.Items.Count - counter) + "        ");
                    S.Release();
                }
                try
                {
                    PointOfInterest Pt      = AM.WorkingAspect.Items[i];
                    PointOfInterest Root    = TM.GetTree(BaseDir + Pt.FileName);
                    string text             = TM.GetText(BaseDir + Pt.FileName);
                    TreeSearchResult Search = TreeSearchEngine.FindPointInTree2(Root, Pt, text);
                    if (Search.Count == 0)
                    {
                        Interlocked.Increment(ref NotFound);
                    }
                    else if (Search.Singular)
                    {
                        if (Search.GetNodeSimilarity(0) == 1)
                        {
                            Interlocked.Increment(ref NotChanged);
                            return;
                            //continue;
                        }
                        else
                        {
                            Interlocked.Increment(ref Found);
                            AM.WorkingAspect.Items[i].Title = "+ " + AM.WorkingAspect.Items[i].Title;
                        }
                    }
                    else
                    {
                        if (Search.Count >= 2)
                        {
                            float d1 = 1 - Search.GetNodeSimilarity(0);
                            float d2 = 1 - Search.GetNodeSimilarity(1);
                            //float near = Math.Max(Pt.NearG, Pt.NearL);
                            //float threshold = ((near + 4) / 5 + 1) /2 ; //hardcoded
                            //if (Search.GetNodeSimilarity(0) >= threshold && Search.GetNodeSimilarity(1) < threshold)
                            if (d2 != 0 && d2 >= d1 * 2)
                            {
                                Interlocked.Increment(ref Found);
                                AM.WorkingAspect.Items[i].Title = "+ " + AM.WorkingAspect.Items[i].Title;
                                //return;
                                //continue;
                            }
                        }
                    }
                    S.WaitOne();
                    NewAspect.Items.Add(AM.WorkingAspect.Items[i]);
                    S.Release();
                }
                catch (Exception e)
                {
                    S.WaitOne();
                    Console.WriteLine(e.Message);
                    Errors += 1;
                    S.Release();
                }
            }
                         );
            AM.WorkingAspect = NewAspect;
            int Ambiguous = AM.WorkingAspect.Items.Count - Found;

            AM.SerializeAspect(inputFile, true);
            File.WriteAllText(inputFile + ".report.txt", "Total: " + TotalNodes + ", Not changed: " + NotChanged + ", found: " + Found + ", Not found: " + NotFound + ", errors: " + Errors + ", ambiguous: " + Ambiguous);
            Console.Write("\rNodes left: 0        ");
            Console.WriteLine();
        }