internal TraceNode2(TraceNode2 parent, Edge edge, Dictionary <NodeReference, HashSet <NodeReference> > initialToTargetsIndex) { PreviousNode = parent; TraceDepth = parent.TraceDepth + 1; CurrentEdge = edge; _initialToTargetIndex = initialToTargetsIndex; }
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; }