コード例 #1
0
ファイル: GraphMaker.cs プロジェクト: jkubisiowski/Generator
        private AdjacencyGraph<Node, Edge<Node>> CreateGraphFromNode(XDocument xDocument, XNode parent)
        {
            var graph = new AdjacencyGraph<Node, Edge<Node>>();

            var nodes = xDocument.Descendants().Where(x => x.Parent != null && (x.Parent.Parent != null && (x.Parent != null && x.Parent.Parent.Parent == parent)));

            var fromList = nodes.Where(x => x.Parent != null && (x.Name.LocalName == "ControlFlow" && x.Parent.Name.LocalName =="FromSimpleRelationships") );
            var toList = nodes.Where(x => x.Parent != null && (x.Name.LocalName == "ControlFlow" && x.Parent.Name.LocalName =="ToSimpleRelationships") );
            foreach (var fromNode in fromList)
            {
                var xNode1 = fromNode.Parent.Parent;

                string idref = fromNode.Attribute("Idref").Value;
                var xNode2 =
                    toList.Where(x => x.Parent != null && (x.Attribute("Idref").Value.ToString() == idref))
                        .Select(x => x.Parent.Parent).FirstOrDefault();

                if (xNode1 == null || xNode2 == null)
                    continue;

                Node node1 = new Node(xNode1.Attribute("Name").Value, GetNodeType(xNode1));
                Node node2 = new Node(xNode2.Attribute("Name").Value, GetNodeType(xNode2));

                if (!graph.Vertices.Any(x => x.Name==node1.Name && x.Type==node1.Type))
                {
                    graph.AddVertex(node1);
                }
                else
                {
                    node1 = graph.Vertices.FirstOrDefault(x => x.Name == node1.Name && x.Type == node1.Type);
                }
                if (!graph.Vertices.Any(x => x.Name == node2.Name && x.Type == node2.Type))
                {
                    graph.AddVertex(node2);
                }
                else
                {
                    node2 = graph.Vertices.FirstOrDefault(x => x.Name == node2.Name && x.Type == node2.Type);
                }
                var newEdge = new Edge<Node>(node1, node2);
                if(!graph.ContainsEdge(newEdge))
                    graph.AddEdge(newEdge);

            }

            return graph;
        }
コード例 #2
0
        /// <summary>
        /// Znajduje wszystkie paterny dec
        /// </summary>
        /// <param name="g"></param>
        /// <returns></returns>
        public AdjacencyGraph<Node, Edge<Node>> FindDecisionPattern(AdjacencyGraph<Node, Edge<Node>> g)
        {
            List<Node> decisionNodes = g.Vertices.Where(x => x.Type == NodeType.DecisionNode).ToList();

            foreach (var decisionNode in decisionNodes)
            {
                var outEdges = g.OutEdges(decisionNode);
                var left = outEdges.ElementAt(0).Target;
                var right = outEdges.ElementAt(1).Target;

                var upperEdge = g.Edges.Where(x => x.Target == decisionNode).ToList().FirstOrDefault();

                if (g.OutEdges(left).Count() == 1 && g.OutEdges(right).Count() == 1 && (
                    g.OutEdges(left).ElementAt(0).Target == g.OutEdges(right).ElementAt(0).Target)
                    || g.OutEdges(left).ElementAt(0).Target == right
                    || g.OutEdges(right).ElementAt(0).Target == left
                    || left.Type==NodeType.ActivityFinalNode
                    || right.Type==NodeType.ActivityFinalNode)
                {
                    string name = "dec(" + decisionNode.Name + ", " + left.Name + ", " + right.Name + ")";
                    var decisionPattern = new Node(name, NodeType.DecisionPattern);

                    g.AddVertex(decisionPattern);
                    var nextNode = g.OutEdges(right).ElementAt(0).Target;
                    if(nextNode == left || nextNode==right)
                        nextNode = g.OutEdges(left).ElementAt(0).Target;

                    g.AddEdge(new Edge<Node>(upperEdge.Source, decisionPattern));
                    g.AddEdge(new Edge<Node>(decisionPattern, nextNode));

                    g.RemoveVertex(decisionNode);
                    g.RemoveVertex(left);
                    g.RemoveVertex(right);
                }
            }

            return g;
        }
