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));
                }
            }
Пример #4
0
        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();
        }
Пример #5
0
        /// <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);
        }
Пример #7
0
        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);
        }
Пример #11
0
        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)));
                            }
                        }
                    }
                }
            }
Пример #13
0
        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();
            }
        }
Пример #14
0
        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();
            }
        }
Пример #15
0
        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);
        }