private void AddEdges() { var nodes = MutableDataflowGraph.Nodes.ToArray(); int count = 0; Parallel.ForEach(nodes, node => { var consumes = m_pipConsumes[node.Value]; if (consumes != null) { foreach (var consumed in consumes) { var producer = m_pipProducers.GetOrAdd(consumed, MutableDataflowGraph, (consumed0, graph) => { var sourceNode = graph.CreateNode(); PipTypes[sourceNode] = PipType.HashSourceFile; return(sourceNode); }).Item.Value; MutableDataflowGraph.AddEdge(producer, node); } int incrementedCount = Interlocked.Increment(ref count); if ((incrementedCount % 10000) == 0) { Console.WriteLine("Added edges: {0} / {1} ({2} %)", incrementedCount, nodes.Length, ((double)incrementedCount * 100) / nodes.Length); } } }); }
private NodeId GetNodeForId(int id) { NodeId node; if (!m_pipIdToNode.TryGetValue(id, out node)) { node = MutableDataflowGraph.CreateNode(); m_pipIdToNode[id] = node; PipIds[node] = id; } return(node); }
public void ReadGraph(JsonFilter reader) { Dictionary <string, PipType> pipTypeLookup = new Dictionary <string, PipType>(); foreach (PipType pt in Enum.GetValues(typeof(PipType))) { pipTypeLookup[pt.ToString()] = pt; } AssertPostRead(reader, JsonToken.StartArray); while (reader.Read() && reader.TokenType == JsonToken.StartObject) { AssertPostRead(reader, JsonToken.PropertyName); var id = (int)reader.ReadAsInt32(); NodeId node = GetNodeForId(id); while (reader.Read() && reader.TokenType == JsonToken.PropertyName) { int value = 0; string propertyName = (string)reader.Value; switch (propertyName) { case "type": PipTypes[node] = pipTypeLookup[reader.ReadAsString()]; break; case "stableId": SemiStableHashes[node] = ulong.Parse(reader.ReadAsString(), NumberStyles.HexNumber); break; case "dependsOn": AssertPostRead(reader, JsonToken.StartArray); while (reader.TryReadInt32(out value)) { MutableDataflowGraph.AddEdge(GetNodeForId(value), node); } AssertToken(reader, JsonToken.EndArray); break; case "consumes": AssertPostRead(reader, JsonToken.StartArray); while (reader.TryReadInt32(out value)) { var list = GetOrAddDependenciesList(node); list.Add(value); } AssertToken(reader, JsonToken.EndArray); break; case "produces": AssertPostRead(reader, JsonToken.StartArray); while (reader.TryReadInt32(out value)) { m_pipProducers[value] = node; } AssertToken(reader, JsonToken.EndArray); break; case "provenance": AssertPostRead(reader, JsonToken.StartObject); while (reader.Read() && reader.TokenType == JsonToken.PropertyName) { if (reader.Value.Equals("value")) { var outputValue = FullSymbol.Create(SymbolTable, reader.ReadAsString()); OutputValues[node] = outputValue; continue; } reader.Skip(); } AssertToken(reader, JsonToken.EndObject); break; default: reader.Skip(); break; } } AssertToken(reader, JsonToken.EndObject); } AssertToken(reader, JsonToken.EndArray); }