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