コード例 #1
0
        public void Merge1()
        {
            var edge13    = new EquatableEdge <int>(1, 3);
            var edge13Bis = new EquatableEdge <int>(1, 3);
            var edge21    = new EquatableEdge <int>(2, 1);
            var edge23    = new EquatableEdge <int>(2, 3);
            var edge34    = new EquatableEdge <int>(3, 4);
            var edge35    = new EquatableEdge <int>(3, 5);
            var edge35Bis = new EquatableEdge <int>(3, 5);
            var edge45    = new EquatableEdge <int>(4, 5);

            Merge_Test(
                new[] { 1, 2, 3, 4, 5 },
                new[] { edge13, edge13Bis, edge21, edge23, edge34, edge35, edge35Bis, edge45 },
                3,
                9,
                6,
                new[]
            {
                edge21, edge45,
                new EquatableEdge <int>(1, 4),
                new EquatableEdge <int>(1, 5),
                new EquatableEdge <int>(1, 5),

                new EquatableEdge <int>(1, 4),
                new EquatableEdge <int>(1, 5),
                new EquatableEdge <int>(1, 5),

                new EquatableEdge <int>(2, 4),
                new EquatableEdge <int>(2, 5),
                new EquatableEdge <int>(2, 5)
            });
        }
コード例 #2
0
        protected static void AddEdge_EquatableEdge_ForbiddenParallelEdges_Test(
            [NotNull] BidirectionalMatrixGraph <EquatableEdge <int> > graph)
        {
            int edgeAdded = 0;

            AssertNoEdge(graph);
            // ReSharper disable once ParameterOnlyUsedForPreconditionCheck.Local
            graph.EdgeAdded += e =>
            {
                Assert.IsNotNull(e);
                ++edgeAdded;
            };

            // Edge 1
            var edge1 = new EquatableEdge <int>(1, 2);

            Assert.IsTrue(graph.AddEdge(edge1));
            Assert.AreEqual(1, edgeAdded);
            AssertHasEdges(graph, new[] { edge1 });

            // Edge 2
            var edge2 = new EquatableEdge <int>(2, 1);

            Assert.IsTrue(graph.AddEdge(edge2));
            Assert.AreEqual(2, edgeAdded);
            AssertHasEdges(graph, new[] { edge1, edge2 });

            // Edge 3 self edge
            var edge3 = new EquatableEdge <int>(2, 2);

            Assert.IsTrue(graph.AddEdge(edge3));
            Assert.AreEqual(3, edgeAdded);
            AssertHasEdges(graph, new[] { edge1, edge2, edge3 });
        }
コード例 #3
0
        protected static void AddEdge_EquatableEdge_ForbiddenParallelEdges_Test(
            BidirectionalMatrixGraph <EquatableEdge <int> > graph)
        {
            int edgeAdded = 0;

            AssertNoEdge(graph);
            graph.EdgeAdded += e =>
            {
                Assert.IsNotNull(e);
                ++edgeAdded;
            };

            // Edge 1
            var edge1 = new EquatableEdge <int>(1, 2);

            Assert.IsTrue(graph.AddEdge(edge1));
            Assert.AreEqual(1, edgeAdded);
            AssertHasEdges(graph, new[] { edge1 });

            // Edge 2
            var edge2 = new EquatableEdge <int>(2, 1);

            Assert.IsTrue(graph.AddEdge(edge2));
            Assert.AreEqual(2, edgeAdded);
            AssertHasEdges(graph, new[] { edge1, edge2 });

            // Edge 3 self edge
            var edge3 = new EquatableEdge <int>(2, 2);

            Assert.IsTrue(graph.AddEdge(edge3));
            Assert.AreEqual(3, edgeAdded);
            AssertHasEdges(graph, new[] { edge1, edge2, edge3 });
        }
コード例 #4
0
        public void TransitiveClosure_IsolatedVertices()
        {
            const string vertex1 = "/test";
            const string vertex2 = "/test/123";
            const string vertex3 = "/test/456";
            const string vertex4 = "/test/notlinked";
            var          edge12  = new EquatableEdge <string>(vertex1, vertex2);
            var          edge23  = new EquatableEdge <string>(vertex2, vertex3);

            var graph = new BidirectionalGraph <string, EquatableEdge <string> >();

            graph.AddVertexRange(new[] { vertex1, vertex2, vertex3, vertex4 });
            graph.AddEdgeRange(new[] { edge12, edge23 });

            BidirectionalGraph <string, EquatableEdge <string> > result = graph.ComputeTransitiveClosure((u, v) => new EquatableEdge <string>(u, v));

            AssertHasVertices(result, new[] { vertex1, vertex2, vertex3, vertex4 });
            AssertHasEdges(
                result,
                new[]
            {
                edge12,
                new EquatableEdge <string>(vertex1, vertex3),
                edge23
            });
        }
