private bool IsCyclicEdge(ModuleGraph graph, ModuleGraphEdge edge) { var cyclicEdge = (from e in graph.Edges where e.Source == edge.Target && e.Target == edge.Source select e).FirstOrDefault(); if (cyclicEdge != null) { return(true); } return(false); }
private ModuleGraph CreateGraph(ModuleWiringConfigSection.ModuleWiringConfigSection configSection) { var graph = new ModuleGraph(); // create graph vertices foreach (ModuleConfig moduleConfig in configSection.Modules) { var module = GetModuleByName(moduleConfig.Name); if (module == null) { continue; } // create QuickGraph datastructure graph.AddVertex(module); } // create graph edges foreach (ModuleConfig moduleConfig in configSection.Modules) { var module = GetModuleByName(moduleConfig.Name); if (module == null) { continue; } foreach (ModuleReferenceConfig targetModuleConfig in moduleConfig.NextModules) { var targetModule = GetModuleByName(targetModuleConfig.Name); if (targetModule == null) { continue; } var edge = new ModuleGraphEdge( module.Name + "->" + targetModule.Name + ":" + targetModuleConfig.Port + targetModuleConfig.TargetPort, module, targetModule, targetModuleConfig.Port, targetModuleConfig.TargetPort); graph.AddEdge(edge); } } // enable forcing for one-way edges by default var modulesWithSingleEdge = from e in graph.Edges group e by e.Source into g where g.Count() == 1 select g.Key; foreach (var module in modulesWithSingleEdge) { var oneWayEdge = (from e in graph.Edges where e.Source == module select e).Single(); if (!IsCyclicEdge(graph, oneWayEdge)) { oneWayEdge.IsForcingEnabled = true; } } return(graph); }