Ejemplo n.º 1
0
        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;
 }
Ejemplo n.º 3
0
        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;
        }
Ejemplo n.º 4
0
 private static RoutePatternConstraintReference ConstraintCore(MatchProcessor matchProcessor)
 {
     return(new RoutePatternConstraintReference(matchProcessor));
 }