Ejemplo n.º 1
0
        public void ConnectedComponents()
        {
            UndirectedGraph <object, int> g = new UndirectedGraph <object, int>();

            // component 1
            object c1o1 = new Object();
            object c1o2 = new Object();
            object c1o3 = new Object();

            g.Add(new Edge <object, int>(c1o1, c1o2, 0));
            g.Add(new Edge <object, int>(c1o3, c1o2, 0));

            // component 2
            object c2o1 = new Object();
            object c2o2 = new Object();
            object c2o3 = new Object();

            g.Add(new Edge <object, int>(c2o1, c2o2, 0));
            g.Add(new Edge <object, int>(c2o3, c2o2, 0));

            var components = g.GetConnectedComponents();

            Assert.AreEqual(2, components.Count);

            Assert.AreEqual(3, components[0].Vertices.Count);
            Assert.AreEqual(2, components[0].Edges.Count);
            Assert.IsTrue(components[0].Vertices.Contains(c1o1));
            Assert.IsFalse(components[0].Vertices.Contains(c2o1));

            Assert.AreEqual(3, components[1].Vertices.Count);
            Assert.AreEqual(2, components[1].Edges.Count);
        }
Ejemplo n.º 2
0
        public void AddEdges2()
        {
            UndirectedGraph <object, int> g = new UndirectedGraph <object, int>();

            object o1 = new Object();
            object o2 = new Object();
            object o3 = new Object();

            g.Add(new Edge <object, int>(o1, o2, 0));
            g.Add(new Edge <object, int>(o3, o2, 0));
            Assert.AreEqual(2, g.Edges.Count);
            Assert.AreEqual(3, g.Vertices.Count);
        }
Ejemplo n.º 3
0
        public void GetEdges()
        {
            UndirectedGraph <object, int> g = new UndirectedGraph <object, int>();

            object o1 = new Object();
            object o2 = new Object();
            object o3 = new Object();

            g.Add(new Edge <object, int>(o1, o2, 0));
            g.Add(new Edge <object, int>(o3, o2, 0));

            Assert.AreEqual(1, g.GetEdges(o1).Count);
            Assert.AreEqual(2, g.GetEdges(o2).Count);
        }
Ejemplo n.º 4
0
        public void IsConnected()
        {
            UndirectedGraph <object, int> g = new UndirectedGraph <object, int>();

            object o1 = new Object();
            object o2 = new Object();
            object o3 = new Object();

            g.Add(new Edge <object, int>(o1, o2, 0));
            g.Add(new Edge <object, int>(o3, o2, 0));

            Assert.IsTrue(g.IsConnectedBetween(o1, o2));
            Assert.IsTrue(g.IsConnectedBetween(o1, o3));
            Assert.IsTrue(g.IsConnectedBetween(o2, o3));
            Assert.IsFalse(g.IsDisconnected);
        }
Ejemplo n.º 5
0
        public void AddEdge()
        {
            UndirectedGraph <object, int> g = new UndirectedGraph <object, int>();

            g.Add(new Edge <object, int>(new Object(), new Object(), 0));
            Assert.AreEqual(1, g.Edges.Count);
            Assert.AreEqual(2, g.Vertices.Count);
        }
Ejemplo n.º 6
0
        public void IsDisconnected()
        {
            UndirectedGraph <object, int> g = new UndirectedGraph <object, int>();

            // component 1
            object c1o1 = new Object();
            object c1o2 = new Object();
            object c1o3 = new Object();

            g.Add(new Edge <object, int>(c1o1, c1o2, 0));
            g.Add(new Edge <object, int>(c1o3, c1o2, 0));

            // component 2
            object c2o1 = new Object();
            object c2o2 = new Object();
            object c2o3 = new Object();

            g.Add(new Edge <object, int>(c2o1, c2o2, 0));
            g.Add(new Edge <object, int>(c2o3, c2o2, 0));

            Assert.IsTrue(g.IsDisconnected);
            Assert.IsFalse(g.IsConnectedBetween(c1o1, c2o1));
        }
        public void HasLoopTest()
        {
            var ae = new UndirectedEdge <string>("A", "E");
            var ab = new UndirectedEdge <string>("A", "B");
            var bc = new UndirectedEdge <string>("B", "C");
            var cd = new UndirectedEdge <string>("C", "D");
            var de = new UndirectedEdge <string>("D", "E");
            var bd = new UndirectedEdge <string>("B", "D");
            var be = new UndirectedEdge <string>("B", "E");

            var edges = new HashSet <UndirectedEdge <string> > {
                ab, bc, cd, de, ae
            };
            var graph = new UndirectedGraph <string>(edges);

            Assert.IsTrue(graph.HasLoop());

            edges = new HashSet <UndirectedEdge <string> > {
                ae, ab, bc, cd, bd
            };
            graph = new UndirectedGraph <string>(edges);
            graph.Add("O");
            Assert.IsTrue(graph.HasLoop());

            edges = new HashSet <UndirectedEdge <string> >()
            {
                ab, bc, cd, de
            };
            graph = new UndirectedGraph <string>(edges);
            Assert.IsFalse(graph.HasLoop());

            edges = new HashSet <UndirectedEdge <string> >()
            {
                ae, be, bc, cd, de
            };
            graph = new UndirectedGraph <string>(edges);
            Assert.IsTrue(graph.HasLoop());
        }