コード例 #5
0
        public void ObjectToString()
        {
            var edge1 = new EquatableEdge <int>(1, 2);
            var edge2 = new EquatableEdge <int>(2, 1);

            Assert.AreEqual("1 -> 2", edge1.ToString());
            Assert.AreEqual("2 -> 1", edge2.ToString());
        }
コード例 #6
0
        protected static void RemoveEdge_EquatableEdge_EdgesOnly_Test(
            [NotNull] EdgeListGraph <int, EquatableEdge <int> > graph)
        {
            int edgesRemoved = 0;

            // ReSharper disable once ParameterOnlyUsedForPreconditionCheck.Local
            graph.EdgeRemoved += e =>
            {
                Assert.IsNotNull(e);
                // ReSharper disable once AccessToModifiedClosure
                ++edgesRemoved;
            };

            var edge12         = new EquatableEdge <int>(1, 2);
            var edge13         = new EquatableEdge <int>(1, 3);
            var edge14         = new EquatableEdge <int>(1, 4);
            var edge24         = new EquatableEdge <int>(2, 4);
            var edge31         = new EquatableEdge <int>(3, 1);
            var edge33         = new EquatableEdge <int>(3, 3);
            var edgeNotInGraph = new EquatableEdge <int>(3, 4);
            var edgeEquatable  = new EquatableEdge <int>(1, 2);

            graph.AddVerticesAndEdgeRange(new[] { edge12, edge13, edge14, edge24, edge31, edge33 });

            Assert.IsFalse(graph.RemoveEdge(edgeNotInGraph));
            CheckCounter(0);

            Assert.IsTrue(graph.RemoveEdge(edgeEquatable));
            CheckCounter(1);
            AssertHasVertices(graph, new[] { 1, 2, 3, 4 });
            AssertHasEdges(graph, new[] { edge13, edge14, edge24, edge31, edge33 });

            Assert.IsTrue(graph.RemoveEdge(edge13));
            CheckCounter(1);
            AssertHasVertices(graph, new[] { 1, 2, 3, 4 });
            AssertHasEdges(graph, new[] { edge14, edge24, edge31, edge33 });

            Assert.IsTrue(graph.RemoveEdge(edge31));
            CheckCounter(1);
            AssertHasVertices(graph, new[] { 1, 2, 3, 4 });
            AssertHasEdges(graph, new[] { edge14, edge24, edge33 });

            Assert.IsTrue(graph.RemoveEdge(edge14));
            Assert.IsTrue(graph.RemoveEdge(edge24));
            Assert.IsTrue(graph.RemoveEdge(edge33));
            CheckCounter(3);
            AssertEmptyGraph(graph);    // Vertices removed in the same time as edges

            #region Local function

            void CheckCounter(int expectedRemovedEdges)
            {
                Assert.AreEqual(expectedRemovedEdges, edgesRemoved);
                edgesRemoved = 0;
            }

            #endregion
        }
