public FileParsingResult ParseFiles(string netPath, string specPath) { ParseRuleResponse conditionAndExperiments; var links = GetConditionAndExperiments(netPath, specPath, out conditionAndExperiments); var automates = conditionAndExperiments.Experiments.ToDictionary(s => s.Key, s => new AutomataFromExperimentCreator().CreateAutomata(s.Value)); var res = new List <GeneNode>(); var availableNodes = new Stack <GeneNode>(automates.Select(a => a.Value).ToList()); var backTrackingNode = AutomataMergeLogic.CreateBackTrackingNodeFromStack(availableNodes, 0); // find merges var automataMergeLogic = new AutomataMergeLogic(); automataMergeLogic .GetFinalMerges(availableNodes, links, res, backTrackingNode); // handle not merged experiments availableNodes.Where(d => NotExistInMerges(d, res)).ToList().ForEach(f => { f = automataMergeLogic.ApplyAllPossibleLoops(f, links); res.Add(f); }); var merges = res .Take(100) .Select(a => a.ToFullViewAutomata(automates)) .ToList(); logger.Info($"Finish merges found {merges.Count} valid merges"); /* var allMerges = new AutomataMergeLogic() * .GetMerges(automates.Select(a => a.Value).ToList()) * .Take(100) * .Select(a => a.ToViewAutomata()) * .ToList(); */ var automatesView = automates .ToDictionary(a => a.Key, a => a.Value.ToViewAutomata()); var backTrackingAutomata = backTrackingNode?.ToViewAutomata(); logger.Info("BackTracing"); logger.Info(JsonConvert.SerializeObject(backTrackingAutomata, Formatting.Indented)); return(new FileParsingResult() { GeneLinks = links, Conditions = conditionAndExperiments.Conditions, Experiments = conditionAndExperiments.Experiments, Automates = automatesView, Merges = merges, BackTrackingNode = backTrackingAutomata, MergeObjects = res //AllMerges = allMerges }); }
public void TestMergeWithNullConditionReturnValid() { var automata1 = new GeneNode() { NodeName = "a1", CurrentCondition = new Condition() { { "B", true }, { "C", true } }, // here A is missing Transitions = new List <GeneTransition>() { new GeneTransition() { Node = new GeneNode() { NodeName = "b1", CurrentCondition = new Condition() { { "A", false }, { "B", false }, { "C", false } }, } } } }; var automata2 = new GeneNode() { NodeName = "a2", CurrentCondition = new Condition() { { "A", true }, { "B", true } }, // Here C is missing Transitions = new List <GeneTransition>() { new GeneTransition() { Node = new GeneNode() { NodeName = "b2", CurrentCondition = new Condition() { { "A", false }, { "B", false }, { "C", false } }, } } } }; var mergeLogic = new AutomataMergeLogic(); var res = mergeLogic.GetMerges(automata1, automata2); Assert.AreEqual(1, res.Count); Assert.AreEqual(res.First().CurrentCondition["A"], true); Assert.AreEqual(res.First().CurrentCondition["B"], true); Assert.AreEqual(res.First().CurrentCondition["C"], true); }
public void TestMergeWithSameConditionReturnMerged() { var automata1 = new GeneNode() { NodeName = "a1", CurrentCondition = new Condition() { { "A", true }, { "B", true }, { "C", true } }, Transitions = new List <GeneTransition>() { new GeneTransition() { Node = new GeneNode() { NodeName = "b1", CurrentCondition = new Condition() { { "A", false }, { "B", false }, { "C", false } }, } } } }; var automata2 = new GeneNode() { NodeName = "a2", CurrentCondition = new Condition() { { "A", true }, { "B", true }, { "C", true } }, Transitions = new List <GeneTransition>() { new GeneTransition() { Node = new GeneNode() { NodeName = "b2", CurrentCondition = new Condition() { { "A", false }, { "B", false }, { "C", false } }, } } } }; var mergeLogic = new AutomataMergeLogic(); var res = mergeLogic.GetMerges(automata1, automata2); Assert.AreEqual(1, res.Count); }
public void TestPrefixLength() { var automata1 = new GeneNode() { NodeName = "a1", CurrentCondition = new Condition() { { "A", false }, { "B", false }, { "C", false } }, Transitions = new List <GeneTransition>() { new GeneTransition() { Node = new GeneNode() { NodeName = "b1", CurrentCondition = new Condition() { { "A", true }, { "B", true }, { "C", true } }, Transitions = new List <GeneTransition>() { new GeneTransition() { Node = new GeneNode() { NodeName = "c1" } } } } } } }; // a2 is prefix, because only b2 will be matched var automata2 = new GeneNode() { NodeName = "a2", CurrentCondition = new Condition() { { "A", false }, { "B", true }, { "C", true } }, Transitions = new List <GeneTransition>() { new GeneTransition() { Node = new GeneNode() { NodeName = "b2", CurrentCondition = new Condition() { { "A", false }, { "B", false }, { "C", false } }, Transitions = new List <GeneTransition>() { new GeneTransition() { Node = new GeneNode() { NodeName = "c2" } } } } } } }; var mergeLogic = new AutomataMergeLogic(); var res = mergeLogic.GetMerges(automata1, automata2); // length should be 4 // a2 => b2@a1 => b1 => c1 Assert.AreEqual(1, res.Count); var builder = new StringBuilder(); res.First().AppendPath(builder); logger.Info(builder.ToString()); Assert.AreEqual(4, res.First().NodeLength); }
public void TestMergeWhenAutomata2CanBeMergedFromAutomata1Child() { var automata1 = new GeneNode() { NodeName = "a1", CurrentCondition = new Condition() { { "A", true }, { "B", true }, { "C", true } }, Transitions = new List <GeneTransition>() { new GeneTransition() { Node = new GeneNode() { NodeName = "b1", CurrentCondition = new Condition() { { "A", false }, { "B", false }, { "C", false } }, Transitions = new List <GeneTransition>() { new GeneTransition() { Node = new GeneNode() { NodeName = "c1" } } } } } } }; var automata2 = new GeneNode() { NodeName = "a2", CurrentCondition = new Condition() { { "A", false }, { "B", false }, { "C", false } }, Transitions = new List <GeneTransition>() { new GeneTransition() { Node = new GeneNode() { NodeName = "b2", CurrentCondition = new Condition() { { "A", false }, { "B", true }, { "C", true } }, Transitions = new List <GeneTransition>() { new GeneTransition() { Node = new GeneNode() { NodeName = "c2" } } } } } } }; var mergeLogic = new AutomataMergeLogic(); var res = mergeLogic.GetMerges(automata1, automata2); Assert.AreEqual(1, res.Count); Assert.AreEqual(4, res.First().NodeLength); }
public void TestToyMultipleLoopTest() { var automata1 = new GeneNode() { NodeName = "a0", CurrentCondition = new Condition() { { "A", true }, { "B", true }, { "C", true }, { "S1", false }, { "S2", true } }, Transitions = new List <GeneTransition>() { new GeneTransition() { Node = new GeneNode() { NodeName = "a1", CurrentCondition = new Condition() { { "A", false }, { "B", true }, { "C", true }, { "S1", false }, { "S2", true } }, Transitions = new List <GeneTransition>() { new GeneTransition() { Node = new GeneNode() { NodeName = "a2", CurrentCondition = new Condition() { { "A", false }, { "B", true }, { "C", true }, { "S1", false }, { "S2", true } }, Transitions = new List <GeneTransition>() { new GeneTransition() { Node = new GeneNode() { NodeName = "a3", CurrentCondition = new Condition() { { "A", false }, { "B", true }, { "C", true }, { "S1", false }, { "S2", true } }, } }, } } } } } } } }; List <GeneLink> booleanNetwok = new List <GeneLink>() { new GeneLink() { From = "S2", To = "B", IsPositive = true }, new GeneLink() { From = "S1", To = "A", IsPositive = true }, new GeneLink() { From = "S1", To = "S1", IsPositive = true }, new GeneLink() { From = "S2", To = "S2", IsPositive = true }, }; var mergeLogic = new AutomataMergeLogic(); var res = mergeLogic.ApplyAllPossibleLoops(automata1, booleanNetwok); Assert.IsNotNull(res); }