private static string GraphVisualize(ProcessorGraph graph, string[] blockTraceRoute) { return(Graphviz.Graphviz.Format(graph, new GraphvizConfiguration { VertexProcessing = (processor, styles) => { if (blockTraceRoute.Contains(processor.Id)) { styles.Add("color=\"gold\""); styles.Add("style=\"filled\""); } }, EdgeProcessing = (edge, styles) => { if (blockTraceRoute.Contains(edge.Source.Id) && blockTraceRoute.Contains(edge.Target.Id)) { styles.Add("color=\"green\""); } else { styles.Add("style=\"dotted\""); } } })); }
private static ProcessorGraph GraphCreate(int layerCount, int minNodesPerLayer, int maxNodesPerLayer) { var result = new ProcessorGraph(); result.AddVertex(Helper.CreateProcessor()); var random = new Random(); for (var i = 0; i < layerCount; i++) { var tailVertices = result.Vertices .Where(v => !result.OutEdges(v).Any()) .ToList(); var processorsOnLayer = random.Next(minNodesPerLayer, maxNodesPerLayer); for (var j = 0; j < processorsOnLayer; j++) { var processor = Helper.CreateProcessor(); result.AddVertex(processor); var processorConnectedWithVerticesCount = random.Next(1, tailVertices.Count); for (var k = 0; k < processorConnectedWithVerticesCount; k++) { var processorConnectedWithVertexIndex = random.Next(0, tailVertices.Count); result.AddEdge(new Edge <IProcessor>(tailVertices[processorConnectedWithVertexIndex], processor)); } } } return(result); }
private static void GraphProcess(ProcessorGraph graph, object block) { var random = new Random(); var currentVertex = graph.Vertices.FirstOrDefault(v => !graph.InEdges(v).Any()); while (currentVertex != null) { currentVertex.Process(block); var followedVertices = graph.Vertices .Where(v => graph.InEdges(v).Any(e => Equals(e.Source, currentVertex))) .ToList(); if (followedVertices.Any()) { var nextVertexIndex = random.Next(0, followedVertices.Count); currentVertex = followedVertices[nextVertexIndex]; } else { currentVertex = null; } } }