コード例 #7
0
        protected static void ContainsEdge_EquatableEdge_Test(
            [NotNull] IEdgeSet <int, EquatableEdge <int> > graph,
            [NotNull, InstantHandle] Action <EquatableEdge <int> > addVerticesAndEdge)
        {
            var edge1      = new EquatableEdge <int>(1, 2);
            var edge2      = new EquatableEdge <int>(1, 3);
            var edge3      = new EquatableEdge <int>(2, 1);
            var edge4      = new EquatableEdge <int>(2, 2);
            var otherEdge1 = new EquatableEdge <int>(1, 2);

            Assert.IsFalse(graph.ContainsEdge(edge1));
            Assert.IsFalse(graph.ContainsEdge(edge2));
            Assert.IsFalse(graph.ContainsEdge(edge3));
            Assert.IsFalse(graph.ContainsEdge(edge4));
            Assert.IsFalse(graph.ContainsEdge(otherEdge1));

            addVerticesAndEdge(edge1);
            Assert.IsTrue(graph.ContainsEdge(edge1));
            Assert.IsFalse(graph.ContainsEdge(edge2));
            Assert.IsFalse(graph.ContainsEdge(edge3));
            Assert.IsFalse(graph.ContainsEdge(edge4));
            Assert.IsTrue(graph.ContainsEdge(otherEdge1));

            addVerticesAndEdge(edge2);
            Assert.IsTrue(graph.ContainsEdge(edge1));
            Assert.IsTrue(graph.ContainsEdge(edge2));
            Assert.IsFalse(graph.ContainsEdge(edge3));
            Assert.IsFalse(graph.ContainsEdge(edge4));
            Assert.IsTrue(graph.ContainsEdge(otherEdge1));

            addVerticesAndEdge(edge3);
            Assert.IsTrue(graph.ContainsEdge(edge1));
            Assert.IsTrue(graph.ContainsEdge(edge2));
            Assert.IsTrue(graph.ContainsEdge(edge3));
            Assert.IsFalse(graph.ContainsEdge(edge4));
            Assert.IsTrue(graph.ContainsEdge(otherEdge1));

            addVerticesAndEdge(edge4);
            Assert.IsTrue(graph.ContainsEdge(edge1));
            Assert.IsTrue(graph.ContainsEdge(edge2));
            Assert.IsTrue(graph.ContainsEdge(edge3));
            Assert.IsTrue(graph.ContainsEdge(edge4));
            Assert.IsTrue(graph.ContainsEdge(otherEdge1));

            addVerticesAndEdge(otherEdge1);
            Assert.IsTrue(graph.ContainsEdge(edge1));
            Assert.IsTrue(graph.ContainsEdge(edge2));
            Assert.IsTrue(graph.ContainsEdge(edge3));
            Assert.IsTrue(graph.ContainsEdge(edge4));
            Assert.IsTrue(graph.ContainsEdge(otherEdge1));

            // Both vertices not in graph
            Assert.IsFalse(graph.ContainsEdge(new EquatableEdge <int>(0, 10)));
            // Source not in graph
            Assert.IsFalse(graph.ContainsEdge(new EquatableEdge <int>(0, 1)));
            // Target not in graph
            Assert.IsFalse(graph.ContainsEdge(new EquatableEdge <int>(1, 0)));
        }
コード例 #8
0
        protected static void ContainsEdge_EquatableEdge_EdgesOnly_Test(
            [NotNull] EdgeListGraph <int, EquatableEdge <int> > graph)
        {
            var edge1      = new EquatableEdge <int>(1, 2);
            var edge2      = new EquatableEdge <int>(1, 3);
            var edge3      = new EquatableEdge <int>(2, 1);
            var edge4      = new EquatableEdge <int>(2, 2);
            var otherEdge1 = new EquatableEdge <int>(1, 2);

            Assert.IsFalse(graph.ContainsEdge(edge1));
            Assert.IsFalse(graph.ContainsEdge(edge2));
            Assert.IsFalse(graph.ContainsEdge(edge3));
            Assert.IsFalse(graph.ContainsEdge(edge4));
            Assert.IsFalse(graph.ContainsEdge(otherEdge1));

            graph.AddVerticesAndEdge(edge1);
            Assert.IsTrue(graph.ContainsEdge(edge1));
            Assert.IsFalse(graph.ContainsEdge(edge2));
            Assert.IsFalse(graph.ContainsEdge(edge3));
            Assert.IsFalse(graph.ContainsEdge(edge4));
            Assert.IsTrue(graph.ContainsEdge(otherEdge1));

            graph.AddVerticesAndEdge(edge2);
            Assert.IsTrue(graph.ContainsEdge(edge1));
            Assert.IsTrue(graph.ContainsEdge(edge2));
            Assert.IsFalse(graph.ContainsEdge(edge3));
            Assert.IsFalse(graph.ContainsEdge(edge4));
            Assert.IsTrue(graph.ContainsEdge(otherEdge1));

            graph.AddVerticesAndEdge(edge3);
            Assert.IsTrue(graph.ContainsEdge(edge1));
            Assert.IsTrue(graph.ContainsEdge(edge2));
            Assert.IsTrue(graph.ContainsEdge(edge3));
            Assert.IsFalse(graph.ContainsEdge(edge4));
            Assert.IsTrue(graph.ContainsEdge(otherEdge1));

            graph.AddVerticesAndEdge(edge4);
            Assert.IsTrue(graph.ContainsEdge(edge1));
            Assert.IsTrue(graph.ContainsEdge(edge2));
            Assert.IsTrue(graph.ContainsEdge(edge3));
            Assert.IsTrue(graph.ContainsEdge(edge4));
            Assert.IsTrue(graph.ContainsEdge(otherEdge1));

            graph.AddVerticesAndEdge(otherEdge1);
            Assert.IsTrue(graph.ContainsEdge(edge1));
            Assert.IsTrue(graph.ContainsEdge(edge2));
            Assert.IsTrue(graph.ContainsEdge(edge3));
            Assert.IsTrue(graph.ContainsEdge(edge4));
            Assert.IsTrue(graph.ContainsEdge(otherEdge1));

            // Both vertices not in graph
            Assert.IsFalse(graph.ContainsEdge(new EquatableEdge <int>(0, 10)));
            // Source not in graph
            Assert.IsFalse(graph.ContainsEdge(new EquatableEdge <int>(0, 1)));
            // Target not in graph
            Assert.IsFalse(graph.ContainsEdge(new EquatableEdge <int>(1, 0)));
        }
