private void MergeVertex(TVertex v)
        {
            // get in edges and outedge
            List <MergedEdge <TVertex, TEdge> > inEdges =
                new List <MergedEdge <TVertex, TEdge> >(this.CondensatedGraph.InEdges(v));
            List <MergedEdge <TVertex, TEdge> > outEdges =
                new List <MergedEdge <TVertex, TEdge> >(this.CondensatedGraph.OutEdges(v));

            // remove vertex
            this.CondensatedGraph.RemoveVertex(v);

            // add condensated edges
            for (int i = 0; i < inEdges.Count; ++i)
            {
                MergedEdge <TVertex, TEdge> inEdge = inEdges[i];
                if (inEdge.Source.Equals(v))
                {
                    continue;
                }

                for (int j = 0; j < outEdges.Count; ++j)
                {
                    MergedEdge <TVertex, TEdge> outEdge = outEdges[j];
                    if (outEdge.Target.Equals(v))
                    {
                        continue;
                    }

                    MergedEdge <TVertex, TEdge> newEdge =
                        MergedEdge <TVertex, TEdge> .Merge(inEdge, outEdge);

                    this.CondensatedGraph.AddEdge(newEdge);
                }
            }
        }
        protected override void InternalCompute()
        {
            // adding vertices to the new graph
            // and pusing filtered vertices in queue
            Queue <TVertex> filteredVertices = new Queue <TVertex>();

            foreach (TVertex v in this.VisitedGraph.Vertices)
            {
                this.CondensatedGraph.AddVertex(v);
                if (!this.VertexPredicate(v))
                {
                    filteredVertices.Enqueue(v);
                }
            }

            // adding all edges
            foreach (TEdge edge in this.VisitedGraph.Edges)
            {
                MergedEdge <TVertex, TEdge> mergedEdge = new MergedEdge <TVertex, TEdge>(edge.Source, edge.Target);
                mergedEdge.Edges.Add(edge);

                this.CondensatedGraph.AddEdge(mergedEdge);
            }

            // remove vertices
            while (filteredVertices.Count > 0)
            {
                TVertex filteredVertex = filteredVertices.Dequeue();

                // do the cross product between inedges and outedges
                MergeVertex(filteredVertex);
            }
        }
Ejemplo n.º 3
0
        public static MergedEdge <TVertex, TEdge> Merge(
            MergedEdge <TVertex, TEdge> inEdge,
            MergedEdge <TVertex, TEdge> outEdge
            )
        {
            MergedEdge <TVertex, TEdge> newEdge = new MergedEdge <TVertex, TEdge>(
                inEdge.Source, outEdge.Target);

            newEdge.edges = new List <TEdge>(inEdge.Edges.Count + outEdge.Edges.Count);
            newEdge.edges.AddRange(inEdge.Edges);
            newEdge.edges.AddRange(outEdge.edges);

            return(newEdge);
        }