/// <summary>
        /// Removes the given <paramref name="vertex"/> and merges all its connection to other vertices.
        /// </summary>
        /// <param name="vertex">The vertex.</param>
        /// <param name="edgeFactory">Factory method to create an edge.</param>
        /// <exception cref="T:System.ArgumentNullException"><paramref name="vertex"/> is <see langword="null"/>.</exception>
        /// <exception cref="T:System.ArgumentNullException"><paramref name="edgeFactory"/> is <see langword="null"/>.</exception>
        /// <exception cref="VertexNotFoundException"><paramref name="vertex"/> is not part of the graph.</exception>
        public void MergeVertex(
            [NotNull] TVertex vertex,
            [NotNull, InstantHandle] EdgeFactory<TVertex, TEdge> edgeFactory)
        {
            if (vertex == null)
                throw new ArgumentNullException(nameof(vertex));
            if (edgeFactory is null)
                throw new ArgumentNullException(nameof(edgeFactory));

            // Storing edges (not a copy)
            // Remove vertex will delete some of these edges
            // but it will remain needed edges to perform the merge
            if (!_vertexInEdges.TryGetValue(vertex, out IEdgeList<TVertex, TEdge> inEdges))
                throw new VertexNotFoundException();
            IEdgeList<TVertex, TEdge> outEdges = _vertexOutEdges[vertex];

            // Remove vertex
            RemoveVertex(vertex);

            // Add edges from each source to each target
            foreach (TVertex source in inEdges.Select(source => source.Source))
            {
                IEnumerable<TVertex> targets = outEdges
                    .Where(target => !EqualityComparer<TVertex>.Default.Equals(vertex, target.Target))
                    .Select(target => target.Target);
                foreach (TVertex target in targets)
                {
                    // We add an new edge
                    AddEdgeInternal(edgeFactory(source, target));
                }
            }
        }
        /// <inheritdoc />
        public void ClearAdjacentEdges(TVertex vertex)
        {
            if (vertex == null)
            {
                throw new ArgumentNullException(nameof(vertex));
            }

            if (_adjacentEdges.TryGetValue(vertex, out IEdgeList <TVertex, TEdge> adjacentEdges))
            {
                IEdgeList <TVertex, TEdge> edgesToRemove = adjacentEdges.Clone();
                adjacentEdges.Clear();
                EdgeCount -= edgesToRemove.Count;
                Debug.Assert(EdgeCount >= 0);

                foreach (TEdge edge in edgesToRemove)
                {
                    if (_adjacentEdges.TryGetValue(edge.Target, out adjacentEdges))
                    {
                        adjacentEdges.Remove(edge);
                    }

                    if (_adjacentEdges.TryGetValue(edge.Source, out adjacentEdges))
                    {
                        adjacentEdges.Remove(edge);
                    }

                    _edges.Remove(edge);
                }

                NotifyEdgesRemoved(edgesToRemove);
            }
        }
        /// <inheritdoc />
        public void ClearAdjacentEdges(TVertex vertex)
        {
            if (vertex == null)
            {
                throw new ArgumentNullException(nameof(vertex));
            }

            if (!_adjacentEdges.TryGetValue(vertex, out IEdgeList <TVertex, TEdge> adjacentEdges))
            {
                return;
            }

            IEdgeList <TVertex, TEdge> edgesToRemove = adjacentEdges.Clone();

            EdgeCount -= edgesToRemove.Count;

            foreach (TEdge edge in edgesToRemove)
            {
                if (_adjacentEdges.TryGetValue(edge.Target, out adjacentEdges))
                {
                    adjacentEdges.Remove(edge);
                }

                if (_adjacentEdges.TryGetValue(edge.Source, out adjacentEdges))
                {
                    adjacentEdges.Remove(edge);
                }

                _edges.Remove(edge);
                OnEdgeRemoved(edge);
            }
        }
        /// <inheritdoc />
        public bool AddVerticesAndEdge(TEdge edge)
        {
            if (edge == null)
            {
                throw new ArgumentNullException(nameof(edge));
            }

            IEdgeList <TVertex, TEdge> sourceEdges = AddAndReturnEdges(edge.Source);
            IEdgeList <TVertex, TEdge> targetEdges = AddAndReturnEdges(edge.Target);

            if (!AllowParallelEdges && ContainsEdgeBetweenVertices(sourceEdges, edge))
            {
                return(false);
            }

            _edges.Add(edge);
            sourceEdges.Add(edge);
            if (!edge.IsSelfEdge())
            {
                targetEdges.Add(edge);
            }

            ++EdgeCount;
            OnEdgeAdded(edge);

            return(true);
        }
        /// <inheritdoc />
        public int RemoveOutEdgeIf(TVertex vertex, EdgePredicate <TVertex, TEdge> predicate)
        {
            if (vertex == null)
            {
                throw new ArgumentNullException(nameof(vertex));
            }
            if (predicate is null)
            {
                throw new ArgumentNullException(nameof(predicate));
            }

            IEdgeList <TVertex, TEdge> edges = _vertexEdges[vertex];
            var edgesToRemove = new EdgeList <TVertex, TEdge>(edges.Count);

            edgesToRemove.AddRange(edges.Where(edge => predicate(edge)));

            foreach (TEdge edge in edgesToRemove)
            {
                edges.Remove(edge);
                OnEdgeRemoved(edge);
            }

            EdgeCount -= edgesToRemove.Count;

            return(edgesToRemove.Count);
        }
 public static byte[] MakeOutEdgesList(int src, IEdgeList<int, Edge<int>> OutEdges)
 {
     byte[] b = new byte[(OutEdges.Count + 2) * sizeof(int)];
     int i = 0;
     Buffer.BlockCopy(BitConverter.GetBytes(src), 0, b, i, sizeof(int));
     i += sizeof(int);
     foreach (var v in OutEdges) {
         Buffer.BlockCopy(BitConverter.GetBytes(v.GetOtherVertex(src)), 0, b, i, sizeof(int));
         i += sizeof(int);
     }
     Buffer.BlockCopy(BitConverter.GetBytes(BinaryGraphFileConstants.EndOfLine), 0, b, i, sizeof(int));
     return b;
 }
        /// <inheritdoc />
        public virtual bool RemoveVertex(TVertex vertex)
        {
            if (!ContainsVertex(vertex))
            {
                return(false);
            }

            // Remove out edges
            IEdgeList <TVertex, TEdge> edges = _vertexEdges[vertex];

            if (EdgeRemoved != null) // Lazily notify
            {
                foreach (TEdge edge in edges)
                {
                    OnEdgeRemoved(edge);
                }
            }

            EdgeCount -= edges.Count;
            edges.Clear();


            // Run over edges and remove each edge touching the vertex
            foreach (var pair in _vertexEdges)
            {
                if (pair.Key.Equals(vertex))
                {
                    continue; // We've already
                }
                // Collect edges to remove
                foreach (var edge in pair.Value.Clone())
                {
                    if (edge.Target.Equals(vertex))
                    {
                        pair.Value.Remove(edge);
                        OnEdgeRemoved(edge);
                        --EdgeCount;
                    }
                }
            }

            Debug.Assert(EdgeCount >= 0);

            _vertexEdges.Remove(vertex);
            OnVertexRemoved(vertex);

            return(true);
        }