コード例 #9
0
        public TestCase AddDirectedEdge(String source, String target, double weight)
        {
            var e = new EquatableEdge <String>(source, target);

            Graph.AddEdge(e);
            WeightsDict.Add(e, weight);

            return(this);
        }
コード例 #10
0
        public void Hashcode()
        {
            var edge1 = new EquatableEdge <int>(1, 2);
            var edge2 = new EquatableEdge <int>(1, 2);
            var edge3 = new EquatableEdge <int>(2, 1);

            Assert.AreEqual(edge1.GetHashCode(), edge2.GetHashCode());
            Assert.AreNotEqual(edge1.GetHashCode(), edge3.GetHashCode());
        }
コード例 #11
0
        private static IBuilder FindSolutionRootBuilder(ISet<EquatableEdge<IBuilder>> graph, EquatableEdge<IBuilder> edge)
        {
            var msbuild = (MSBuildRunner)edge.Source;
            IBuilder result = FollowMergingSources(graph, msbuild);

            log.DebugFormat("Found solution root builder for {0}: {1}", edge.Target, result);

            return result;
        }
コード例 #12
0
        public void RemoveEdgeTest()
        {
            var g = new EdgeListGraph <int, EquatableEdge <int> >(true, false);
            EquatableEdge <int> e = new EquatableEdge <int>(0, 1);

            g.AddEdge(e);
            Assert.IsTrue(g.RemoveEdge(e));
            Assert.IsFalse(g.RemoveEdge(e));
        }
コード例 #13
0
            public TestCase AddDirectedEdge([NotNull] string source, [NotNull] string target, double weight)
            {
                var edge = new EquatableEdge <string>(source, target);

                Graph.AddEdge(edge);
                _weightsDict.Add(edge, weight);

                return(this);
            }
コード例 #14
0
        public void Merge3()
        {
            var edge34 = new EquatableEdge <int>(3, 4);

            Merge_Test(
                new[] { 1, 2, 3, 4 },
                new[] { edge34 },
                1,
                0,
                0,
                new[] { edge34 });
        }
コード例 #15
0
        public void ContainsEdge_DirectedEdge()
        {
            var graph = new UndirectedGraph <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);

            graph.AddVerticesAndEdge(e12);

            ContainsEdgeAssertions(graph, e12, f12, e21, f21);
        }
コード例 #16
0
        public void ContainsEdgeTest2()
        {
            var u   = new UndirectedGraph <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);

            u.AddVerticesAndEdge(e12);

            ContainsEdgeAssertions(u, e12, f12, e21, f21);
        }
コード例 #17
0
        public void Equals()
        {
            var edge1 = new EquatableEdge <int>(1, 2);
            var edge2 = new EquatableEdge <int>(1, 2);
            var edge3 = new EquatableEdge <int>(2, 1);

            Assert.AreEqual(edge1, edge1);
            Assert.AreEqual(edge1, edge2);
            Assert.AreNotEqual(edge1, edge3);

            Assert.AreNotEqual(edge1, null);
        }
コード例 #18
0
        public void Equals()
        {
            var edge1 = new EquatableEdge <int>(1, 2);
            var edge2 = new EquatableEdge <int>(1, 2);
            var edge3 = new EquatableEdge <int>(2, 1);

            Assert.AreEqual(edge1, edge1);
            Assert.AreEqual(edge1, edge2);
            Assert.IsTrue(edge1.Equals((object)edge2));
            Assert.AreNotEqual(edge1, edge3);

            Assert.IsFalse(edge1.Equals(null));
            Assert.AreNotEqual(edge1, null);
        }
