/// <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); }
/// <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); }
/// <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); } } }
bool System.Collections.Generic.IDictionary <TVertex, IEdgeList <TVertex, TEdge> > .TryGetValue(TVertex key, out IEdgeList <TVertex, TEdge> value) { throw new NotImplementedException(); }
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(); }