addedge no longer inherited

master
Evan Hemsley 2019-10-23 18:28:14 -07:00
parent fcd9c23ecd
commit f2f1b8979b
4 changed files with 47 additions and 30 deletions

View File

@ -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) public void RemoveNode(TNode node)
{ {
CheckNodes(node); CheckNodes(node);
@ -45,25 +64,6 @@ namespace MoonTools.Core.Graph
neighbors.Remove(node); 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) public virtual void RemoveEdge(TNode v, TNode u)
{ {
CheckEdge(v, u); CheckEdge(v, u);
@ -469,12 +469,9 @@ namespace MoonTools.Core.Graph
return subGraph; return subGraph;
} }
public virtual void Clear() public override void Clear()
{ {
nodes.Clear(); base.Clear();
neighbors.Clear();
edges.Clear();
edgeToEdgeData.Clear();
} }
} }
} }

View File

@ -6,17 +6,24 @@ using MoreLinq;
namespace MoonTools.Core.Graph namespace MoonTools.Core.Graph
{ {
public class DirectedWeightedGraph<TNode, TEdgeData> : DirectedGraph<TNode, TEdgeData> where TNode : System.IEquatable<TNode> public class DirectedWeightedGraph<TNode, TEdgeData> : SimpleGraph<TNode, TEdgeData> where TNode : System.IEquatable<TNode>
{ {
protected Dictionary<(TNode, TNode), int> weights = new Dictionary<(TNode, TNode), int>(); 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); 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) foreach (var edge in edges)
{ {

View File

@ -1,11 +1,12 @@
using System.Collections.Generic; using System.Collections.Generic;
using Collections.Pooled;
namespace MoonTools.Core.Graph namespace MoonTools.Core.Graph
{ {
abstract public class Graph<TNode, TEdgeData> where TNode : System.IEquatable<TNode> abstract public class Graph<TNode, TEdgeData> where TNode : System.IEquatable<TNode>
{ {
protected HashSet<TNode> nodes = new HashSet<TNode>(); protected HashSet<TNode> nodes = new HashSet<TNode>();
protected Dictionary<TNode, HashSet<TNode>> neighbors = new Dictionary<TNode, HashSet<TNode>>(); protected Dictionary<TNode, PooledSet<TNode>> neighbors = new Dictionary<TNode, PooledSet<TNode>>();
public IEnumerable<TNode> Nodes => nodes; public IEnumerable<TNode> Nodes => nodes;
@ -16,7 +17,7 @@ namespace MoonTools.Core.Graph
if (!Exists(node)) if (!Exists(node))
{ {
nodes.Add(node); nodes.Add(node);
neighbors.Add(node, new HashSet<TNode>()); neighbors.Add(node, new PooledSet<TNode>(ClearMode.Always));
} }
} }
@ -56,5 +57,10 @@ namespace MoonTools.Core.Graph
} }
} }
public virtual void Clear()
{
nodes.Clear();
neighbors.Clear();
}
} }
} }

View File

@ -29,5 +29,12 @@ namespace MoonTools.Core.Graph
CheckNodes(v, u); CheckNodes(v, u);
if (!Exists(v, u)) { throw new ArgumentException($"Edge between vertex {v} and vertex {u} does not exist in the graph"); } 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();
}
} }
} }