Ejemplo n.º 8
0
        /// <summary>
        /// Determines all groups of tracks that are connected through one or more matches.
        /// </summary>
        public static List <MatchGroup> DetermineMatchGroups(MatchFilterMode matchFilterMode, TrackList <AudioTrack> trackList,
                                                             List <Match> matches, bool windowed, TimeSpan windowSize)
        {
            List <MatchPair> trackPairs = MatchProcessor.GetTrackPairs(trackList);

            MatchProcessor.AssignMatches(trackPairs, matches);
            trackPairs = trackPairs.Where(matchPair => matchPair.Matches.Count > 0).ToList(); // remove all track pairs without matches

            // filter matches
            foreach (MatchPair trackPair in trackPairs)
            {
                List <Match> filteredMatches;

                if (trackPair.Matches.Count > 0)
                {
                    if (matchFilterMode == MatchFilterMode.None)
                    {
                        filteredMatches = trackPair.Matches;
                    }
                    else
                    {
                        if (windowed)
                        {
                            filteredMatches = MatchProcessor.WindowFilter(trackPair.Matches, matchFilterMode, windowSize);
                        }
                        else
                        {
                            filteredMatches = new List <Match>();
                            filteredMatches.Add(MatchProcessor.Filter(trackPair.Matches, matchFilterMode));
                        }
                    }

                    trackPair.Matches = filteredMatches;
                }
            }

            // determine connected tracks
            UndirectedGraph <AudioTrack, double> trackGraph = new UndirectedGraph <AudioTrack, double>();

            foreach (MatchPair trackPair in trackPairs)
            {
                trackGraph.Add(new Edge <AudioTrack, double>(trackPair.Track1, trackPair.Track2, 1d - trackPair.CalculateAverageSimilarity())
                {
                    Tag = trackPair
                });
            }

            List <UndirectedGraph <AudioTrack, double> > trackGraphComponents = trackGraph.GetConnectedComponents();

            Debug.WriteLine("{0} connected components", trackGraphComponents.Count);

            List <MatchGroup> trackGroups = new List <MatchGroup>();

            foreach (UndirectedGraph <AudioTrack, double> component in trackGraphComponents)
            {
                List <MatchPair> connectedTrackPairs = new List <MatchPair>();

                Debug.WriteLine("determining connected track pairs...");
                foreach (Edge <AudioTrack, double> edge in component.GetMinimalSpanningTree().Edges)
                {
                    connectedTrackPairs.Add((MatchPair)edge.Tag);
                }
                Debug.WriteLine("finished - {0} pairs", connectedTrackPairs.Count);

                foreach (MatchPair filteredTrackPair in connectedTrackPairs)
                {
                    Debug.WriteLine("TrackPair {0} <-> {1}: {2} matches, similarity = {3}",
                                    filteredTrackPair.Track1, filteredTrackPair.Track2,
                                    filteredTrackPair.Matches.Count, filteredTrackPair.CalculateAverageSimilarity());
                }

                TrackList <AudioTrack> componentTrackList = new TrackList <AudioTrack>(component.Vertices);

                trackGroups.Add(new MatchGroup {
                    MatchPairs = connectedTrackPairs,
                    TrackList  = componentTrackList
                });
            }

            return(trackGroups);
        }
        public void PrimMinCostSpanTreeTest()
        {
            var graph = new UndirectedGraph <string>();

            graph.Add("A");
            graph.Add("B");
            graph.Add("C");
            graph.Add("D");
            graph.Add("E");
            graph.Add(new UndirectedEdge <string>("B", "A", 60));
            graph.Add(new UndirectedEdge <string>("B", "D", 95));
            graph.Add(new UndirectedEdge <string>("B", "C", 80));
            graph.Add(new UndirectedEdge <string>("A", "C", 100));
            graph.Add(new UndirectedEdge <string>("A", "D", 20));
            graph.Add(new UndirectedEdge <string>("C", "E", 70));
            graph.Add(new UndirectedEdge <string>("D", "E", 10));

            var prim = graph.PrimMinCostSpanTree("A");

            Assert.AreEqual(4, prim.Count);
        }
        public void BreadthFirstTest()
        {
            var graph = new UndirectedGraph <string>();

            graph.Add("v1");
            graph.Add("v2");
            graph.Add("v3");
            graph.Add("v4");
            graph.Add("v5");
            graph.Add("v6");
            graph.Add("v7");
            graph.Add("v8");
            graph.Add(new UndirectedEdge <string>("v1", "v2"));
            graph.Add(new UndirectedEdge <string>("v1", "v3"));
            graph.Add(new UndirectedEdge <string>("v2", "v4"));
            graph.Add(new UndirectedEdge <string>("v2", "v5"));
            graph.Add(new UndirectedEdge <string>("v4", "v8"));
            graph.Add(new UndirectedEdge <string>("v5", "v8"));
            graph.Add(new UndirectedEdge <string>("v3", "v6"));
            graph.Add(new UndirectedEdge <string>("v3", "v7"));
            graph.Add(new UndirectedEdge <string>("v6", "v7"));

            foreach (var vertex in graph.BreadthFirst())
            {
                Console.WriteLine(vertex);
            }
        }