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