コード例 #1
0
 internal TraceNode2(TraceNode2 parent, Edge edge, Dictionary <NodeReference, HashSet <NodeReference> > initialToTargetsIndex)
 {
     PreviousNode          = parent;
     TraceDepth            = parent.TraceDepth + 1;
     CurrentEdge           = edge;
     _initialToTargetIndex = initialToTargetsIndex;
 }
コード例 #2
0
        public MultiTraceLog2(IEnumerable <NodeReference> initialNodes, ComposedGraph graph, bool fullExpansion, int maxWidth, int maxDepth)
        {
            InitialNodes = initialNodes.ToArray();
            Root         = new TraceNode2(InitialNodes);

            var worklist = new Queue <TraceNode2>();

            worklist.Enqueue(Root);
            var allNodes = new List <TraceNode2>();

            var start2 = DateTime.Now;

            //       Console.WriteLine("MultiTraceLog2 START");
            while (worklist.Count > 0)
            {
                var node = worklist.Dequeue();
                allNodes.Add(node);
                if (node.TraceDepth >= maxDepth || (!fullExpansion && !node.HasContinuation))
                {
                    continue;
                }

                //targets available from the node
                var targets = node.GetTargets(graph, maxWidth).ToArray();

                // index targets according to initial nodes and edges
                var initialNodeTargetsIndex = new Dictionary <Edge, Dictionary <NodeReference, HashSet <NodeReference> > >();
                foreach (var target in targets)
                {
                    Dictionary <NodeReference, HashSet <NodeReference> > targetIndex;
                    if (!initialNodeTargetsIndex.TryGetValue(target.Item2, out targetIndex))
                    {
                        initialNodeTargetsIndex[target.Item2] = targetIndex = new Dictionary <NodeReference, HashSet <NodeReference> >();
                    }

                    HashSet <NodeReference> edgeTargets;
                    if (!targetIndex.TryGetValue(target.Item1, out edgeTargets))
                    {
                        targetIndex[target.Item1] = edgeTargets = new HashSet <NodeReference>();
                    }

                    edgeTargets.Add(target.Item3);
                }

                //construct trace nodes
                foreach (var edgePair in initialNodeTargetsIndex)
                {
                    var traceNode = new TraceNode2(node, edgePair.Key, edgePair.Value);
                    worklist.Enqueue(traceNode);
                }
            }

            //           Console.WriteLine("MultiTraceLog2 {0}s", (DateTime.Now - start2).TotalSeconds);
            TraceNodes = allNodes;
        }