protected static IMutableBidirectionalGraph <T, IEdge <T> > GetSubGraphFrom(IBidirectionalGraph <T, IEdge <T> > graph, T source) { var result = new BidirectionalGraph <T, IEdge <T> >(); var visited = new HashSet <T>(new IdentityComparer <T>()); var toVisit = new Queue <T>(); toVisit.Enqueue(source); while (toVisit.Count > 0) { var node = toVisit.Dequeue(); var outEdges = graph.OutEdges(node); visited.Add(node); result.AddVertex(node); foreach (var outEdge in outEdges) { if (!visited.Contains(outEdge.Target)) { toVisit.Enqueue(outEdge.Target); } result.AddVerticesAndEdge(outEdge); } } return(result); }
public void Repro12901() { var graph = new BidirectionalGraph<int, Edge<int>>(); int vertex = 1; graph.AddVerticesAndEdge(new Edge<int>(vertex, vertex)); var pathFinder = AlgorithmExtensions.ShortestPathsBellmanFord<int, Edge<int>>(graph, edge => -1.0, vertex); IEnumerable<Edge<int>> path; pathFinder(vertex, out path); }
public void AddStatesFromEnumerator(int?sourceState, LabeledTransitionEnumerator enumerator) { while (enumerator.MoveNext()) { // Cannot make the next validation check because such transitions might exist when many small probabilities are // multiplied because of imprecise doubles arithmetic //if (!(enumerator.CurrentProbability > 0.0)) // continue; var transitionTargetNodeIndex = TransitionTargetToNodeIndex(enumerator.CurrentIndex); var targetStateNodeIndex = StateToNodeIndex(enumerator.CurrentTargetState); _baseGraph.AddVerticesAndEdge(new Edge(transitionTargetNodeIndex, targetStateNodeIndex)); if (sourceState == null) { continue; } var sourceStateNodeIndex = StateToNodeIndex(sourceState.Value); _baseGraph.AddVerticesAndEdge(new Edge(sourceStateNodeIndex, transitionTargetNodeIndex)); } }
public void AddVerticesAndEdge(Point from, Point to) { var fromNode = new GraphNode(this, from); var toNode = new GraphNode(this, to); _graph.AddVerticesAndEdge(new GraphEdge(fromNode, toNode)); InstallHandle(fromNode); InstallHandle(toNode); BoundingBox = CalculateBoundingBox(); }
/// <summary> /// Updates the Plugin-Plugin Dependency Graph /// </summary> private void UpdateDependencyGraph(PluginId destinationPluginId, PluginDataId dataId) { if (!_createdBy.ContainsKey(dataId)) { throw new WorkflowEngineException("Cannot resolve data dependency"); } var sourcePlugin = _createdBy[dataId]; // Add edge only if it doesn't exist if (!_graph.TryGetEdge(sourcePlugin, destinationPluginId, out SEdge <PluginId> existingEdge)) { _graph.AddVerticesAndEdge(new SEdge <PluginId>(sourcePlugin, destinationPluginId)); } }
public void ContainsEdgeTest1() { var bd = new BidirectionalGraph <int, IEdge <int> >(); var e12 = new SEquatableUndirectedEdge <int>(1, 2); var f12 = new SEquatableUndirectedEdge <int>(1, 2); bd.AddVerticesAndEdge(e12); ContainsEdgeAssertions(bd, e12, f12, null, null); var u = new UndirectedBidirectionalGraph <int, IEdge <int> >(bd); UndirectedGraphTest.ContainsEdgeAssertions(u, e12, f12, null, null); }
public void removeIsolatedVertices() { var graph = new BidirectionalGraph <int, IEdge <int> >(); graph.AddVertex(1); var edge = new EquatableEdge <int>(2, 3); graph.AddVerticesAndEdge(edge); var predicate = new IsolatedVertexPredicate <int, IEdge <int> >(graph); graph.RemoveVertexIf(predicate.Test); Assert.IsTrue(graph.ContainsVertex(2)); Assert.IsTrue(graph.ContainsEdge(edge)); Assert.IsFalse(graph.ContainsVertex(1)); }
public void ContainsEdge_UndirectedEdge() { var graph = new BidirectionalGraph <int, IEdge <int> >(); var e12 = new EquatableUndirectedEdge <int>(1, 2); var f12 = new EquatableUndirectedEdge <int>(1, 2); graph.AddVerticesAndEdge(e12); BidirectionalContainsEdgeAssertions(graph, e12, f12, null, null); var undirectedGraph = new UndirectedBidirectionalGraph <int, IEdge <int> >(graph); ContainsEdgeAssertions(undirectedGraph, e12, f12, null, null); }
public void ContainsEdgeTest1() { var bd = new BidirectionalGraph<int, IEdge<int>>(); var e12 = new SEquatableUndirectedEdge<int>(1, 2); var f12 = new SEquatableUndirectedEdge<int>(1, 2); bd.AddVerticesAndEdge(e12); ContainsEdgeAssertions(bd, e12, f12, null, null); var u = new UndirectedBidirectionalGraph<int, IEdge<int>>(bd); UndirectedGraphTest.ContainsEdgeAssertions(u, e12, f12, null, null); }
public void ContainsEdgeTest2() { var bd = new BidirectionalGraph <int, IEdge <int> >(); var e12 = new EquatableEdge <int>(1, 2); var f12 = new EquatableEdge <int>(1, 2); var e21 = new EquatableEdge <int>(2, 1); var f21 = new EquatableEdge <int>(2, 1); bd.AddVerticesAndEdge(e12); ContainsEdgeAssertions(bd, e12, f12, e21, f21); var u = new UndirectedBidirectionalGraph <int, IEdge <int> >(bd); UndirectedGraphTest.ContainsEdgeAssertions(u, e12, f12, e21, f21); }
public static IBidirectionalGraph <TVertex, TaggedEdge <TVertex, TTag> > BuildMinimumSpanningTree <TVertex, TTag>( this IBidirectionalGraph <TVertex, TaggedEdge <TVertex, TTag> > graph, IEnumerable <TVertex> sources, IEnumerable <TVertex> targets, Func <TaggedEdge <TVertex, TTag>, double> weightFunc = null) { var subGraph = new BidirectionalGraph <TVertex, TaggedEdge <TVertex, TTag> >(false); foreach (var path in graph.GetAllPaths(sources, targets, weightFunc)) { foreach (var segment in path) { var edge = new TaggedEdge <TVertex, TTag>(segment.Source, segment.Target, segment.Tag); subGraph.AddVerticesAndEdge(edge); } } return(subGraph); }
public UnderlyingDigraph(MarkovDecisionProcess mdp) { //Assumption "every node is reachable" is fulfilled due to the construction BaseGraph = new BidirectionalGraph <EdgeData>(); var enumerator = mdp.GetEnumerator(); while (enumerator.MoveNextState()) { while (enumerator.MoveNextDistribution()) { //find targets of this distribution and create the union. Some possibleSuccessors may be added while (enumerator.MoveNextTransition()) { if (enumerator.CurrentTransition.Value > 0.0) { BaseGraph.AddVerticesAndEdge(new Edge <EdgeData>(enumerator.CurrentState, enumerator.CurrentTransition.Column, new EdgeData(enumerator.RowOfCurrentDistribution))); } } } } }
public void NotEnoughPaths() { int ii = 0; var graph = new BidirectionalGraph<int, TaggedEdge<int, int>>(); graph.AddVerticesAndEdge(new TaggedEdge<int, int>(493, 495, ii++)); graph.AddVerticesAndEdge(new TaggedEdge<int, int>(495, 493, ii++)); graph.AddVerticesAndEdge(new TaggedEdge<int, int>(497, 499, ii++)); graph.AddVerticesAndEdge(new TaggedEdge<int, int>(499, 497, ii++)); graph.AddVerticesAndEdge(new TaggedEdge<int, int>(499, 501, ii++)); graph.AddVerticesAndEdge(new TaggedEdge<int, int>(501, 499, ii++)); graph.AddVerticesAndEdge(new TaggedEdge<int, int>(501, 503, ii++)); graph.AddVerticesAndEdge(new TaggedEdge<int, int>(503, 501, ii++)); graph.AddVerticesAndEdge(new TaggedEdge<int, int>(503, 505, ii++)); graph.AddVerticesAndEdge(new TaggedEdge<int, int>(505, 503, ii++)); graph.AddVerticesAndEdge(new TaggedEdge<int, int>(505, 507, ii++)); graph.AddVerticesAndEdge(new TaggedEdge<int, int>(507, 505, ii++)); graph.AddVerticesAndEdge(new TaggedEdge<int, int>(507, 509, ii++)); graph.AddVerticesAndEdge(new TaggedEdge<int, int>(509, 507, ii++)); graph.AddVerticesAndEdge(new TaggedEdge<int, int>(509, 511, ii++)); graph.AddVerticesAndEdge(new TaggedEdge<int, int>(511, 509, ii++)); graph.AddVerticesAndEdge(new TaggedEdge<int, int>(2747, 2749, ii++)); graph.AddVerticesAndEdge(new TaggedEdge<int, int>(2749, 2747, ii++)); graph.AddVerticesAndEdge(new TaggedEdge<int, int>(2749, 2751, ii++)); graph.AddVerticesAndEdge(new TaggedEdge<int, int>(2751, 2749, ii++)); graph.AddVerticesAndEdge(new TaggedEdge<int, int>(2751, 2753, ii++)); graph.AddVerticesAndEdge(new TaggedEdge<int, int>(2753, 2751, ii++)); graph.AddVerticesAndEdge(new TaggedEdge<int, int>(2753, 2755, ii++)); graph.AddVerticesAndEdge(new TaggedEdge<int, int>(2755, 2753, ii++)); graph.AddVerticesAndEdge(new TaggedEdge<int, int>(2755, 2757, ii++)); graph.AddVerticesAndEdge(new TaggedEdge<int, int>(2757, 2755, ii++)); graph.AddVerticesAndEdge(new TaggedEdge<int, int>(2757, 2759, ii++)); graph.AddVerticesAndEdge(new TaggedEdge<int, int>(2759, 2757, ii++)); graph.AddVerticesAndEdge(new TaggedEdge<int, int>(2761, 2763, ii++)); graph.AddVerticesAndEdge(new TaggedEdge<int, int>(2763, 2761, ii++)); graph.AddVerticesAndEdge(new TaggedEdge<int, int>(2765, 2767, ii++)); graph.AddVerticesAndEdge(new TaggedEdge<int, int>(2767, 2765, ii++)); graph.AddVerticesAndEdge(new TaggedEdge<int, int>(2763, 2765, ii++)); graph.AddVerticesAndEdge(new TaggedEdge<int, int>(2765, 2763, ii++)); graph.AddVerticesAndEdge(new TaggedEdge<int, int>(654, 978, ii++)); graph.AddVerticesAndEdge(new TaggedEdge<int, int>(978, 654, ii++)); graph.AddVerticesAndEdge(new TaggedEdge<int, int>(978, 1302, ii++)); graph.AddVerticesAndEdge(new TaggedEdge<int, int>(1302, 978, ii++)); graph.AddVerticesAndEdge(new TaggedEdge<int, int>(1302, 1626, ii++)); graph.AddVerticesAndEdge(new TaggedEdge<int, int>(1626, 1302, ii++)); graph.AddVerticesAndEdge(new TaggedEdge<int, int>(1626, 1950, ii++)); graph.AddVerticesAndEdge(new TaggedEdge<int, int>(1950, 1626, ii++)); graph.AddVerticesAndEdge(new TaggedEdge<int, int>(1950, 2274, ii++)); graph.AddVerticesAndEdge(new TaggedEdge<int, int>(2274, 1950, ii++)); graph.AddVerticesAndEdge(new TaggedEdge<int, int>(2274, 2598, ii++)); graph.AddVerticesAndEdge(new TaggedEdge<int, int>(2598, 2274, ii++)); graph.AddVerticesAndEdge(new TaggedEdge<int, int>(513, 676, ii++)); graph.AddVerticesAndEdge(new TaggedEdge<int, int>(676, 513, ii++)); graph.AddVerticesAndEdge(new TaggedEdge<int, int>(2767, 2608, ii++)); graph.AddVerticesAndEdge(new TaggedEdge<int, int>(2608, 2767, ii++)); graph.AddVerticesAndEdge(new TaggedEdge<int, int>(2287, 2608, ii++)); graph.AddVerticesAndEdge(new TaggedEdge<int, int>(2608, 2287, ii++)); graph.AddVerticesAndEdge(new TaggedEdge<int, int>(676, 999, ii++)); ; graph.AddVerticesAndEdge(new TaggedEdge<int, int>(999, 676, ii++)); graph.AddVerticesAndEdge(new TaggedEdge<int, int>(1321, 1643, ii++)); graph.AddVerticesAndEdge(new TaggedEdge<int, int>(1643, 1321, ii++)); graph.AddVerticesAndEdge(new TaggedEdge<int, int>(1643, 1965, ii++)); graph.AddVerticesAndEdge(new TaggedEdge<int, int>(1965, 1643, ii++)); graph.AddVerticesAndEdge(new TaggedEdge<int, int>(1965, 2287, ii++)); graph.AddVerticesAndEdge(new TaggedEdge<int, int>(2287, 1965, ii++)); graph.AddVerticesAndEdge(new TaggedEdge<int, int>(999, 1321, ii++)); graph.AddVerticesAndEdge(new TaggedEdge<int, int>(1321, 999, ii++)); graph.AddVerticesAndEdge(new TaggedEdge<int, int>(2745, 2747, ii++)); graph.AddVerticesAndEdge(new TaggedEdge<int, int>(2747, 2745, ii++)); graph.AddVerticesAndEdge(new TaggedEdge<int, int>(650, 491, ii++)); graph.AddVerticesAndEdge(new TaggedEdge<int, int>(491, 650, ii++)); graph.AddVerticesAndEdge(new TaggedEdge<int, int>(650, 970, ii++)); graph.AddVerticesAndEdge(new TaggedEdge<int, int>(970, 650, ii++)); graph.AddVerticesAndEdge(new TaggedEdge<int, int>(2258, 2582, ii++)); graph.AddVerticesAndEdge(new TaggedEdge<int, int>(2582, 2258, ii++)); graph.AddVerticesAndEdge(new TaggedEdge<int, int>(970, 1291, ii++)); graph.AddVerticesAndEdge(new TaggedEdge<int, int>(1291, 970, ii++)); graph.AddVerticesAndEdge(new TaggedEdge<int, int>(1935, 2258, ii++)); graph.AddVerticesAndEdge(new TaggedEdge<int, int>(2258, 1935, ii++)); graph.AddVerticesAndEdge(new TaggedEdge<int, int>(1291, 1613, ii++)); graph.AddVerticesAndEdge(new TaggedEdge<int, int>(1613, 1291, ii++)); graph.AddVerticesAndEdge(new TaggedEdge<int, int>(1613, 1935, ii++)); graph.AddVerticesAndEdge(new TaggedEdge<int, int>(1935, 1613, ii++)); graph.AddVerticesAndEdge(new TaggedEdge<int, int>(2582, 2745, ii++)); graph.AddVerticesAndEdge(new TaggedEdge<int, int>(2745, 2582, ii++)); graph.AddVerticesAndEdge(new TaggedEdge<int, int>(495, 497, ii++)); graph.AddVerticesAndEdge(new TaggedEdge<int, int>(497, 495, ii++)); graph.AddVerticesAndEdge(new TaggedEdge<int, int>(511, 513, ii++)); graph.AddVerticesAndEdge(new TaggedEdge<int, int>(513, 511, ii++)); graph.AddVerticesAndEdge(new TaggedEdge<int, int>(491, 493, ii++)); graph.AddVerticesAndEdge(new TaggedEdge<int, int>(493, 491, ii++)); graph.AddVerticesAndEdge(new TaggedEdge<int, int>(491, 654, ii++)); graph.AddVerticesAndEdge(new TaggedEdge<int, int>(654, 491, ii++)); graph.AddVerticesAndEdge(new TaggedEdge<int, int>(2761, 2598, ii++)); graph.AddVerticesAndEdge(new TaggedEdge<int, int>(2598, 2761, ii++)); graph.AddVerticesAndEdge(new TaggedEdge<int, int>(2761, 2759, ii++)); graph.AddVerticesAndEdge(new TaggedEdge<int, int>(2759, 2761, ii++)); var test1 = new HoffmanPavleyRankedShortestPathAlgorithm<int, TaggedEdge<int, int>>(graph, e => 1.0); test1.ShortestPathCount = 5; test1.Compute(1626, 1965); Assert.AreEqual(4, test1.ComputedShortestPathCount); Console.WriteLine("path: {0}", test1.ComputedShortestPathCount); foreach (var path in test1.ComputedShortestPaths) { foreach (var edge in path) Console.Write(edge + ":"); Console.WriteLine(); } }
public void InfiniteLoop13111() { int ii = 0; var mvGraph2 = new BidirectionalGraph<int, TaggedEdge<int, int>>(); mvGraph2.AddVerticesAndEdge(new TaggedEdge<int, int>(0, 1, ii++)); mvGraph2.AddVerticesAndEdge(new TaggedEdge<int, int>(1, 2, ii++)); mvGraph2.AddVerticesAndEdge(new TaggedEdge<int, int>(2, 3, ii++)); mvGraph2.AddVerticesAndEdge(new TaggedEdge<int, int>(3, 4, ii++)); mvGraph2.AddVerticesAndEdge(new TaggedEdge<int, int>(4, 5, ii++)); mvGraph2.AddVerticesAndEdge(new TaggedEdge<int, int>(5, 0, ii++)); mvGraph2.AddVerticesAndEdge(new TaggedEdge<int, int>(1, 5, ii++)); mvGraph2.AddVerticesAndEdge(new TaggedEdge<int, int>(5, 1, ii++)); mvGraph2.AddVerticesAndEdge(new TaggedEdge<int, int>(2, 5, ii++)); mvGraph2.AddVerticesAndEdge(new TaggedEdge<int, int>(1, 0, ii++)); mvGraph2.AddVerticesAndEdge(new TaggedEdge<int, int>(2, 1, ii++)); mvGraph2.AddVerticesAndEdge(new TaggedEdge<int, int>(3, 2, ii++)); mvGraph2.AddVerticesAndEdge(new TaggedEdge<int, int>(4, 3, ii++)); mvGraph2.AddVerticesAndEdge(new TaggedEdge<int, int>(5, 4, ii++)); mvGraph2.AddVerticesAndEdge(new TaggedEdge<int, int>(0, 5, ii++)); mvGraph2.AddVerticesAndEdge(new TaggedEdge<int, int>(5, 2, ii++)); var test1 = new HoffmanPavleyRankedShortestPathAlgorithm<int, TaggedEdge<int, int>>(mvGraph2, E => 1.0); test1.ShortestPathCount = 5; test1.Compute(5, 2); Console.WriteLine("path: {0}", test1.ComputedShortestPathCount); foreach (var path in test1.ComputedShortestPaths) { foreach(var edge in path) Console.Write(edge + ":"); Console.WriteLine(); } }
public void ReadGraph(TextReader reader) { var g = new BidirectionalGraph<MyType, IEdge<MyType>>(); try { var csv = new CsvHelper.CsvReader(reader); while (csv.Read()) { if (!csv.CurrentRecord.Any()) { continue; } var node = csv.CurrentRecord.First(); var edges = csv.CurrentRecord.Skip(1) .Where(x => !string.IsNullOrEmpty(x)) .Select(x => x.Trim()) .Where(x => !string.IsNullOrEmpty(x)); foreach (var edge in edges) { g.AddVerticesAndEdge(new Edge<MyType>(node, edge)); } } var dict = new Dictionary<int, HashSet<MyType>>(); HashSet<MyType> set; foreach (var v in g.Vertices) { var edgeCount = g.InEdges(v).Count(); if (!dict.TryGetValue(edgeCount, out set)) { set = new HashSet<MyType>(); dict.Add(edgeCount, set); } set.Add(v); } Graph = g; Summary = string.Join(Environment.NewLine, dict .OrderBy(kvp => kvp.Key) .Select(kvp => kvp.Key + ": " + string.Join(", ", kvp.Value))) + Environment.NewLine + Environment.NewLine + string.Join(Environment.NewLine, g.Vertices .Where(v => g.OutEdges(v).Count() != 3) .Select(v => v + ": " + g.OutEdges(v).Count())); //Summary = string.Join( // Environment.NewLine, // graph.Vertices // .OrderBy(x => graph.InEdges(x).Count()) // .Select(v => v + ": " + graph.InEdges(v).Count())); } catch (Exception e) { Summary = "Failed to read:" + Environment.NewLine + e; } }
public void ContainsEdgeTest2() { var bd = new BidirectionalGraph<int, IEdge<int>>(); var e12 = new EquatableEdge<int>(1, 2); var f12 = new EquatableEdge<int>(1, 2); var e21 = new EquatableEdge<int>(2, 1); var f21 = new EquatableEdge<int>(2, 1); bd.AddVerticesAndEdge(e12); ContainsEdgeAssertions(bd, e12, f12, e21, f21); var u = new UndirectedBidirectionalGraph<int, IEdge<int>>(bd); UndirectedGraphTest.ContainsEdgeAssertions(u, e12, f12, e21, f21); }