diff --git a/Graph/DirectedGraph.cs b/Graph/DirectedGraph.cs index 58a1085..72e2d0c 100644 --- a/Graph/DirectedGraph.cs +++ b/Graph/DirectedGraph.cs @@ -20,6 +20,25 @@ namespace MoonTools.Core.Graph } } + public virtual void AddEdge(TNode v, TNode u, TEdgeData edgeData) + { + CheckNodes(v, u); + + if (v.Equals(u)) { throw new ArgumentException("Self-edges are not allowed in a simple graph. Use a multigraph instead"); } + + neighbors[v].Add(u); + edges.Add((v, u)); + edgeToEdgeData.Add((v, u), edgeData); + } + + public virtual void AddEdges(params (TNode, TNode, TEdgeData)[] edges) + { + foreach (var edge in edges) + { + AddEdge(edge.Item1, edge.Item2, edge.Item3); + } + } + public void RemoveNode(TNode node) { CheckNodes(node); @@ -45,25 +64,6 @@ namespace MoonTools.Core.Graph neighbors.Remove(node); } - public virtual void AddEdge(TNode v, TNode u, TEdgeData edgeData) - { - CheckNodes(v, u); - - if (v.Equals(u)) { throw new ArgumentException("Self-edges are not allowed in a simple graph. Use a multigraph instead"); } - - neighbors[v].Add(u); - edges.Add((v, u)); - edgeToEdgeData.Add((v, u), edgeData); - } - - public virtual void AddEdges(params (TNode, TNode, TEdgeData)[] edges) - { - foreach (var edge in edges) - { - AddEdge(edge.Item1, edge.Item2, edge.Item3); - } - } - public virtual void RemoveEdge(TNode v, TNode u) { CheckEdge(v, u); @@ -469,12 +469,9 @@ namespace MoonTools.Core.Graph return subGraph; } - public virtual void Clear() + public override void Clear() { - nodes.Clear(); - neighbors.Clear(); - edges.Clear(); - edgeToEdgeData.Clear(); + base.Clear(); } } } diff --git a/Graph/DirectedWeightedGraph.cs b/Graph/DirectedWeightedGraph.cs index d592f94..b88ba4c 100644 --- a/Graph/DirectedWeightedGraph.cs +++ b/Graph/DirectedWeightedGraph.cs @@ -6,17 +6,24 @@ using MoreLinq; namespace MoonTools.Core.Graph { - public class DirectedWeightedGraph : DirectedGraph where TNode : System.IEquatable + public class DirectedWeightedGraph : SimpleGraph where TNode : System.IEquatable { protected Dictionary<(TNode, TNode), int> weights = new Dictionary<(TNode, TNode), int>(); - public void AddEdge(TNode v, TNode u, int weight, TEdgeData data) + public void AddEdge(TNode v, TNode u, int weight, TEdgeData edgeData) { - base.AddEdge(v, u, data); + CheckNodes(v, u); + + if (v.Equals(u)) { throw new ArgumentException("Self-edges are not allowed in a simple graph. Use a multigraph instead"); } + + neighbors[v].Add(u); + edges.Add((v, u)); + edgeToEdgeData.Add((v, u), edgeData); + weights.Add((v, u), weight); } - public void AddEdges(params (TNode, TNode, int, TEdgeData)[] edges) + public void AddEdges(params (TNode, TNode, int weight, TEdgeData)[] edges) { foreach (var edge in edges) { diff --git a/Graph/Graph.cs b/Graph/Graph.cs index 0423230..8e7be07 100644 --- a/Graph/Graph.cs +++ b/Graph/Graph.cs @@ -1,11 +1,12 @@ using System.Collections.Generic; +using Collections.Pooled; namespace MoonTools.Core.Graph { abstract public class Graph where TNode : System.IEquatable { protected HashSet nodes = new HashSet(); - protected Dictionary> neighbors = new Dictionary>(); + protected Dictionary> neighbors = new Dictionary>(); public IEnumerable Nodes => nodes; @@ -16,7 +17,7 @@ namespace MoonTools.Core.Graph if (!Exists(node)) { nodes.Add(node); - neighbors.Add(node, new HashSet()); + neighbors.Add(node, new PooledSet(ClearMode.Always)); } } @@ -56,5 +57,10 @@ namespace MoonTools.Core.Graph } } + public virtual void Clear() + { + nodes.Clear(); + neighbors.Clear(); + } } } \ No newline at end of file diff --git a/Graph/SimpleGraph.cs b/Graph/SimpleGraph.cs index 062d891..2e9c6c7 100644 --- a/Graph/SimpleGraph.cs +++ b/Graph/SimpleGraph.cs @@ -29,5 +29,12 @@ namespace MoonTools.Core.Graph CheckNodes(v, u); if (!Exists(v, u)) { throw new ArgumentException($"Edge between vertex {v} and vertex {u} does not exist in the graph"); } } + + public override void Clear() + { + base.Clear(); + edges.Clear(); + edgeToEdgeData.Clear(); + } } } \ No newline at end of file