示例#1
0
        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>());
        }
示例#2
0
        /// <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);
        }