using System; using System.Collections.Generic; using System.Linq; namespace MoonTools.Graph { abstract public class MultiGraph : Graph where TNode : System.IEquatable { protected Dictionary<(TNode, TNode), HashSet> edges = new Dictionary<(TNode, TNode), HashSet>(); protected Dictionary IDToEdge = new Dictionary(); protected Dictionary edgeToEdgeData = new Dictionary(); protected Guid BaseAddEdge(TNode v, TNode u, TEdgeData edgeData) { CheckNodes(v, u); var id = Guid.NewGuid(); neighbors[v].Add(u); if (!edges.ContainsKey((v, u))) { edges[(v, u)] = new HashSet(); } edges[(v, u)].Add(id); edgeToEdgeData.Add(id, edgeData); IDToEdge.Add(id, (v, u)); return id; } public override void Clear() { base.Clear(); edges.Clear(); IDToEdge.Clear(); edgeToEdgeData.Clear(); } public IEnumerable EdgeIDs(TNode v, TNode u) { CheckNodes(v, u); return edges.ContainsKey((v, u)) ? edges[(v, u)] : Enumerable.Empty(); } public bool Exists(TNode v, TNode u) { CheckNodes(v, u); return edges.ContainsKey((v, u)); } private void CheckID(Guid id) { if (!Exists(id)) { throw new ArgumentException($"Edge {id} does not exist in the graph."); } } public bool Exists(Guid id) { return IDToEdge.ContainsKey(id); } public (TNode, TNode) EdgeNodes(Guid id) { CheckID(id); return IDToEdge[id]; } public TEdgeData EdgeData(Guid id) { CheckID(id); return edgeToEdgeData[id]; } } }