public void Should_be_able_to_break_cycles_by_removing_any_removable_cycle_edge()
            {
                var clonedGraph = _graph.Clone();

                clonedGraph.Edges.Any(Is_B_to_C2).ShouldBeTrue();
                var removedEdges = clonedGraph.BreakCycles(Is_B_to_C2);

                clonedGraph.Edges.Any(Is_B_to_C2).ShouldBeFalse("Removable edge B-to-C2 was not removed.");
                clonedGraph.Edges.Count().ShouldBe(_graph.Edges.Count() - 1);
                removedEdges.Single(Is_B_to_C2).ShouldNotBeNull();

                clonedGraph = _graph.Clone();
                clonedGraph.Edges.Any(Is_C2_to_E2).ShouldBeTrue();
                removedEdges = clonedGraph.BreakCycles(Is_C2_to_E2);
                clonedGraph.Edges.Any(Is_C2_to_E2).ShouldBeFalse("Removable edge C2-to-E2 was not removed.");
                clonedGraph.Edges.Count().ShouldBe(_graph.Edges.Count() - 1);
                removedEdges.Single(Is_C2_to_E2).ShouldNotBeNull();

                clonedGraph = _graph.Clone();
                clonedGraph.Edges.Any(Is_E2_to_B).ShouldBeTrue();
                removedEdges = clonedGraph.BreakCycles(Is_E2_to_B);
                clonedGraph.Edges.Any(Is_E2_to_B).ShouldBeFalse("Removable edge E2-to-B was not removed.");
                clonedGraph.Edges.Count().ShouldBe(_graph.Edges.Count() - 1);
                removedEdges.Single(Is_E2_to_B).ShouldNotBeNull();
            }
            public void Should_be_able_to_break_the_cycles()
            {
                var clonedGraph = _graph.Clone();

                IReadOnlyList <IEdge <string> > removedEdges = null;

                Should.NotThrow(() =>
                {
                    removedEdges = clonedGraph.BreakCycles(e => true);

                    Console.WriteLine("Removed edges:");
                    foreach (IEdge <string> removedEdge in removedEdges)
                    {
                        Console.WriteLine(removedEdge);
                    }
                });
                Should.NotThrow(() => clonedGraph.ValidateGraph());

                clonedGraph.Edges.Count().ShouldBe(_graph.Edges.Count() - 4);

                removedEdges.Count().ShouldBe(4);
                removedEdges.SingleOrDefault(a => a.Source == "E2" && a.Target == "B").ShouldNotBeNull();
                removedEdges.SingleOrDefault(a => a.Source == "D2" && a.Target == "A").ShouldNotBeNull();
                removedEdges.SingleOrDefault(a => a.Source == "C1" && a.Target == "C1").ShouldNotBeNull();
                removedEdges.SingleOrDefault(a => a.Source == "B" && a.Target == "B").ShouldNotBeNull();
            }
Ejemplo n.º 3
0
        private static IEnumerable <ResourceLoadOrder> GetGroupedLoadOrder(
            BidirectionalGraph <Resource, AssociationViewEdge> resourceGraph)
        {
            int groupNumber = 1;

            var executionGraph = resourceGraph.Clone();

            var loadableResources = GetLoadableResources();

            while (loadableResources.Any())
            {
                foreach (Resource loadableResource in loadableResources)
                {
                    executionGraph.RemoveVertex(loadableResource);

                    yield return(new ResourceLoadOrder
                    {
                        Resource = GetNodeId(loadableResource),
                        Order = groupNumber
                    });
                }

                groupNumber++;

                loadableResources = GetLoadableResources();
            }

            List <Resource> GetLoadableResources()
            {
                return(executionGraph.Vertices.Where(v => !executionGraph.InEdges(v).Any())
                       .OrderBy(GetNodeId)
                       .ToList());
            }
        }
