protected static void ContainsEdge_SourceTarget_UndirectedGraph_Test(
            [NotNull] IMutableUndirectedGraph <int, Edge <int> > graph)
        {
            var edge1 = new Edge <int>(1, 2);
            var edge2 = new Edge <int>(1, 3);
            var edge3 = new Edge <int>(2, 2);

            Assert.IsFalse(graph.ContainsEdge(1, 2));
            Assert.IsFalse(graph.ContainsEdge(2, 1));

            graph.AddVerticesAndEdge(edge1);
            Assert.IsTrue(graph.ContainsEdge(1, 2));
            Assert.IsTrue(graph.ContainsEdge(2, 1));

            graph.AddVerticesAndEdge(edge2);
            Assert.IsTrue(graph.ContainsEdge(1, 3));
            Assert.IsTrue(graph.ContainsEdge(3, 1));

            graph.AddVerticesAndEdge(edge3);
            Assert.IsTrue(graph.ContainsEdge(2, 2));

            // Vertices is not present in the graph
            Assert.IsFalse(graph.ContainsEdge(0, 4));
            Assert.IsFalse(graph.ContainsEdge(1, 4));
            Assert.IsFalse(graph.ContainsEdge(4, 1));
        }
        void IMutableUndirectedGraph <TVertex, TEdge> .ClearAdjacentEdges(TVertex vertex)
        {
            IMutableUndirectedGraph <TVertex, TEdge> ithis = this;

            Contract.Requires(vertex != null);
            Contract.Ensures(ithis.AdjacentDegree(vertex) == 0);
        }
Exemple #3
0
 /// <summary>
 /// Fills the given <paramref name="graph"/> with <paramref name="vertexCount"/> vertices
 /// and <paramref name="edgeCount"/> edges created randomly between vertices (undirected graph).
 /// </summary>
 /// <typeparam name="TVertex">Vertex type.</typeparam>
 /// <typeparam name="TEdge">Edge type.</typeparam>
 /// <param name="graph">Graph to fill.</param>
 /// <param name="vertexFactory">Vertex factory method.</param>
 /// <param name="edgeFactory">Edge factory method.</param>
 /// <param name="rng">Random number generator.</param>
 /// <param name="vertexCount">Number of vertices to create.</param>
 /// <param name="edgeCount">Number of edges to create.</param>
 /// <param name="selfEdges">Indicates if self edge are allowed.</param>
 public static void Create <TVertex, TEdge>(
     [NotNull] IMutableUndirectedGraph <TVertex, TEdge> graph,
     [NotNull, InstantHandle] VertexFactory <TVertex> vertexFactory,
     [NotNull, InstantHandle] EdgeFactory <TVertex, TEdge> edgeFactory,
     [NotNull] Random rng,
     int vertexCount,
     int edgeCount,
     bool selfEdges)
     where TEdge : IEdge <TVertex>
 {
     CreateInternal(graph, vertexFactory, edgeFactory, rng, vertexCount, edgeCount, selfEdges);
 }
 /// <summary>
 /// Fills the given <paramref name="graph"/> with <paramref name="vertexCount"/> vertices
 /// and <paramref name="edgeCount"/> edges created randomly between vertices (undirected graph).
 /// </summary>
 /// <typeparam name="TVertex">Vertex type.</typeparam>
 /// <typeparam name="TEdge">Edge type.</typeparam>
 /// <param name="graph">Graph to fill.</param>
 /// <param name="vertexFactory">Vertex factory method.</param>
 /// <param name="edgeFactory">Edge factory method.</param>
 /// <param name="rng">Random number generator.</param>
 /// <param name="vertexCount">Number of vertices to create.</param>
 /// <param name="edgeCount">Number of edges to create.</param>
 /// <param name="selfEdges">Indicates if self edge are allowed.</param>
 public static void Create <TVertex, TEdge>(
     IMutableUndirectedGraph <TVertex, TEdge> graph,
     VertexFactory <TVertex> vertexFactory,
     EdgeFactory <TVertex, TEdge> edgeFactory,
     Random rng,
     int vertexCount,
     int edgeCount,
     bool selfEdges
     )
     where TEdge : IEdge <TVertex>
 {
     CreateInternal(graph, vertexFactory, edgeFactory, rng, vertexCount, edgeCount, selfEdges);
 }
        int IMutableUndirectedGraph <TVertex, TEdge> .RemoveAdjacentEdgeIf(
            TVertex vertex,
            EdgePredicate <TVertex, TEdge> predicate)
        {
            IMutableUndirectedGraph <TVertex, TEdge> ithis = this;

            Contract.Requires(vertex != null);
            Contract.Requires(predicate != null);
            Contract.Ensures(Contract.Result <int>() == Contract.OldValue(Enumerable.Count(ithis.AdjacentEdges(vertex), e => predicate(e))));
            Contract.Ensures(Enumerable.All(ithis.AdjacentEdges(vertex), v => !predicate(v)));

            return(default(int));
        }
        protected static void AdjacentEdge_Throws_Test(
            [NotNull] IMutableUndirectedGraph <int, Edge <int> > graph)
        {
            const int vertex1 = 1;
            const int vertex2 = 2;

            // ReSharper disable ReturnValueOfPureMethodIsNotUsed
            Assert.Throws <VertexNotFoundException>(() => graph.AdjacentEdge(vertex1, 0));

            graph.AddVertex(vertex1);
            graph.AddVertex(vertex2);
            AssertIndexOutOfRange(() => graph.AdjacentEdge(vertex1, 0));

            graph.AddEdge(new Edge <int>(1, 2));
            AssertIndexOutOfRange(() => graph.AdjacentEdge(vertex1, 5));
            // ReSharper restore ReturnValueOfPureMethodIsNotUsed
        }
        public static void Create <TVertex, TEdge>(
            IMutableUndirectedGraph <TVertex, TEdge> g,
            VertexFactory <TVertex> vertexFactory,
            EdgeFactory <TVertex, TEdge> edgeFactory,
            Random rnd,
            int vertexCount,
            int edgeCount,
            bool selfEdges
            ) where TEdge : IEdge <TVertex>
        {
            //Contract.Requires(g != null);
            //Contract.Requires(vertexFactory != null);
            //Contract.Requires(edgeFactory != null);
            //Contract.Requires(rnd != null);
            //Contract.Requires(vertexCount > 0);
            //Contract.Requires(edgeCount >= 0);
            //Contract.Requires(
            //   !(!g.AllowParallelEdges && !selfEdges) ||
            //   edgeCount <= vertexCount * (vertexCount - 1) / 2
            //   );

            var vertices = new TVertex[vertexCount];

            for (int i = 0; i < vertexCount; ++i)
            {
                g.AddVertex(vertices[i] = vertexFactory());
            }

            TVertex a;
            TVertex b;
            int     j = 0;

            while (j < edgeCount)
            {
                a = vertices[rnd.Next(vertexCount)];
                do
                {
                    b = vertices[rnd.Next(vertexCount)];
                }while (selfEdges == false && a.Equals(b));

                if (g.AddEdge(edgeFactory(a, b)))
                {
                    ++j;
                }
            }
        }
        protected static void AdjacentEdge_Test(
            [NotNull] IMutableUndirectedGraph <int, Edge <int> > graph)
        {
            var edge11 = new Edge <int>(1, 1);
            var edge12 = new Edge <int>(1, 2);
            var edge13 = new Edge <int>(1, 3);
            var edge24 = new Edge <int>(2, 4);
            var edge33 = new Edge <int>(3, 3);
            var edge41 = new Edge <int>(4, 1);

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

            Assert.AreSame(edge11, graph.AdjacentEdge(1, 0));
            Assert.AreSame(edge13, graph.AdjacentEdge(1, 2));
            Assert.AreSame(edge41, graph.AdjacentEdge(1, 3));
            Assert.AreSame(edge13, graph.AdjacentEdge(3, 0));
            Assert.AreSame(edge33, graph.AdjacentEdge(3, 1));
            Assert.AreSame(edge24, graph.AdjacentEdge(4, 0));
        }
        protected static void AdjacentEdges_Test(
            [NotNull] IMutableUndirectedGraph <int, Edge <int> > graph)
        {
            var edge12 = new Edge <int>(1, 2);
            var edge13 = new Edge <int>(1, 3);
            var edge14 = new Edge <int>(1, 4);
            var edge24 = new Edge <int>(2, 4);
            var edge31 = new Edge <int>(3, 1);
            var edge33 = new Edge <int>(3, 3);

            graph.AddVertex(1);
            AssertNoAdjacentEdge(graph, 1);

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

            AssertHasAdjacentEdges(graph, 1, new[] { edge12, edge13, edge14, edge31 });
            AssertHasAdjacentEdges(graph, 2, new[] { edge12, edge24 });
            AssertHasAdjacentEdges(graph, 3, new[] { edge13, edge31, edge33 }, 4);  // Has self edge counting twice
            AssertHasAdjacentEdges(graph, 4, new[] { edge14, edge24 });
            AssertNoAdjacentEdge(graph, 5);
        }
