private static IEnumerable <DelayGraphVertex> GetFanouts(DelayGraphVertex v, DelayGraph graph) { IEnumerable <DelayGraphEdge> edges; if (graph.TryGetOutEdges(v, out edges)) { return(edges.Select(e => e.Target)); } return(Enumerable.Empty <DelayGraphVertex>()); }
/// <summary> /// prune edges from same source/target, keeping the strongr edge /// </summary> /// <param name="graph">a delay graph</param> /// <returns>whether DG has changed</returns> internal static bool PruneEdges(DelayGraph graph) { bool changed = false; foreach (var vertex in graph.Vertices) { IEnumerable <DelayGraphEdge> edges; if (!graph.TryGetOutEdges(vertex, out edges)) { continue; } if (edges.Count() < 2) { continue; } // check for redundant out edges var targets = new Dictionary <DelayGraphVertex, DelayGraphEdge>(); foreach (var edge in edges.ToList()) { DelayGraphEdge prevEdge; if (targets.TryGetValue(edge.Target, out prevEdge)) { // decide which edge to keep and which to delete if (prevEdge.Delay >= edge.Delay) { // keep prev edge graph.RemoveEdge(edge); } else { targets[edge.Target] = edge; graph.RemoveEdge(prevEdge); } changed = true; } else { targets[edge.Target] = edge; } } } return(changed); }