コード例 #3
0
        internal static AdjacencyGraph<Node, Edge<Node>> GetGraphMock(int number)
        {
            var graph = new AdjacencyGraph<Node, Edge<Node>>();
            if (number == 1)
            {
                Node start = new Node("start", NodeType.InitalNode);
                Node a = new Node("a", NodeType.ActivityAction);
                Node b = new Node("b", NodeType.ActivityAction);
                Node c = new Node("c", NodeType.ActivityAction);
                Node end = new Node("end", NodeType.ActivityFinalNode);
                Node dec1 = new Node("dec1", NodeType.DecisionNode);
                Node dec2 = new Node("dec2", NodeType.DecisionNode);

                graph.AddVertex(start);
                graph.AddVertex(a);
                graph.AddVertex(b);
                graph.AddVertex(c);
                graph.AddVertex(end);
                graph.AddVertex(dec1);
                graph.AddVertex(dec2);

                graph.AddEdge(new Edge<Node>(start, dec1));
                graph.AddEdge(new Edge<Node>(c, end));
                graph.AddEdge(new Edge<Node>(dec1, c));
                graph.AddEdge(new Edge<Node>(dec1, dec2));
                graph.AddEdge(new Edge<Node>(dec2, a));
                graph.AddEdge(new Edge<Node>(dec2, b));
                graph.AddEdge(new Edge<Node>(a, end));
                graph.AddEdge(new Edge<Node>(b, end));
            }
            if (number == 2)
            {
                Node start = new Node("start", NodeType.InitalNode);
                Node a = new Node("a", NodeType.ActivityAction);
                Node b = new Node("b", NodeType.ActivityAction);
                Node c = new Node("c", NodeType.ActivityAction);
                Node d = new Node("d", NodeType.ActivityAction);
                Node end = new Node("end", NodeType.ActivityFinalNode);
                Node dec1 = new Node("dec1", NodeType.DecisionNode);
                Node dec2 = new Node("dec2", NodeType.DecisionNode);

                graph.AddVertex(start);
                graph.AddVertex(a);
                graph.AddVertex(b);
                graph.AddVertex(c);
                graph.AddVertex(end);
                graph.AddVertex(dec1);
                graph.AddVertex(dec2);
                graph.AddVertex(d);

                graph.AddEdge(new Edge<Node>(start, dec1));
                graph.AddEdge(new Edge<Node>(c, end));
                graph.AddEdge(new Edge<Node>(dec1, c));
                graph.AddEdge(new Edge<Node>(dec1, dec2));
                graph.AddEdge(new Edge<Node>(dec2, a));
                graph.AddEdge(new Edge<Node>(dec2, b));
                graph.AddEdge(new Edge<Node>(b, end));
                graph.AddEdge(new Edge<Node>(a, d));
                graph.AddEdge(new Edge<Node>(d, end));

            }
            if (number == 3)
            {
                Node start = new Node("start", NodeType.InitalNode);
                Node a = new Node("a", NodeType.ActivityAction);
                Node b = new Node("b", NodeType.ActivityAction);
                Node c = new Node("c", NodeType.ActivityAction);
                Node d = new Node("d", NodeType.ActivityAction);
                Node e = new Node("e", NodeType.ActivityAction);
                Node f = new Node("f", NodeType.ActivityAction);
                Node g = new Node("g", NodeType.ActivityAction);
                Node h = new Node("h", NodeType.ActivityAction);
                Node end = new Node("end", NodeType.ActivityFinalNode);
                Node dec1 = new Node("dec1", NodeType.DecisionNode);
                Node dec2 = new Node("dec2", NodeType.DecisionNode);
                Node fork1 = new Node("fork1", NodeType.ForkNode);
                Node fork2 = new Node("fork2", NodeType.ForkNode);
                Node join1 = new Node("join1", NodeType.JoinNode);
                Node join2 = new Node("join2", NodeType.JoinNode);

                graph.AddVertex(start);
                graph.AddVertex(a);
                graph.AddVertex(b);
                graph.AddVertex(c);
                graph.AddVertex(d);
                graph.AddVertex(e);
                graph.AddVertex(f);
                graph.AddVertex(g);
                graph.AddVertex(h);
                graph.AddVertex(end);
                graph.AddVertex(dec1);
                graph.AddVertex(dec2);
                graph.AddVertex(fork1);
                graph.AddVertex(fork2);
                graph.AddVertex(join1);
                graph.AddVertex(join2);

                graph.AddEdge(new Edge<Node>(start, dec1));
                graph.AddEdge(new Edge<Node>(dec1, g));
                graph.AddEdge(new Edge<Node>(dec1, dec2));
                graph.AddEdge(new Edge<Node>(g, fork2));
                graph.AddEdge(new Edge<Node>(fork2, e));
                graph.AddEdge(new Edge<Node>(fork2, f));
                graph.AddEdge(new Edge<Node>(e, join2));
                graph.AddEdge(new Edge<Node>(f, join2));
                graph.AddEdge(new Edge<Node>(join2, end));
                graph.AddEdge(new Edge<Node>(dec2, a));
                graph.AddEdge(new Edge<Node>(dec2, h));
                graph.AddEdge(new Edge<Node>(h, fork1));
                graph.AddEdge(new Edge<Node>(fork1, b));
                graph.AddEdge(new Edge<Node>(a, d));
                graph.AddEdge(new Edge<Node>(d, end));
                graph.AddEdge(new Edge<Node>(fork1, c));
                graph.AddEdge(new Edge<Node>(b, join1));
                graph.AddEdge(new Edge<Node>(c, join1));
                graph.AddEdge(new Edge<Node>(join1, end));
            }
            if (number == 4)
            {
                Node start = new Node("start", NodeType.InitalNode);
                Node a = new Node("a", NodeType.ActivityAction);
                Node b = new Node("b", NodeType.ActivityAction);
                Node c = new Node("c", NodeType.ActivityAction);
                Node d = new Node("d", NodeType.ActivityAction);
                Node e = new Node("e", NodeType.ActivityAction);
                Node f = new Node("f", NodeType.ActivityAction);
                Node g = new Node("g", NodeType.ActivityAction);
                Node h = new Node("h", NodeType.ActivityAction);
                Node i = new Node("i", NodeType.ActivityAction);
                Node j = new Node("j", NodeType.ActivityAction);
                Node k = new Node("k", NodeType.ActivityAction);
                Node l = new Node("l", NodeType.ActivityAction);
                Node end = new Node("end", NodeType.ActivityFinalNode);
                Node dec1 = new Node("dec1", NodeType.DecisionNode);
                Node dec2 = new Node("dec2", NodeType.DecisionNode);
                Node fork1 = new Node("fork1", NodeType.ForkNode);
                Node fork2 = new Node("fork2", NodeType.ForkNode);
                Node fork3 = new Node("fork3", NodeType.ForkNode);
                Node join1 = new Node("join1", NodeType.JoinNode);
                Node join2 = new Node("join2", NodeType.JoinNode);
                Node join3 = new Node("join3", NodeType.JoinNode);

                graph.AddVertex(start);
                graph.AddVertex(a);
                graph.AddVertex(b);
                graph.AddVertex(c);
                graph.AddVertex(d);
                graph.AddVertex(e);
                graph.AddVertex(f);
                graph.AddVertex(g);
                graph.AddVertex(h);
                graph.AddVertex(i);
                graph.AddVertex(j);
                graph.AddVertex(k);
                graph.AddVertex(l);
                graph.AddVertex(end);
                graph.AddVertex(dec1);
                graph.AddVertex(dec2);
                graph.AddVertex(fork1);
                graph.AddVertex(fork2);
                graph.AddVertex(fork3);
                graph.AddVertex(join1);
                graph.AddVertex(join2);
                graph.AddVertex(join3);

                graph.AddEdge(new Edge<Node>(start, dec1));
                graph.AddEdge(new Edge<Node>(dec1, g));
                graph.AddEdge(new Edge<Node>(dec1, dec2));
                graph.AddEdge(new Edge<Node>(g, fork2));
                graph.AddEdge(new Edge<Node>(fork2, l));
                graph.AddEdge(new Edge<Node>(fork2, i));
                graph.AddEdge(new Edge<Node>(i, j));
                graph.AddEdge(new Edge<Node>(j, k));
                graph.AddEdge(new Edge<Node>(l, fork3));
                graph.AddEdge(new Edge<Node>(fork3, e));
                graph.AddEdge(new Edge<Node>(fork3, f));
                graph.AddEdge(new Edge<Node>(e, join3));
                graph.AddEdge(new Edge<Node>(f, join3));
                graph.AddEdge(new Edge<Node>(join3, join2));
                graph.AddEdge(new Edge<Node>(k, join2));
                graph.AddEdge(new Edge<Node>(join2, end));
                graph.AddEdge(new Edge<Node>(dec2, a));
                graph.AddEdge(new Edge<Node>(dec2, h));
                graph.AddEdge(new Edge<Node>(h, fork1));
                graph.AddEdge(new Edge<Node>(fork1, b));
                graph.AddEdge(new Edge<Node>(a, d));
                graph.AddEdge(new Edge<Node>(d, end));
                graph.AddEdge(new Edge<Node>(fork1, c));
                graph.AddEdge(new Edge<Node>(b, join1));
                graph.AddEdge(new Edge<Node>(c, join1));
                graph.AddEdge(new Edge<Node>(join1, end));
            }
            if (number == 5)
            {
                Node start = new Node("start", NodeType.InitalNode);
                Node a = new Node("a", NodeType.ActivityAction);
                Node b = new Node("b", NodeType.ActivityAction);
                Node c = new Node("c", NodeType.ActivityAction);
                Node d = new Node("d", NodeType.ActivityAction);
                Node e = new Node("e", NodeType.ActivityAction);
                Node f = new Node("f", NodeType.ActivityAction);
                Node g = new Node("g", NodeType.ActivityAction);
                Node h = new Node("h", NodeType.ActivityAction);
                Node i = new Node("i", NodeType.ActivityAction);
                Node j = new Node("j", NodeType.ActivityAction);
                Node l = new Node("l", NodeType.ActivityAction);
                Node end = new Node("end", NodeType.ActivityFinalNode);
                Node dec1 = new Node("dec1", NodeType.DecisionNode);
                Node dec2 = new Node("dec2", NodeType.DecisionNode);
                Node dec3 = new Node("dec3", NodeType.DecisionNode);
                Node fork1 = new Node("fork1", NodeType.ForkNode);
                Node fork2 = new Node("fork2", NodeType.ForkNode);
                Node fork3 = new Node("fork3", NodeType.ForkNode);
                Node join1 = new Node("join1", NodeType.JoinNode);
                Node join2 = new Node("join2", NodeType.JoinNode);
                Node join3 = new Node("join3", NodeType.JoinNode);

                graph.AddVertex(start);
                graph.AddVertex(a);
                graph.AddVertex(b);
                graph.AddVertex(c);
                graph.AddVertex(d);
                graph.AddVertex(e);
                graph.AddVertex(f);
                graph.AddVertex(g);
                graph.AddVertex(h);
                graph.AddVertex(i);
                graph.AddVertex(j);
                graph.AddVertex(l);
                graph.AddVertex(end);
                graph.AddVertex(dec1);
                graph.AddVertex(dec2);
                graph.AddVertex(dec3);
                graph.AddVertex(fork1);
                graph.AddVertex(fork2);
                graph.AddVertex(fork3);
                graph.AddVertex(join1);
                graph.AddVertex(join2);
                graph.AddVertex(join3);

                graph.AddEdge(new Edge<Node>(start, dec1));
                graph.AddEdge(new Edge<Node>(dec1, g));
                graph.AddEdge(new Edge<Node>(dec1, dec2));
                graph.AddEdge(new Edge<Node>(g, fork2));
                graph.AddEdge(new Edge<Node>(fork2, l));
                graph.AddEdge(new Edge<Node>(fork2, i));
                graph.AddEdge(new Edge<Node>(i, dec3));
                graph.AddEdge(new Edge<Node>(j, dec3));
                graph.AddEdge(new Edge<Node>(dec3, j));
                graph.AddEdge(new Edge<Node>(dec3, join2));
                graph.AddEdge(new Edge<Node>(l, fork3));
                graph.AddEdge(new Edge<Node>(fork3, e));
                graph.AddEdge(new Edge<Node>(fork3, f));
                graph.AddEdge(new Edge<Node>(e, join3));
                graph.AddEdge(new Edge<Node>(f, join3));
                graph.AddEdge(new Edge<Node>(join3, join2));
                graph.AddEdge(new Edge<Node>(join2, end));
                graph.AddEdge(new Edge<Node>(dec2, a));
                graph.AddEdge(new Edge<Node>(dec2, h));
                graph.AddEdge(new Edge<Node>(h, fork1));
                graph.AddEdge(new Edge<Node>(fork1, b));
                graph.AddEdge(new Edge<Node>(a, d));
                graph.AddEdge(new Edge<Node>(d, end));
                graph.AddEdge(new Edge<Node>(fork1, c));
                graph.AddEdge(new Edge<Node>(b, join1));
                graph.AddEdge(new Edge<Node>(c, join1));
                graph.AddEdge(new Edge<Node>(join1, end));
            }
            if (number == 6)
            {
                Node start = new Node("start", NodeType.InitalNode);
                Node a = new Node("a", NodeType.ActivityAction);
                Node b = new Node("b", NodeType.ActivityAction);
                Node c = new Node("c", NodeType.ActivityAction);
                Node d = new Node("d", NodeType.ActivityAction);
                Node e = new Node("e", NodeType.ActivityAction);
                Node f = new Node("f", NodeType.ActivityAction);
                Node g = new Node("g", NodeType.ActivityAction);
                Node h = new Node("h", NodeType.ActivityAction);
                Node i = new Node("i", NodeType.ActivityAction);
                Node j = new Node("j", NodeType.ActivityAction);
                Node k = new Node("k", NodeType.ActivityAction);
                Node l = new Node("l", NodeType.ActivityAction);
                Node m = new Node("m", NodeType.ActivityAction);
                Node n = new Node("n", NodeType.ActivityAction);
                Node o = new Node("o", NodeType.ActivityAction);
                Node p = new Node("p", NodeType.ActivityAction);
                Node end = new Node("end", NodeType.ActivityFinalNode);
                Node dec1 = new Node("dec1", NodeType.DecisionNode);
                Node dec2 = new Node("dec2", NodeType.DecisionNode);
                Node dec3 = new Node("dec3", NodeType.DecisionNode);
                Node dec4 = new Node("dec4", NodeType.DecisionNode);
                Node dec5 = new Node("dec5", NodeType.DecisionNode);
                Node fork1 = new Node("fork1", NodeType.ForkNode);
                Node fork2 = new Node("fork2", NodeType.ForkNode);
                Node fork3 = new Node("fork3", NodeType.ForkNode);
                Node join1 = new Node("join1", NodeType.JoinNode);
                Node join2 = new Node("join2", NodeType.JoinNode);
                Node join3 = new Node("join3", NodeType.JoinNode);

                graph.AddVertex(start);
                graph.AddVertex(a);
                graph.AddVertex(b);
                graph.AddVertex(c);
                graph.AddVertex(d);
                graph.AddVertex(g);
                graph.AddVertex(h);
                graph.AddVertex(i);
                graph.AddVertex(j);
                graph.AddVertex(k);
                graph.AddVertex(l);
                graph.AddVertex(m);
                graph.AddVertex(n);
                graph.AddVertex(o);
                graph.AddVertex(p);
                graph.AddVertex(end);
                graph.AddVertex(dec1);
                graph.AddVertex(dec2);
                graph.AddVertex(dec3);
                graph.AddVertex(dec4);
                graph.AddVertex(dec5);
                graph.AddVertex(fork1);
                graph.AddVertex(fork2);
                graph.AddVertex(fork3);
                graph.AddVertex(join1);
                graph.AddVertex(join2);
                graph.AddVertex(join3);

                graph.AddEdge(new Edge<Node>(start, dec1));
                graph.AddEdge(new Edge<Node>(dec1, g));
                graph.AddEdge(new Edge<Node>(dec1, dec2));
                graph.AddEdge(new Edge<Node>(g, fork2));
                graph.AddEdge(new Edge<Node>(fork2, l));
                graph.AddEdge(new Edge<Node>(fork2, i));
                graph.AddEdge(new Edge<Node>(i, dec3));
                graph.AddEdge(new Edge<Node>(dec3, j));
                graph.AddEdge(new Edge<Node>(j, dec4));
                graph.AddEdge(new Edge<Node>(dec4, k));
                graph.AddEdge(new Edge<Node>(k, dec4));
                graph.AddEdge(new Edge<Node>(dec4, dec3));
                graph.AddEdge(new Edge<Node>(dec3, join2));
                graph.AddEdge(new Edge<Node>(l, fork3));
                graph.AddEdge(new Edge<Node>(fork3, m));
                graph.AddEdge(new Edge<Node>(fork3, n));
                graph.AddEdge(new Edge<Node>(n, join3));
                graph.AddEdge(new Edge<Node>(m, dec5));
                graph.AddEdge(new Edge<Node>(dec5, o));
                graph.AddEdge(new Edge<Node>(dec5, join3));
                graph.AddEdge(new Edge<Node>(o, p));
                graph.AddEdge(new Edge<Node>(p, dec5));
                graph.AddEdge(new Edge<Node>(join3, join2));
                graph.AddEdge(new Edge<Node>(join2, end));
                graph.AddEdge(new Edge<Node>(dec2, a));
                graph.AddEdge(new Edge<Node>(dec2, h));
                graph.AddEdge(new Edge<Node>(h, fork1));
                graph.AddEdge(new Edge<Node>(fork1, b));
                graph.AddEdge(new Edge<Node>(a, d));
                graph.AddEdge(new Edge<Node>(d, end));
                graph.AddEdge(new Edge<Node>(fork1, c));
                graph.AddEdge(new Edge<Node>(b, join1));
                graph.AddEdge(new Edge<Node>(c, join1));
                graph.AddEdge(new Edge<Node>(join1, end));
            }

            return graph;
        }