コード例 #19
0
        protected static void ContainsEdge_EquatableEdges_ForbiddenParallelEdges_ImmutableVertices_Test(
            [NotNull] IMutableEdgeListGraph <int, EquatableEdge <int> > graph)
        {
            var edge1      = new EquatableEdge <int>(1, 2);
            var edge2      = new EquatableEdge <int>(1, 3);
            var edge3      = new EquatableEdge <int>(2, 1);
            var edge4      = new EquatableEdge <int>(2, 2);
            var otherEdge1 = new EquatableEdge <int>(1, 2);

            Assert.IsFalse(graph.ContainsEdge(edge1));
            Assert.IsFalse(graph.ContainsEdge(edge2));
            Assert.IsFalse(graph.ContainsEdge(edge3));
            Assert.IsFalse(graph.ContainsEdge(edge4));
            Assert.IsFalse(graph.ContainsEdge(otherEdge1));

            graph.AddEdge(edge1);
            Assert.IsTrue(graph.ContainsEdge(edge1));
            Assert.IsFalse(graph.ContainsEdge(edge2));
            Assert.IsFalse(graph.ContainsEdge(edge3));
            Assert.IsFalse(graph.ContainsEdge(edge4));
            Assert.IsTrue(graph.ContainsEdge(otherEdge1));

            graph.AddEdge(edge2);
            Assert.IsTrue(graph.ContainsEdge(edge1));
            Assert.IsTrue(graph.ContainsEdge(edge2));
            Assert.IsFalse(graph.ContainsEdge(edge3));
            Assert.IsFalse(graph.ContainsEdge(edge4));
            Assert.IsTrue(graph.ContainsEdge(otherEdge1));

            graph.AddEdge(edge3);
            Assert.IsTrue(graph.ContainsEdge(edge1));
            Assert.IsTrue(graph.ContainsEdge(edge2));
            Assert.IsTrue(graph.ContainsEdge(edge3));
            Assert.IsFalse(graph.ContainsEdge(edge4));
            Assert.IsTrue(graph.ContainsEdge(otherEdge1));

            graph.AddEdge(edge4);
            Assert.IsTrue(graph.ContainsEdge(edge1));
            Assert.IsTrue(graph.ContainsEdge(edge2));
            Assert.IsTrue(graph.ContainsEdge(edge3));
            Assert.IsTrue(graph.ContainsEdge(edge4));
            Assert.IsTrue(graph.ContainsEdge(otherEdge1));

            // Both vertices not in graph
            Assert.IsFalse(graph.ContainsEdge(new EquatableEdge <int>(10, 11)));
            // Source not in graph
            Assert.IsFalse(graph.ContainsEdge(new EquatableEdge <int>(10, 1)));
            // Target not in graph
            Assert.IsFalse(graph.ContainsEdge(new EquatableEdge <int>(1, 10)));
        }
コード例 #20
0
        public void MergeIf3()
        {
            var edge34 = new EquatableEdge <int>(3, 4);

            MergeIf_Test(
                new[] { 1, 2, 3, 4 },
                new[] { edge34 },
                vertex => vertex == 1 || vertex == 2,
                1 + 1,
                0 + 0,
                0 + 0,
                new[] { 3, 4 },
                new[] { edge34 });
        }
コード例 #21
0
        public void MergeIf4()
        {
            var edge34 = new EquatableEdge <int>(3, 4);

            MergeIf_Test(
                new[] { 1, 2, 3, 4 },
                new[] { edge34 },
                vertex => vertex == 1 || vertex == 3,
                1 + 1,
                0 + 0,
                0 + 1,
                new[] { 2, 4 },
                Enumerable.Empty <EquatableEdge <int> >());
        }
コード例 #22
0
        private bool CutRedundantSolutionBuilds(ISet <EquatableEdge <IBuilder> > graph)
        {
            log.Debug("### Cutting redundant solution builds");

            var slnBuilders    = new HashSet <SlnBuilder>(graph.Select(edge => edge.Target).OfType <SlnBuilder>());
            var rootBuilderMap = graph
                                 .Where(edge => edge.Source is MSBuildRunner && slnBuilders.Contains(edge.Target))
                                 .ToDictionary(edge => (SlnBuilder)edge.Target, edge => FindSolutionRootBuilder(graph, edge));

            if (slnBuilders.Any())
            {
                foreach (var slnBuilder in slnBuilders)
                {
                    if (rootBuilderMap.ContainsKey(slnBuilder))
                    {
                        var projectSet           = new HashSet <Project>(slnBuilder.Projects);
                        var childProjectBuilders = new HashSet <ISlnProjectBuilder>(slnBuilder
                                                                                    .Prerequisites
                                                                                    .OfType <ISlnProjectBuilder>());

                        foreach (var projectBuilder in childProjectBuilders)
                        {
                            foreach (var dep in projectBuilder.Prerequisites.OfType <SuiteReferenceBuilder>().ToList())
                            {
                                if (dep.Reference.Type == ReferenceType.Build &&
                                    projectSet.Contains(dep.ReferencedProject))
                                {
                                    log.DebugFormat(
                                        "Project {0}'s reference {1} can be replaced to in-solution-reference in {2}",
                                        projectBuilder.Project, dep, slnBuilder);

                                    // All sln project builders belonging to `slnBuilder` must replace their reference to dep to a
                                    // new in solution reference builder (both in the builder and in the graph)
                                    ReplaceWithInSolutionReference(graph, childProjectBuilders, dep);

                                    // All edges from dep must be removed and a single new edge to the MSBuild runner belonging to this `slnBuilder` added
                                    RemoveEdgesWhereSourceIs(graph, dep);

                                    var newEdge = new EquatableEdge <IBuilder>(dep, rootBuilderMap[slnBuilder]);
                                    AddEdge(graph, newEdge);
                                }
                            }
                        }
                    }
                }
            }

            return(true);
        }
