Ejemplo n.º 1
0
        public static AutomateObject CreateViewAutomata(BackTrackingNode node)
        {
            var res = new AutomateObject();

            var nodes = new List <BackTrackingNode>();

            node.Visit((g) => nodes.Add(g));

            var trans = new List <Edge>();


            node.Visit((g) =>
            {
                if (g.Nodes != null && g.Nodes.Any())
                {
                    g.Nodes.ForEach(f =>
                    {
                        trans.Add(new Edge
                        {
                            source = g.Label,
                            target = f.Label
                        });
                    });
                }
            });

            res.nodes = nodes
                        .Select(a => new Node()
            {
                id    = a.Label,
                label = a.Label,
                size  = 3,
                level = a.Level
            }).ToList();
            res.edges =
                trans.Select(d => new Edge()
            {
                id     = d.source + "_" + d.target,
                source = d.source,
                target = d.target,
                color  = "#3300ff",
                type   = "arrow",
                label  = d.label    //+ " " + CreateLabel(d)
            })
                .ToList();

            return(res);
        }
Ejemplo n.º 2
0
        public void GetFinalMerges(Stack <GeneNode> availableNodes,
                                   List <GeneLink> booleanNetwok,
                                   List <GeneNode> foundResults,
                                   BackTrackingNode node)
        {
            // search only 2 results
            if (foundResults.Count == 2)
            {
                return;
            }

            if (availableNodes.Count == 0)
            {
                return;
            }

            if (availableNodes.Count == 1)
            {
                var current = availableNodes.Pop();

                current = ApplyAllPossibleLoops(current, booleanNetwok);

                // add only if it's a real merge
                if (!string.IsNullOrEmpty(current.MergeName) && !foundResults.Any(a => a.MergeName == current.MergeName))
                {
                    node.IsFinal = true;
                    foundResults.Add(current);
                }

                return;
            }

            var currentStack = availableNodes.Clone();
            var first        = currentStack.Pop();

            while (currentStack.Any())
            {
                var second = currentStack.Pop();

                if (AlreadyMerged(first, second))
                {
                    continue;
                }

                var merges = GetValidMerges(first, second, booleanNetwok);

                if (merges != null && merges.Any())
                {
                    var newStack = currentStack.Clone();
                    merges.ForEach(newStack.Push);

                    var currentNode = CreateBackTrackingNodeFromStack(newStack, node.Level + 1);
                    node.Nodes.Add(currentNode);
                    GetFinalMerges(newStack, booleanNetwok, foundResults, currentNode);
                }
            }

            var stackWithoutFirst = availableNodes.Clone();

            stackWithoutFirst.Pop();
            var newNode = CreateBackTrackingNodeFromStack(stackWithoutFirst, node.Level + 1);

            node.Nodes.Add(newNode);
            GetFinalMerges(stackWithoutFirst, booleanNetwok, foundResults, newNode);
        }
Ejemplo n.º 3
0
 public static AutomateObject ToViewAutomata(this BackTrackingNode automata)
 {
     return(CreateViewAutomata(automata));
 }