Exemple #10
0
        protected static void TryGetEdge_UndirectedGraph_Test(
            [NotNull] IMutableUndirectedGraph <int, Edge <int> > graph)
        {
            var edge1 = new Edge <int>(1, 2);
            var edge2 = new Edge <int>(1, 2);
            var edge3 = new Edge <int>(1, 3);
            var edge4 = new Edge <int>(2, 2);
            var edge5 = new Edge <int>(2, 4);
            var edge6 = new Edge <int>(3, 1);
            var edge7 = new Edge <int>(5, 2);

            graph.AddVerticesAndEdgeRange(new[] { edge1, edge2, edge3, edge4, edge5, edge6, edge7 });

            Assert.IsFalse(graph.TryGetEdge(0, 10, out _));
            Assert.IsFalse(graph.TryGetEdge(0, 1, out _));

            Assert.IsTrue(graph.TryGetEdge(2, 4, out Edge <int> gotEdge));
            Assert.AreSame(edge5, gotEdge);

            Assert.IsTrue(graph.TryGetEdge(1, 2, out gotEdge));
            Assert.AreSame(edge1, gotEdge);

            Assert.IsTrue(graph.TryGetEdge(2, 2, out gotEdge));
            Assert.AreSame(edge4, gotEdge);

            // 1 -> 2 is present in this undirected graph
            Assert.IsTrue(graph.TryGetEdge(2, 1, out gotEdge));
            Assert.AreSame(edge1, gotEdge);

            Assert.IsTrue(graph.TryGetEdge(5, 2, out gotEdge));
            Assert.AreSame(edge7, gotEdge);

            // 5 -> 2 is present in this undirected graph
            Assert.IsTrue(graph.TryGetEdge(2, 5, out gotEdge));
            Assert.AreSame(edge7, gotEdge);
        }