コード例 #23
0
        protected static void AddEdge_NoParallelEdges_EquatableEdge_UndirectedGraph_Test <TGraph>([NotNull] TGraph graph)
            where TGraph : IMutableVertexSet <int>, IMutableEdgeListGraph <int, EquatableEdge <int> >
        {
            int edgeAdded = 0;

            graph.AddVertex(1);
            graph.AddVertex(2);

            AssertNoEdge(graph);
            // ReSharper disable once ParameterOnlyUsedForPreconditionCheck.Local
            graph.EdgeAdded += e =>
            {
                Assert.IsNotNull(e);
                ++edgeAdded;
            };

            // Edge 1
            var edge1 = new EquatableEdge <int>(1, 2);

            Assert.IsTrue(graph.AddEdge(edge1));
            Assert.AreEqual(1, edgeAdded);
            AssertHasEdges(graph, new[] { edge1 });

            // Edge 2
            var edge2 = new EquatableEdge <int>(1, 2);

            Assert.IsFalse(graph.AddEdge(edge2));
            Assert.AreEqual(1, edgeAdded);
            AssertHasEdges(graph, new[] { edge1 });

            // Edge 3
            var edge3 = new EquatableEdge <int>(2, 1);

            Assert.IsFalse(graph.AddEdge(edge3));   // Parallel to edge 1
            Assert.AreEqual(1, edgeAdded);
            AssertHasEdges(graph, new[] { edge1 });

            // Edge 1 bis
            Assert.IsFalse(graph.AddEdge(edge1));
            Assert.AreEqual(1, edgeAdded);
            AssertHasEdges(graph, new[] { edge1 });

            // Edge 4 self edge
            var edge4 = new EquatableEdge <int>(2, 2);

            Assert.IsTrue(graph.AddEdge(edge4));
            Assert.AreEqual(2, edgeAdded);
            AssertHasEdges(graph, new[] { edge1, edge4 });
        }
コード例 #24
0
        public void removeIsolatedVertices()
        {
            var graph = new UndirectedGraph <int, IEdge <int> >();

            graph.AddVertex(1);
            var edge = new EquatableEdge <int>(2, 3);

            graph.AddVerticesAndEdge(edge);
            graph.RemoveVertexIf(graph.IsAdjacentEdgesEmpty);
            Assert.IsTrue(graph.ContainsVertex(2));
            Assert.IsTrue(graph.ContainsEdge(edge));
            Assert.IsTrue(graph.ContainsEdge(2, 3));
            Assert.IsTrue(graph.ContainsEdge(3, 2));
            Assert.IsFalse(graph.ContainsVertex(1));
        }
コード例 #25
0
        void AddNewBranch(ISet <EquatableEdge <IBuilder> > graph, IBuilder rootBuilder)
        {
            log.DebugFormat("Adding new node: {0}", rootBuilder);
            graph.Add(new EquatableEdge <IBuilder>(rootBuilder, rootBuilder));
            foreach (var prereq in rootBuilder.Prerequisites)
            {
                var newEdge = new EquatableEdge <IBuilder>(rootBuilder, prereq);

                if (!graph.Contains(newEdge))
                {
                    AddEdge(graph, newEdge);
                    AddNewBranch(graph, prereq);
                }
            }
        }
コード例 #26
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));
        }
コード例 #27
0
ファイル: Task.cs プロジェクト: fjsnogueira/QuickGraph-1
        public bool Split(out Task <TVertex, TEdge> taskTake, out Task <TVertex, TEdge> taskDrop)
        {
            if (!canSplit())
            {
                taskTake = null;
                taskDrop = null;
                return(false);
            }

            TEdge edgeForSplit = this.chooseEdgeForSplit();
            var   v1           = edgeForSplit.Source;
            var   v2           = edgeForSplit.Target;

            var graphTake   = this._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 (var outEdge in graphTake.OutEdges(v1))
            {
                weightsTake.Remove(outEdge);
            }

            foreach (var 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);
            taskTake.TaskName = "Take" + edgeForSplit.ToString();

            var graphDrop   = this._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);
            taskDrop.TaskName = "Drop" + edgeForSplit.ToString();

            return(true);
        }