Ejemplo n.º 4
0
        private BidirectionalGraph <DataVertex, DataEdge> RemoveEdge(BidirectionalGraph <DataVertex, DataEdge> old, DataEdge edgeRemoving)
        {
            // get copy of the grapth using Serialization and Deserialization
            var copyGraph = old.Clone();

            // remove the edge
            foreach (var edge in copyGraph.Edges)
            {
                if (edge == edgeRemoving)
                {
                    copyGraph.RemoveEdge(edge);
                    break;
                }
            }

            // get all edges but the removing one
            var oldEdges = new List <DataEdge>();

            foreach (var edge in old.Edges)
            {
                if (edge != edgeRemoving)
                {
                    oldEdges.Add(edge);
                }
            }

            return(copyGraph);
        }
        public void Clone()
        {
            var graph = new BidirectionalGraph <int, Edge <int> >();

            graph.AddVertexRange(new[] { 1, 2, 3 });
            graph.AddEdge(new Edge <int>(1, 2));
            graph.AddEdge(new Edge <int>(2, 3));
            graph.AddEdge(new Edge <int>(3, 1));

            Assert.AreEqual(3, graph.VertexCount);
            Assert.AreEqual(3, graph.EdgeCount);

            var clonedGraph = graph.Clone();

            Assert.AreEqual(3, clonedGraph.VertexCount);
            Assert.AreEqual(3, clonedGraph.EdgeCount);

            clonedGraph.AddVertexRange(new[] { 10, 11, 12, 13 });
            clonedGraph.AddEdge(new Edge <int>(10, 11));

            Assert.AreEqual(7, clonedGraph.VertexCount);
            Assert.AreEqual(4, clonedGraph.EdgeCount);

            int edgeCount = clonedGraph.Edges.Count();

            Assert.AreEqual(4, edgeCount);

            Assert.AreEqual(3, graph.VertexCount);
            Assert.AreEqual(3, graph.EdgeCount);
        }
Ejemplo n.º 6
0
        public void CloneTest()
        {
            var g = new BidirectionalGraph<int, Edge<int>>();
            g.AddVertexRange(new int[3] {1, 2, 3});
            g.AddEdge(new Edge<int>(1, 2));
            g.AddEdge(new Edge<int>(2, 3));
            g.AddEdge(new Edge<int>(3, 1));

            Assert.AreEqual(3, g.VertexCount);
            Assert.AreEqual(3, g.EdgeCount);

            var h = g.Clone();

            Assert.AreEqual(3, h.VertexCount);
            Assert.AreEqual(3, h.EdgeCount);

            h.AddVertexRange(new int[4] { 10, 11, 12, 13 });
            h.AddEdge(new Edge<int>(10, 11));

            Assert.AreEqual(7, h.VertexCount);
            Assert.AreEqual(4, h.EdgeCount);

            var i = 0;
            foreach (var e in h.Edges)
                i++;

            Assert.AreEqual(4, i);

            Assert.AreEqual(3, g.VertexCount);
            Assert.AreEqual(3, g.EdgeCount);
        }
Ejemplo n.º 7
0
        private ImmutableBidirectionalGraph <TVertex, TEdge> CloneAndMutate(Action <BidirectionalGraph <TVertex, TEdge> > mutatorAction)
        {
            var graph = _graph.Clone();

            mutatorAction.Invoke(graph);
            return(CreateInstance(graph));
        }
Ejemplo n.º 8
0
        public bool Split(out Task <TVertex, TEdge> taskTake, out Task <TVertex, TEdge> taskDrop)
        {
            if (!CanSplit())
            {
                taskTake = null;
                taskDrop = null;
                return(false);
            }

            TEdge   edgeForSplit = ChooseEdgeForSplit();
            TVertex v1           = edgeForSplit.Source;
            TVertex v2           = edgeForSplit.Target;

            BidirectionalGraph <TVertex, TEdge> graphTake = _graph.Clone();
            var weightsTake = new Dictionary <EquatableEdge <TVertex>, double>(_weight);
            var reverseEdge = new EquatableEdge <TVertex>(edgeForSplit.Target, edgeForSplit.Source);

            weightsTake.Remove(reverseEdge);
            graphTake.RemoveEdgeIf(edge => edge.Equals(reverseEdge));

            foreach (TEdge outEdge in graphTake.OutEdges(v1))
            {
                weightsTake.Remove(outEdge);
            }

            foreach (TEdge inEdge in graphTake.InEdges(v2))
            {
                weightsTake.Remove(inEdge);
            }

            graphTake.ClearOutEdges(v1);
            graphTake.ClearInEdges(v2);
            var pathTake = new BidirectionalGraph <TVertex, TEdge>(Path);

            pathTake.AddEdge(edgeForSplit);
            taskTake = new Task <TVertex, TEdge>(graphTake, weightsTake, pathTake, MinCost, $"Take{edgeForSplit}");

            BidirectionalGraph <TVertex, TEdge> graphDrop = _graph.Clone();
            var weightsDrop = new Dictionary <EquatableEdge <TVertex>, double>(_weight);

            weightsDrop.Remove(edgeForSplit);
            graphDrop.RemoveEdge(edgeForSplit);
            taskDrop = new Task <TVertex, TEdge>(graphDrop, weightsDrop, new BidirectionalGraph <TVertex, TEdge>(Path), MinCost, $"Drop{edgeForSplit}");

            return(true);
        }