コード例 #4
0
        /// <summary>
        /// Tworzy noda typu loop
        /// </summary>
        /// <param name="g"></param>
        /// <param name="decisionNode"></param>
        /// <param name="d"></param>
        /// <param name="e"></param>
        /// <param name="previousNode"></param>
        /// <param name="nextNode"></param>
        /// <returns></returns>
        private AdjacencyGraph<Node, Edge<Node>> MakeLoopPattern(AdjacencyGraph<Node, Edge<Node>> g, Node decisionNode,
            Node d, Node e, Node previousNode, Node nextNode)
        {
            string name = "loop(" + d.Name + "," + decisionNode.Name + "," + e.Name + ")";
            var loopPattern = new Node(name, NodeType.LoopPattern);

            g.AddVertex(loopPattern);
            g.AddEdge(new Edge<Node>(previousNode, loopPattern));
            g.AddEdge(new Edge<Node>(loopPattern, nextNode));

            g.RemoveVertex(d);
            g.RemoveVertex(e);
            g.RemoveVertex(decisionNode);

            return g;
        }
コード例 #5
0
 /// <summary>
 /// Zwraca liste rodzicow dla danego noda
 /// </summary>
 /// <param name="g"></param>
 /// <param name="node"></param>
 /// <returns></returns>
 private IEnumerable<Node> GetParents(AdjacencyGraph<Node, Edge<Node>> g, Node node)
 {
     return g.Edges.Where(x => x.Target == node).Select(x => x.Source);
 }