Exemple #8
0
        /// <inheritdoc />
        public int RemoveAdjacentEdgeIf(TVertex vertex, EdgePredicate <TVertex, TEdge> predicate)
        {
            if (vertex == null)
            {
                throw new ArgumentNullException(nameof(vertex));
            }

            IEdgeList <TVertex, TEdge> outEdges = _adjacentEdges[vertex];
            var edges = new List <TEdge>(outEdges.Count);

            edges.AddRange(
                outEdges.Where(edge => predicate(edge)));

            RemoveEdges(edges);
            return(edges.Count);
        }
        /// <inheritdoc />
        public void ClearInEdges(TVertex vertex)
        {
            if (vertex == null)
            {
                throw new ArgumentNullException(nameof(vertex));
            }

            IEdgeList <TVertex, TEdge> inEdges = _vertexInEdges[vertex];

            foreach (TEdge edge in inEdges)
            {
                _vertexOutEdges[edge.Source].Remove(edge);
                OnEdgeRemoved(edge);
            }

            EdgeCount -= inEdges.Count;
            inEdges.Clear();
        }
        /// <summary>
        /// Removes the given <paramref name="vertex"/> and merges all its connection to other vertices.
        /// </summary>
        /// <param name="vertex">The vertex.</param>
        /// <param name="edgeFactory">Factory method to create an edge.</param>
        public void MergeVertex(
            [NotNull] TVertex vertex,
            [NotNull, InstantHandle] EdgeFactory <TVertex, TEdge> edgeFactory)
        {
            if (vertex == null)
            {
                throw new ArgumentNullException(nameof(vertex));
            }
            if (edgeFactory is null)
            {
                throw new ArgumentNullException(nameof(edgeFactory));
            }

            // Storing edges in local array
            IEdgeList <TVertex, TEdge> inEdges  = _vertexInEdges[vertex];
            IEdgeList <TVertex, TEdge> outEdges = _vertexOutEdges[vertex];

            // Remove vertex
            RemoveVertex(vertex);

            // Add edges from each source to each target
            foreach (TEdge source in inEdges)
            {
                // Is it a self edge?
                if (source.Source.Equals(vertex))
                {
                    continue;
                }

                foreach (TEdge target in outEdges)
                {
                    if (vertex.Equals(target.Target))
                    {
                        continue;
                    }

                    // We add an new edge
                    AddEdge(edgeFactory(source.Source, target.Target));
                }
            }
        }
        /// <inheritdoc />
        public void ClearOutEdges(TVertex vertex)
        {
            if (vertex == null)
            {
                throw new ArgumentNullException(nameof(vertex));
            }

            IEdgeList <TVertex, TEdge> edges = _vertexEdges[vertex];
            int count = edges.Count;

            if (EdgeRemoved != null) // Lazily notify
            {
                foreach (TEdge edge in edges)
                {
                    OnEdgeRemoved(edge);
                }
            }

            edges.Clear();
            EdgeCount -= count;
        }
        private IEnumerable<TEdge> RemoveInOutEdges([NotNull] TVertex vertex)
        {
            IEdgeList<TVertex, TEdge> outEdges = _vertexOutEdges[vertex];
            _vertexOutEdges.Remove(vertex);
            foreach (TEdge outEdge in outEdges)
            {
                _vertexInEdges[outEdge.Target].Remove(outEdge);
            }

            IEdgeList<TVertex, TEdge> inEdges = _vertexInEdges[vertex];
            _vertexInEdges.Remove(vertex);
            foreach (TEdge inEdge in inEdges)
            {
                _vertexOutEdges[inEdge.Source].Remove(inEdge);
            }

            EdgeCount -= outEdges.Count + inEdges.Count;
            Debug.Assert(EdgeCount >= 0);

            return outEdges.Concat(inEdges);
        }
        /// <summary>
        /// Removes the given <paramref name="vertex"/> and merges all its connection to other vertices.
        /// </summary>
        /// <param name="vertex">The vertex.</param>
        /// <param name="edgeFactory">Factory method to create an edge.</param>
        public void MergeVertex(
            TVertex vertex,
            EdgeFactory <TVertex, TEdge> edgeFactory)
        {
            if (vertex == null)
            {
                throw new ArgumentNullException(nameof(vertex));
            }
            if (edgeFactory is null)
            {
                throw new ArgumentNullException(nameof(edgeFactory));
            }

            // Storing edges (not a copy)
            // Remove vertex will delete some of these edges
            // but it will remain needed edges to perform the merge
            if (!_vertexInEdges.TryGetValue(vertex, out IEdgeList <TVertex, TEdge> inEdges))
            {
                throw new VertexNotFoundException();
            }
            IEdgeList <TVertex, TEdge> outEdges = _vertexOutEdges[vertex];

            // Remove vertex
            RemoveVertex(vertex);

            // Add edges from each source to each target
            foreach (TEdge source in inEdges)
            {
                foreach (TEdge target in outEdges)
                {
                    if (EqualityComparer <TVertex> .Default.Equals(vertex, target.Target))
                    {
                        continue;
                    }

                    // We add an new edge
                    AddEdgeInternal(edgeFactory(source.Source, target.Target));
                }
            }
        }
        /// <inheritdoc />
        public virtual bool RemoveVertex(TVertex vertex)
        {
            if (!ContainsVertex(vertex))
            {
                return(false);
            }

            // Remove out edges
            IEdgeList <TVertex, TEdge> edgesToRemove = _vertexEdges[vertex];

            _vertexEdges.Remove(vertex);
            EdgeCount -= edgesToRemove.Count;
            Debug.Assert(EdgeCount >= 0);

            // Remove in edges (Run over edges and remove each edge touching the vertex)
            RemoveInEdges(v => EqualityComparer <TVertex> .Default.Equals(v, vertex));

            NotifyEdgesRemoved(edgesToRemove);
            OnVertexRemoved(vertex);

            return(true);
        }