コード例 #28
0
        protected static void AddEdge_NoParallelEdges_EquatableEdge_Test <TGraph>(TGraph graph)
            where TGraph : IMutableVertexSet <int>, IMutableEdgeListGraph <int, EquatableEdge <int> >
        {
            int edgeAdded = 0;

            graph.AddVertex(1);
            graph.AddVertex(2);

            AssertNoEdge(graph);
            graph.EdgeAdded += e =>
            {
                Assert.IsNotNull(e);
                ++edgeAdded;
            };

            // Edge 1
            var edge1 = new EquatableEdge <int>(1, 2);

            Assert.IsTrue(graph.AddEdge(edge1));
            Assert.AreEqual(1, edgeAdded);
            AssertHasEdges(graph, new[] { edge1 });

            // Edge 2
            var edge2 = new EquatableEdge <int>(1, 2);

            Assert.IsFalse(graph.AddEdge(edge2));
            Assert.AreEqual(1, edgeAdded);
            AssertHasEdges(graph, new[] { edge1 });

            // Edge 3
            var edge3 = new EquatableEdge <int>(2, 1);

            Assert.IsTrue(graph.AddEdge(edge3));
            Assert.AreEqual(2, edgeAdded);
            AssertHasEdges(graph, new[] { edge1, edge3 });

            // Edge 1 bis
            Assert.IsFalse(graph.AddEdge(edge1));
            Assert.AreEqual(2, edgeAdded);
            AssertHasEdges(graph, new[] { edge1, edge3 });

            // Edge 4 self edge
            var edge4 = new EquatableEdge <int>(2, 2);

            Assert.IsTrue(graph.AddEdge(edge4));
            Assert.AreEqual(3, edgeAdded);
            AssertHasEdges(graph, new[] { edge1, edge3, edge4 });
        }
コード例 #29
0
        public void toBidirectionalGraphTest()
        {
            var graph = new UndirectedGraph <int, IEdge <int> >();

            graph.AddVertex(1);
            var edge = new EquatableEdge <int>(2, 3);

            graph.AddVerticesAndEdge(edge);
            var bidirectionalGraph = graph.ToBidirectionalGraph();

            Assert.IsTrue(bidirectionalGraph.ContainsVertex(1));
            Assert.IsTrue(bidirectionalGraph.ContainsVertex(2));
            Assert.IsTrue(bidirectionalGraph.ContainsVertex(3));
            Assert.IsTrue(bidirectionalGraph.ContainsEdge(2, 3));
            Assert.IsFalse(bidirectionalGraph.ContainsEdge(3, 2));
        }
コード例 #30
0
        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);
        }
コード例 #31
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 => reverseEdge.Equals(edge));

            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);
        }
コード例 #32
0
 public void Prim12240WithDelegate()
 {
     var vertices = new int[]{ 1,2,3,4};
     var g = vertices.ToDelegateUndirectedGraph(
         delegate(int v, out IEnumerable<EquatableEdge<int>> ov)
         {
             switch (v)
             {
                 case 1: ov = new EquatableEdge<int>[] { new EquatableEdge<int>(1, 2), new EquatableEdge<int>(1, 4) }; break;
                 case 2: ov = new EquatableEdge<int>[] { new EquatableEdge<int>(1, 2), new EquatableEdge<int>(3, 2) }; break;
                 case 3: ov = new EquatableEdge<int>[] { new EquatableEdge<int>(3, 2), new EquatableEdge<int>(3, 4) }; break;
                 case 4: ov = new EquatableEdge<int>[] { new EquatableEdge<int>(1, 4), new EquatableEdge<int>(3, 4) }; break;
                 default: ov = null; break;
             }
             return ov != null;
         });
     var cost = CompareRoot(g);
     Assert.AreEqual(9, cost);
 }