コード例 #6
0
        /// <summary>
        /// Znajduje wszystkie paterny seq
        /// </summary>
        /// <param name="g"></param>
        /// <returns></returns>
        public AdjacencyGraph<Node, Edge<Node>> FindSeqPattern(AdjacencyGraph<Node, Edge<Node>> g)
        {
            var chuj = true;
            while (chuj)
            {
                List<Edge<Node>> followingEdges = GetEdgesForSeq(g);

                if (followingEdges.Count == 0)
                {
                    chuj = false;
                    continue;
                }

                var followingEdge = followingEdges.FirstOrDefault();
                //utworzenie nowego seq patternu
                string name = "seq(" + followingEdge.Source.Name + "," + followingEdge.Target.Name + ")";
                var seqPattern = new Node(name, NodeType.SeqPattern);

                //znalezienie poprzedniego i nastepnego polaczenia polaczenia
                var upperEdge = g.Edges.Where(x => x.Target == followingEdge.Source).ToList().FirstOrDefault();
                var lowerEdge = g.OutEdges(followingEdge.Target).ElementAt(0);

                //dodanie noda i polaczen
                g.AddVertex(seqPattern);
                g.AddEdge(new Edge<Node>(upperEdge.Source, seqPattern));
                g.AddEdge(new Edge<Node>(seqPattern, lowerEdge.Target));

                //usuniecie starych nodow
                g.RemoveVertex(followingEdge.Source);
                g.RemoveVertex(followingEdge.Target);
            }

            return g;
        }
