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); }
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); }
public static AutomateObject ToViewAutomata(this BackTrackingNode automata) { return(CreateViewAutomata(automata)); }