コード例 #33
0
        private bool CutRedundantSolutionBuilds(ISet<EquatableEdge<IBuilder>> graph)
        {
            log.Debug("### Cutting redundant solution builds");

            var slnBuilders = new HashSet<SlnBuilder>(graph.Select(edge => edge.Target).OfType<SlnBuilder>());
            var rootBuilderMap = graph
                .Where(edge => edge.Source is MSBuildRunner && slnBuilders.Contains(edge.Target))
                .ToDictionary(edge => (SlnBuilder)edge.Target, edge => FindSolutionRootBuilder(graph, edge));

            if (slnBuilders.Any())
            {
                foreach (var slnBuilder in slnBuilders)
                {
                    if (rootBuilderMap.ContainsKey(slnBuilder))
                    {
                        var projectSet = new HashSet<Project>(slnBuilder.Projects);
                        var childProjectBuilders = new HashSet<ISlnProjectBuilder>(slnBuilder
                            .Prerequisites
                            .OfType<ISlnProjectBuilder>());

                        foreach (var projectBuilder in childProjectBuilders)
                        {
                            foreach (var dep in projectBuilder.Prerequisites.OfType<SuiteReferenceBuilder>().ToList())
                            {
                                if (dep.Reference.Type == ReferenceType.Build &&
                                    projectSet.Contains(dep.ReferencedProject))
                                {
                                    log.DebugFormat(
                                        "Project {0}'s reference {1} can be replaced to in-solution-reference in {2}",
                                        projectBuilder.Project, dep, slnBuilder);

                                    // All sln project builders belonging to `slnBuilder` must replace their reference to dep to a
                                    // new in solution reference builder (both in the builder and in the graph)
                                    ReplaceWithInSolutionReference(graph, childProjectBuilders, dep);

                                    // All edges from dep must be removed and a single new edge to the MSBuild runner belonging to this `slnBuilder` added
                                    RemoveEdgesWhereSourceIs(graph, dep);

                                    var newEdge = new EquatableEdge<IBuilder>(dep, rootBuilderMap[slnBuilder]);
                                    AddEdge(graph, newEdge);
                                }
                            }
                        }
                    }
                }
            }

            return true;
        }
コード例 #34
0
ファイル: TSPTest.cs プロジェクト: auduchinok/QuickGraph
        public TestCase AddDirectedEdge(String source, String target, double weight)
        {
            var e = new EquatableEdge<String>(source, target);
            Graph.AddEdge(e);
            WeightsDict.Add(e, weight);

            return this;
        }
コード例 #35
0
        void AddNewBranch(ISet<EquatableEdge<IBuilder>> graph, IBuilder rootBuilder)
        {
            log.DebugFormat("Adding new node: {0}", rootBuilder);
            graph.Add(new EquatableEdge<IBuilder>(rootBuilder, rootBuilder));
            foreach (var prereq in rootBuilder.Prerequisites)
            {
                var newEdge = new EquatableEdge<IBuilder>(rootBuilder, prereq);

                if (!graph.Contains(newEdge))
                {
                    AddEdge(graph, newEdge);
                    AddNewBranch(graph, prereq);
                }
            }
        }
コード例 #36
0
 private static void AddEdge(ISet<EquatableEdge<IBuilder>> graph, EquatableEdge<IBuilder> newEdge)
 {
     log.DebugFormat("-> adding edge {0}", newEdge);
     newEdge.Source.AddPrerequisite(newEdge.Target);
     graph.Add(newEdge);
 }
コード例 #37
0
        private void RerouteEdgesTargeting(ISet<EquatableEdge<IBuilder>> graph, ISet<IBuilder> originalTargets, IBuilder replacementTarget)
        {
            log.DebugFormat("-> Rerouting edges targeting {0} to {1}", string.Join(", ", originalTargets), replacementTarget);

            var edgesToRemove = new HashSet<EquatableEdge<IBuilder>>();
            var edgesToAdd = new HashSet<EquatableEdge<IBuilder>>();
            foreach (var edge in graph)
            {
                if (originalTargets.Contains(edge.Target) && edge.Target != edge.Source && edge.Target != replacementTarget)
                {
                    edgesToRemove.Add(edge);

                    var newEdge = new EquatableEdge<IBuilder>(edge.Source, replacementTarget);
                    edgesToAdd.Add(newEdge);
                }
            }

            RemoveEdges(graph, edgesToRemove);
            foreach (var edge in edgesToAdd)
                AddEdge(graph, edge);
        }
コード例 #38
0
        void ReplaceWithInSolutionReference(ISet<EquatableEdge<IBuilder>> graph, IEnumerable<ISlnProjectBuilder> childProjectBuilders, SuiteReferenceBuilder dep)
        {
            var inSolutionRef = inSolutionReferenceBuilderFactory.CreateInSolutionReferenceBuilder(dep.ReferencedProject);
            inSolutionRef.Reference = dep.Reference;

            foreach (var builder in childProjectBuilders)
            {
                builder.RemovePrerequisite(dep);

                var edgesToModify = new HashSet<EquatableEdge<IBuilder>>(graph.Where(edge => edge.Source == builder && edge.Target == dep));
                RemoveEdges(graph, edgesToModify);

                foreach (var edge in edgesToModify)
                {
                    var newEdge = new EquatableEdge<IBuilder>(edge.Source, inSolutionRef);
                    AddEdge(graph, newEdge);
                }
            }
        }