コード例 #7
0
        /// <summary>
        /// Znajduje wszystkie paterny par
        /// </summary>
        /// <param name="g"></param>
        /// <returns></returns>
        public AdjacencyGraph<Node, Edge<Node>> FindParPattern(AdjacencyGraph<Node, Edge<Node>> g)
        {
            List<Node> forkNodes = g.Vertices.Where(x => x.Type == NodeType.ForkNode).ToList();

            foreach (var forkNode in forkNodes)
            {
                var forkEdges = g.Edges.Where(x => x.Source == forkNode).ToList();
                var leftEdge = forkEdges[0];
                var rightEdge = forkEdges[1];
                var forkInEdge = g.Edges.Where(x => x.Target == forkNode).ToList().FirstOrDefault();
                var leftOutNode = g.OutEdges(leftEdge.Target).ElementAt(0).Target;
                var rightOutNode = g.OutEdges(rightEdge.Target).ElementAt(0).Target;
                var startParNode = forkInEdge.Source;
                var startParNodeInEdge = g.Edges.Where(x => x.Target == startParNode).ToList().FirstOrDefault();

                if (leftOutNode == rightOutNode && leftOutNode.Type == NodeType.JoinNode)
                {
                    string name = "par(" + forkInEdge.Source.Name + "," + leftEdge.Target.Name + "," +
                                  rightEdge.Target.Name + ")";
                    var parPattern = new Node(name, NodeType.ParPattern);

                    //dodaje pattern
                    g.AddVertex(parPattern);
                    g.AddEdge(new Edge<Node>(startParNodeInEdge.Source, parPattern));
                    g.AddEdge(new Edge<Node>(parPattern, g.OutEdges(rightOutNode).ElementAt(0).Target));

                    //usuwa fork,join,a,b
                    g.RemoveVertex(leftEdge.Target);
                    g.RemoveVertex(rightEdge.Target);
                    g.RemoveVertex(forkNode);
                    g.RemoveVertex(rightOutNode);
                    g.RemoveVertex(startParNode);
                }
            }

            return g;
        }