コード例 #1
0
        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);
        }
コード例 #2
0
        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);
        }