private void alignTracksButton_Click(object sender, RoutedEventArgs e) { bool postProcessMatchingPoints = (bool)postProcessMatchingPointsCheckBox.IsChecked; bool removeUnusedMatchingPoints = (bool)removeUnusedMatchingPointsCheckBox.IsChecked; List <Match> matches = new List <Match>(multiTrackViewer.Matches); List <Match> newMatches = new List <Match>(); List <MatchGroup> trackGroups = DetermineMatchGroups(); try { MatchProcessor.ValidateMatches(trackGroups); } catch (Exception ex) { var message = "Invalid sequence of matches, cannot warp. " + "Please clean up the matches first (e.g. by filtering) to get rid of invalid mappings, e.g. overlapping/crossing matches."; MessageBox.Show(this, message, ex.Message, MessageBoxButton.OK, MessageBoxImage.Error); return; } Task.Factory.StartNew(() => { Parallel.ForEach(trackGroups, trackGroup => { if (postProcessMatchingPoints) { Parallel.ForEach(trackGroup.MatchPairs, trackPair => { MatchProcessor.ValidatePairOrder(trackPair.Matches); foreach (Match match in trackPair.Matches) { newMatches.Add(CrossCorrelation.Adjust(match, progressMonitor)); } }); } }); Dispatcher.BeginInvoke((Action) delegate { newMatches.ForEach((m) => multiTrackViewer.Matches.Add(m)); if (removeUnusedMatchingPoints) { multiTrackViewer.Matches.Clear(); } TrackList <AudioTrack> alignedTracks = new TrackList <AudioTrack>(); TimeSpan componentStartTime = TimeSpan.Zero; string[] colors = { "#00aeef", "#00a651", "#8A2BE2", "#5F9EA0", "#D2691E", "#B8860B", "#483D8B", "#FF69B4", "#B0C4DE", "#6B8E23", "#F4A460" }; int colorIndex = 0; foreach (MatchGroup trackGroup in trackGroups) { if (removeUnusedMatchingPoints) { foreach (MatchPair trackPair in trackGroup.MatchPairs) { foreach (Match match in trackPair.Matches) { multiTrackViewer.Matches.Add(match); } } } MatchProcessor.FilterCoincidentMatches(trackGroup.MatchPairs); MatchProcessor.AlignTracks(trackGroup.MatchPairs); //MatchProcessor.MoveToStartTime(trackGroup.TrackList, componentStartTime); alignedTracks.Add(trackGroup.TrackList); componentStartTime = trackGroup.TrackList.End; foreach (AudioTrack t in trackGroup.TrackList) { t.Color = colors[colorIndex % colors.Length]; } colorIndex++; } // process unaligned tracks (= tracks without matching points) foreach (AudioTrack track in trackList.Except(alignedTracks)) { track.Volume = 0; } }); }); }
internal RoutePatternConstraintReference(MatchProcessor matchProcessor) { MatchProcessor = matchProcessor; }
public MainWindow() { InitializeComponent(); MatchProcessor.LoadAllData(); this.fighters = MatchProcessor.Fighters; this.matches = MatchProcessor.Matches; // Set initial elo ratings for all fighters. foreach (var fighter in fighters) { fighter.EloRating = 2000; } //// Test to see how the initial ranking of a fighter affects his final ranking. Hint: It has almost no influence ;) //var almeida = fighters.Single(f => f.LastName.Equals("Almeida") && f.FirstName.Equals("Marcus")); //almeida.EloRating = 2000; // The matches are first sorted and grouped by year. // For each year, the elo rating difference for each fighter is calculated, // and added at the end of the year. foreach (var year in matches.GroupBy(m => m.Year).OrderBy(g => g.Key)) { foreach (var match in year) { // The points won or lost by fighter 1 in the match. double pointsWonOrLost = CalculateEloPoints(match); // The points are added to the score of fighter 1, and subtracted from the score of fighter 2. match.Fighter1.EloRatingDifference += pointsWonOrLost; match.Fighter2.EloRatingDifference -= pointsWonOrLost; } foreach (var fighter in fighters) { fighter.UpdateEloRating(); } } var matchesPerFighter = fighters.ToDictionary(f => f, f => matches.Where(m => m.Fighter1 == f || m.Fighter2 == f).ToList() ); var datagridInfo = fighters .Select(f => new { Fighter = f.FirstName + " " + f.LastName, Rating = (int)f.EloRating, Matches = matchesPerFighter[f].Count(), // matches.Count(m => m.Fighter1 == f || m.Fighter2 == f), Victories = matchesPerFighter[f].Count(m => (m.Fighter1 == f && m.Result == MatchResult.WinBySubmission) || (m.Fighter2 == f && m.Result == MatchResult.LossBySubmission)) }) .OrderByDescending(f => f.Rating) .ToList(); //dataGrid.ItemsSource = datagridInfo; dataGrid.ItemsSource = fighters; dataGridMatches.ItemsSource = MatchProcessor.RawMatchData; }
private static RoutePatternConstraintReference ConstraintCore(MatchProcessor matchProcessor) { return(new RoutePatternConstraintReference(matchProcessor)); }