Exemple #15
0
        /// <inheritdoc />
        public void ClearAdjacentEdges(TVertex vertex)
        {
            if (vertex == null)
            {
                throw new ArgumentNullException(nameof(vertex));
            }

            IEdgeList <TVertex, TEdge> edges = _adjacentEdges[vertex].Clone();

            EdgeCount -= edges.Count;

            foreach (TEdge edge in edges)
            {
                if (_adjacentEdges.TryGetValue(edge.Target, out IEdgeList <TVertex, TEdge> aEdges))
                {
                    aEdges.Remove(edge);
                }

                if (_adjacentEdges.TryGetValue(edge.Source, out aEdges))
                {
                    aEdges.Remove(edge);
                }
            }
        }
Exemple #16
0
 bool System.Collections.Generic.IDictionary <TVertex, IEdgeList <TVertex, TEdge> > .TryGetValue(TVertex key, out IEdgeList <TVertex, TEdge> value)
 {
     throw new NotImplementedException();
 }
Exemple #17
0
 void System.Collections.Generic.IDictionary <TVertex, IEdgeList <TVertex, TEdge> > .Add(TVertex key, IEdgeList <TVertex, TEdge> value)
 {
     throw new NotImplementedException();
 }
 void IDictionary <TVertex, IEdgeList <TVertex, TEdge> > .Add(TVertex key, IEdgeList <TVertex, TEdge> value)
 {
     throw new NotImplementedException();
 }
 bool IDictionary <TVertex, IEdgeList <TVertex, TEdge> > .TryGetValue(TVertex key, out IEdgeList <TVertex, TEdge> value)
 {
     throw new NotImplementedException();
 }