Ejemplo n.º 9
0
        private BidirectionalGraph <TVertexId, VertexIdEdge <TVertexId, TEdgeId> > CloneAndMutateGraph(
            [NotNull] Action <BidirectionalGraph <TVertexId, VertexIdEdge <TVertexId, TEdgeId> > > mutatorAction)
        {
            var graph = _graph.Clone();

            mutatorAction.Invoke(graph);
            return(graph);
        }
        public void Clone()
        {
            var graph = new BidirectionalGraph <int, Edge <int> >();

            AssertEmptyGraph(graph);

            var clonedGraph = graph.Clone();

            Assert.IsNotNull(clonedGraph);
            AssertEmptyGraph(clonedGraph);

            clonedGraph = new BidirectionalGraph <int, Edge <int> >(graph);
            Assert.IsNotNull(clonedGraph);
            AssertEmptyGraph(clonedGraph);

            clonedGraph = (BidirectionalGraph <int, Edge <int> >)((ICloneable)graph).Clone();
            Assert.IsNotNull(clonedGraph);
            AssertEmptyGraph(clonedGraph);

            var edge1 = new Edge <int>(1, 2);
            var edge2 = new Edge <int>(1, 3);
            var edge3 = new Edge <int>(2, 3);

            graph.AddVerticesAndEdgeRange(new[] { edge1, edge2, edge3 });
            AssertHasVertices(graph, new[] { 1, 2, 3 });
            AssertHasEdges(graph, new[] { edge1, edge2, edge3 });

            clonedGraph = graph.Clone();
            Assert.IsNotNull(clonedGraph);
            AssertHasVertices(clonedGraph, new[] { 1, 2, 3 });
            AssertHasEdges(clonedGraph, new[] { edge1, edge2, edge3 });

            clonedGraph = new BidirectionalGraph <int, Edge <int> >(graph);
            Assert.IsNotNull(clonedGraph);
            AssertHasVertices(clonedGraph, new[] { 1, 2, 3 });
            AssertHasEdges(clonedGraph, new[] { edge1, edge2, edge3 });

            clonedGraph = (BidirectionalGraph <int, Edge <int> >)((ICloneable)graph).Clone();
            Assert.IsNotNull(clonedGraph);
            AssertHasVertices(clonedGraph, new[] { 1, 2, 3 });
            AssertHasEdges(clonedGraph, new[] { edge1, edge2, edge3 });
        }
            public void Should_be_able_to_break_the_cycle_by_removing_the_self_referencing_edge()
            {
                var clonedGraph = _graph.Clone();

                var removedEdges = clonedGraph.BreakCycles(e => true);

                clonedGraph.Edges.Count().ShouldBe(_graph.Edges.Count() - 1);

                removedEdges.Count().ShouldBe(1);
                removedEdges.SingleOrDefault(a => a.Source == "C" && a.Target == "C").ShouldNotBeNull();
            }
Ejemplo n.º 12
0
        public void NextStep()
        {
            _steps.Push(_graph.Clone());

            var v = _graph.Vertices.First();

            _graph.RemoveVertex(v);
            ShowResults();

            if (!_graph.Vertices.Any())
            {
                _hasFinished = true;
            }
        }
Ejemplo n.º 13
0
        public void CloneTest()
        {
            var g = new BidirectionalGraph <int, Edge <int> >();

            g.AddVertexRange(new int[3] {
                1, 2, 3
            });
            g.AddEdge(new Edge <int>(1, 2));
            g.AddEdge(new Edge <int>(2, 3));
            g.AddEdge(new Edge <int>(3, 1));

            Assert.AreEqual(3, g.VertexCount);
            Assert.AreEqual(3, g.EdgeCount);

            var h = g.Clone();

            Assert.AreEqual(3, h.VertexCount);
            Assert.AreEqual(3, h.EdgeCount);

            h.AddVertexRange(new int[4] {
                10, 11, 12, 13
            });
            h.AddEdge(new Edge <int>(10, 11));

            Assert.AreEqual(7, h.VertexCount);
            Assert.AreEqual(4, h.EdgeCount);

            var i = 0;

            foreach (var e in h.Edges)
            {
                i++;
            }

            Assert.AreEqual(4, i);

            Assert.AreEqual(3, g.VertexCount);
            Assert.AreEqual(3, g.EdgeCount);
        }
Ejemplo n.º 14
0
 public MutableGraph <R> Cast <R>(Func <V, R> selector, Func <R, bool> condition) where R : class
 {
     return(graph.Clone(selector, condition));
 }