Beispiel #1
0
 private void ProcessMatch(Dictionary<Submission, FriendOf> friends, CompareResult result, Submission submission, double similarity, double min_friend_finder_similarity)
 {
     FriendOf f;
     if (similarity > min_friend_finder_similarity)
     {
         if (!friends.TryGetValue(submission, out f))
         {
             friends.Add(submission, f = new FriendOf(submission));
         }
         f.SumSimilarity += similarity;
         f.InMatches.Add(result);
     }
 }
Beispiel #2
0
        private static Submission[] CollectFiles(Configuration cfg, Tokenizer.ITokenizer tokenizer)
        {
            if (cfg.Filter.Count == 0 && cfg.Dirs.Count > 0)
            {
                cfg.Filter.Add("*.*");
            }
            if (cfg.Dirs.Count == 0 && cfg.Filter.Count > 0)
            {
                cfg.Dirs.Add(".");
            }

            var files = new List<string>();
            var include = cfg.Include.Select(i => new Regex(i)).ToList();
            var exclude = cfg.Exclude.Select(i => new Regex(i)).ToList();
            var includeDir = cfg.IncludeDir.Select(i => new Regex(i)).ToList();
            var excludeDir = cfg.ExcludeDir.Select(i => new Regex(i)).ToList();

            CollectFilesRecurse(files, cfg.Dirs, true, include, exclude, includeDir, excludeDir, cfg);

            files.AddRange(cfg.ExtraFiles.Where(f =>
            {
                if (File.Exists(f))
                {
                    return true;
                }
                else
                {
                    Console.WriteLine("  ** Warning, file \"{0}\" not found.", f);
                    return false;
                }
            }));

            if (cfg.Verbose)
            {
                Console.WriteLine("Files:");
                foreach (var f in files)
                {
                    Console.WriteLine(f);
                }
                Console.WriteLine();
            }

            return files
                    .Select(f =>
                    {
                        var s = new Submission(f, tokenizer);
                        s.Parse();
                        return s;
                    })
                    .ToArray();
        }
Beispiel #3
0
        public List<CompareResult> Compare(Submission[] files)
        {
            _progress.Start();

            var compareList = new List<Tuple<Submission, Submission>>();
            for (int a = 0; a < files.Length; a++)
            {
                for (int b = a + 1; b < files.Length; b++)
                {
                    if (Path.GetExtension(files[a].FilePath) != Path.GetExtension(files[b].FilePath)) continue;

                    compareList.Add(new Tuple<Submission, Submission>(files[a], files[b]));
                }
            }

            object _lock = new object();
            var compareResult = new List<CompareResult>();
            int counter = 0;
            int max = compareList.Count;

            #if SINGLE_THREADED
            foreach(var pair in compareList)
            #else
            Parallel.ForEach(compareList, pair =>
            #endif
            {
                var r = this.Compare(pair.Item1, pair.Item2);

                lock (_lock)
                {
                    compareResult.Add(r);
                    _progress.Progress((double)++counter / (double)max);
                }
            }
            #if !SINGLE_THREADED
            );
            #endif
            _progress.End();

            return compareResult;
        }
Beispiel #4
0
 public FriendOf(Submission s)
 {
     this.Submission = s;
     InMatches = new HashSet<CompareResult>();
 }
 public SubmissionViewModel(Submission s)
 {
     if (s == null) throw new ArgumentNullException("s");
     this.Submission = s;
 }
Beispiel #6
0
        public CompareResult Compare(Submission a, Submission b)
        {
            CompareResult result = new CompareResult(a, b);
            var matches = new List<Match>();
            // reduce access to properties
            var a_length = a.Tokens.Length;
            var b_length = b.Tokens.Length;
            var a_tokens = a.Tokens;
            var b_tokens = b.Tokens;

            for (int idx_a = 0; idx_a < a_length; idx_a++)
            {
                int idx_working_a = idx_a;
                int inMatch = 0;
                Match currentMatch = null;

                for (int idx_working_b = 0; idx_working_b < b_length; idx_working_b++)
                {
                    var working_a = a_tokens[idx_working_a];
                    var working_b = b_tokens[idx_working_b];

                    // reduce access to properties
                    var a_text = working_a.Text;
                    var b_text = working_b.Text;

                    if (a_text == b_text)
                    {
                        currentMatch = ProcessMatch(working_a, working_b, currentMatch, result);

                        idx_working_a++;
                        if (idx_working_a >= a_length) break;

                        inMatch = 1;
                    }
                    else if (inMatch > 0 && a_text != b_text)
                    {
                        if (inMatch >= _cfg.MAX_MATCH_DISTANCE)
                        {
                            FinishMatch(currentMatch, matches);
                            currentMatch = null;
                            inMatch = 0;
                        }
                        else
                        {
                            currentMatch = ProcessMatch(working_a, working_b, currentMatch, result);

                            idx_working_a++;
                            if (idx_working_a >= a_length) break;

                            inMatch++;
                        }
                    }
                } // foreach(b)
                FinishMatch(currentMatch, matches);
            } // foreach(a)

            // Find longest match
            foreach (var match in matches.OrderByDescending(i => i.TokensA.Count))
            {
                if (!result.Matches.Any(m => m.TokensA.Any(t => match.TokensA.Contains(t))
                                          || m.TokensB.Any(t => match.TokensB.Contains(t))))
                {
                    match.Index = result.Matches.Count;
                    result.Matches.Add(match);
                }
            }
            result.Update();
            return result;
        }
Beispiel #7
0
 public CompareResult(Submission a, Submission b)
 {
     this.A = a;
     this.B = b;
     Matches = new List<Match>();
 }
        public void AddFiles()
        {
            var dialog = new OpenFileDialog()
            {
                CheckFileExists = true,
                CheckPathExists = true,
                DereferenceLinks = true,
                Multiselect = true,
                ShowReadOnly = false,
                ValidateNames = true,
            };

            if (dialog.ShowDialog() == true)
            {
                foreach (var f in dialog.FileNames)
                {
                    var s = new Submission(f, Tokenizer);
                    s.Parse();
                    _submissions.Add(new SubmissionViewModel(s));
                }
            }
        }