public bool IsValidPath(GeneNode automata, List <GeneLink> booleanNetwok, Dictionary <string, List <int> > availableFunctions = null) { lock (locker) { var tempAutomata = automata; // new GeneNode() //{ // NodeName = "Start", // CurrentCondition = new Condition(), // Transitions = new List<GeneTransition>() // { // new GeneTransition() // { // Node = automata // } // } //}; var letters = new List <string>(); int z = 0; var depth = tempAutomata.NodeLength; tempAutomata.GetAllConditionLetters(letters); letters = letters.SelectMany(l => Enumerable.Range(0, depth).ToList().Select(n => Formater.FormatParameter(l, n))).ToList(); logger.Info(tempAutomata.NodeLength + 1); Model.NUMBER_OF_EVENT = tempAutomata.NodeLength + 2; Model.MAX_NUMBER_EVENT_PARAMETERS = 0; BDDEncoder encoder = new BDDEncoder(); letters.Distinct().ToList().ForEach(l => encoder.model.AddLocalVar(l, 0, 1)); logger.Info(string.Join(",", letters)); SymbolicLTS lts = new SymbolicLTS(); List <State> states = new List <State>(); var state0 = lts.AddState(); states.Add(state0); lts.InitialState = states[0]; var state1 = lts.AddState(); states.Add(state1); //var goal2 = CreateExpressionBasedOnAutomata(tempAutomata); var dictValues = BDDLogicHelper.CreateDictBasedOnAutomata(tempAutomata); Expression seq = null; /*CreateExpressionsFromBooleanNetwork(booleanNetwok, * availableFunctions, depth, Mode.Assignment, dictValues);*/ if (dictValues.Any()) { dictValues.ToList().ForEach(f => { Expression curr = new Assignment(f.Key, new BoolConstant(f.Value)); seq = seq == null ? curr : new Sequence(seq, curr); }); } //seq = new Sequence(seq, goal2); // // logger.Info("Assignments: " + seq); var trans1 = new Transition(new Event("a0"), null, seq, states[0], states[1]); lts.Transitions.Add(trans1); logger.Info(lts); AutomataBDD systemBDD = lts.Encode(encoder); systemBDD.PrintTransition(); CUDDNode initDD = CUDD.Function.Or( systemBDD.initExpression.TranslateBoolExpToBDD(encoder.model).GuardDDs); bool reach1 = true; var path = new List <CUDDNode>(); var geneTransition = tempAutomata; InitInitialState(geneTransition, systemBDD, letters); var goal = SetGoalsBasedOnAutomata(geneTransition); var goal3 = CreateExpressionsFromBooleanNetwork(booleanNetwok, availableFunctions, depth, Mode.Equal); goal = new PrimitiveApplication(PrimitiveApplication.AND, goal, goal3); logger.Info("Goal: " + goal); path = IsExistPath(goal, encoder, path, initDD, systemBDD, letters, ref reach1); path.Clear(); encoder.model.Close(); return(reach1); } }
public override void MakeDiscreteTransition(List <Expression> guards, List <Event> events, List <Expression> programBlocks, List <Process> processes, Model model, SymbolicLTS lts) { lts.AddParaInChannelAsLocalVar(ExpressionList); if (model.mapChannelToSize.ContainsKey(ChannelName)) { List <Expression> guardUpdateChannel = AutomataBDD.GetGuardUpdateOfChannelInput(this.ChannelName, new BoolConstant(true), new List <Expression>(ExpressionList), AssignmentExpr, model); guardUpdateChannel[0] = Expression.AND(guardUpdateChannel[0], this.GuardExpression); Event channelInput = new BDDEncoder.EventChannelInfo(this.ChannelName, 0, BDDEncoder.EventChannelInfo.EventType.ASYNC_CHANNEL_INPUT); guards.Add(guardUpdateChannel[0]); events.Add(channelInput); programBlocks.Add(guardUpdateChannel[1]); processes.Add(Process); } else { Event channelInput = new BDDEncoder.EventChannelInfo(this.ChannelName, 0, BDDEncoder.EventChannelInfo.EventType.SYNC_CHANNEL_INPUT); channelInput.ExpressionList = this.ExpressionList; guards.Add(null); events.Add(channelInput); programBlocks.Add(null); processes.Add(Process); } }
public override void MakeDiscreteTransition(List <Expression> guards, List <Event> events, List <Expression> programBlocks, List <Process> processes, Model model, SymbolicLTS lts) { List <Expression> guardsTemp = new List <Expression>(); List <Event> eventsTemp = new List <Event>(); List <Expression> programBlocksTemp = new List <Expression>(); List <Process> processesTemp = new List <Process>(); FirstProcess.MakeDiscreteTransition(guardsTemp, eventsTemp, programBlocksTemp, processesTemp, model, lts); for (int i = 0; i < eventsTemp.Count; i++) { if (eventsTemp[i].BaseName != Constants.TERMINATION) { guards.Add(guardsTemp[i]); events.Add(eventsTemp[i]); programBlocks.Add(programBlocksTemp[i]); processes.Add(new Sequence(processesTemp[i], SecondProcess)); } else { guards.Add(guardsTemp[i]); events.Add(new Event(Constants.TAU)); programBlocks.Add(programBlocksTemp[i]); processes.Add(SecondProcess); } } }
/// <summary> /// termination->Stop /// </summary> /// <param name="currentState"></param> /// <param name="lts"></param> /// <param name="process2State"></param> /// <param name="state2UpdatedParas"></param> /// <param name="model"></param> /// <returns></returns> public override void MakeDiscreteTransition(List <Expression> guards, List <Event> events, List <Expression> programBlocks, List <Process> processes, Model model, SymbolicLTS lts) { guards.Add(null); events.Add(new Event(Constants.TERMINATION)); programBlocks.Add(null); processes.Add(new Stop()); }
public override void MakeDiscreteTransition(List <Expression> guards, List <Event> events, List <Expression> programBlocks, List <Process> processes, Model model, SymbolicLTS lts) { guards.Add(null); events.Add(Event); programBlocks.Add(null); processes.Add(Process); }
public override void MakeDiscreteTransition(List <Expression> guards, List <Event> events, List <Expression> programBlocks, List <CSPProcess> processes, Model model, SymbolicLTS lts) { //for (int i = 0; i < Args.Length; i++) //{ // string paraName = Def.Parameters[i]; // if (!lts.Parameters.Contains(paraName)) // { // int lowerBound = (Def.ParameterLowerBound.ContainsKey(paraName)) ? Def.ParameterLowerBound.GetContainsKey(paraName) : Model.BDD_INT_LOWER_BOUND; // int upperBound = (Def.ParameterUpperLowerBound.ContainsKey(paraName)) ? Def.ParameterUpperLowerBound.GetContainsKey(paraName) : Model.BDD_INT_UPPER_BOUND; // lts.Parameters.Add(paraName); // lts.ParameterUpperBound.Add(paraName, upperBound); // lts.ParameterLowerBound.Add(paraName, lowerBound); // } //} //Expression updatePara = GetUpdatePara(); //if (updatePara != null) //{ // guards.Add(null); // events.Add(new Event(Constants.TAU)); // programBlocks.Add(updatePara); // processes.Add(Def.Process); //} //else //{ // Def.Process.MakeDiscreteTransition(guards, events, programBlocks, processes, model, lts); //} Def.Process.MakeDiscreteTransition(guards, events, programBlocks, processes, model, lts); }
public override void MakeDiscreteTransition(List <Expression> guards, List <Event> events, List <Expression> programBlocks, List <Process> processes, Model model, SymbolicLTS lts) { guards.Add(ConditionalExpression); events.Add(new Event(Constants.TAU)); programBlocks.Add(null); processes.Add(FirstProcess); guards.Add(Expression.NOT(ConditionalExpression)); events.Add(new Event(Constants.TAU)); programBlocks.Add(null); processes.Add(SecondProcess); }
public override void MakeDiscreteTransition(List<Expression> guards, List<Event> events, List<Expression> programBlocks, List<Process> processes, Model model, SymbolicLTS lts) { List<Expression> guardsTemp = new List<Expression>(); List<Event> eventsTemp = new List<Event>(); List<Expression> programBlocksTemp = new List<Expression>(); List<Process> processesTemp = new List<Process>(); FirstProcess.MakeDiscreteTransition(guardsTemp, eventsTemp, programBlocksTemp, processesTemp, model, lts); for (int i = 0; i < eventsTemp.Count; i++ ) { guards.Add(Expression.CombineGuard(guardsTemp[i], ConditionalExpression)); events.Add(eventsTemp[i]); programBlocks.Add(programBlocksTemp[i]); processes.Add(processesTemp[i]); } guardsTemp = new List<Expression>(); eventsTemp = new List<Event>(); programBlocksTemp = new List<Expression>(); processesTemp = new List<Process>(); SecondProcess.MakeDiscreteTransition(guardsTemp, eventsTemp, programBlocksTemp, processesTemp, model, lts); for (int i = 0; i < eventsTemp.Count; i++) { guards.Add(Expression.CombineGuard(guardsTemp[i], Expression.NOT(ConditionalExpression))); events.Add(eventsTemp[i]); programBlocks.Add(programBlocksTemp[i]); processes.Add(processesTemp[i]); } }
public override void MakeDiscreteTransition(List <Expression> guards, List <Event> events, List <Expression> programBlocks, List <Process> processes, Model model, SymbolicLTS lts) { for (int i = 0; i < Processes.Count; i++) { List <Expression> guardsTemp = new List <Expression>(); List <Event> eventsTemp = new List <Event>(); List <Expression> programBlocksTemp = new List <Expression>(); List <Process> processesTemp = new List <Process>(); Processes[i].MakeDiscreteTransition(guardsTemp, eventsTemp, programBlocksTemp, processesTemp, model, lts); for (int j = 0; j < eventsTemp.Count; j++) { if (eventsTemp[j].BaseName != Constants.TAU) { guards.Add(guardsTemp[j]); events.Add(eventsTemp[j]); programBlocks.Add(programBlocksTemp[j]); processes.Add(processesTemp[j]); } else { //choice is not resolved List <Process> newChoice = new List <Process>(Processes); newChoice[i] = processesTemp[j]; guards.Add(guardsTemp[j]); events.Add(eventsTemp[j]); programBlocks.Add(programBlocksTemp[j]); processes.Add(new IndexExternalChoice(newChoice)); } } } }
public override void MakeDiscreteTransition(List <Expression> guards, List <Event> events, List <Expression> programBlocks, List <Process> processes, Model model, SymbolicLTS lts) { if (model.mapChannelToSize.ContainsKey(ChannelName)) { List <Expression> guardUpdateChannel = AutomataBDD.GetGuardUpdateOfChannelOutput(this.ChannelName, new List <Expression>(ExpressionList), null, model); Event channelOutput = new BDDEncoder.EventChannelInfo(this.ChannelName, 0, BDDEncoder.EventChannelInfo.EventType.ASYNC_CHANNEL_OUTPUT); guards.Add(guardUpdateChannel[0]); events.Add(channelOutput); programBlocks.Add(guardUpdateChannel[1]); processes.Add(Process); } else { Event channelOutput = new BDDEncoder.EventChannelInfo(this.ChannelName, 0, BDDEncoder.EventChannelInfo.EventType.SYNC_CHANNEL_OUTPUT); channelOutput.ExpressionList = this.ExpressionList; guards.Add(null); events.Add(channelOutput); programBlocks.Add(null); processes.Add(Process); } }
public override void MakeDiscreteTransition(List <Expression> guards, List <Event> events, List <Expression> programBlocks, List <Process> processes, Model model, SymbolicLTS lts) { foreach (Process Process in Processes) { Process.MakeDiscreteTransition(guards, events, programBlocks, processes, model, lts); } }
public override void MakeDiscreteTransition(List <Expression> guards, List <Event> events, List <Expression> programBlocks, List <Process> processes, Model model, SymbolicLTS lts) { Expression allCondition = new BoolConstant(false); for (int i = 0; i < Processes.Length; i++) { guards.Add(Expression.AND(Expression.NOT(allCondition), Conditions[i])); events.Add(new Event(Constants.TAU)); programBlocks.Add(null); processes.Add(Processes[i]); if (i == 0) { allCondition = Conditions[0]; } else { allCondition = Expression.OR(allCondition, Conditions[i]); } } guards.Add(Expression.NOT(allCondition)); events.Add(new Event(Constants.TAU)); programBlocks.Add(null); processes.Add(new Skip()); }
public void Test1Test() { var sb = new StringBuilder(); string varX = "x"; string varY = "y"; //Set number of action names, 2 for a, b Model.NUMBER_OF_EVENT = 3; Model.MAX_NUMBER_EVENT_PARAMETERS = 0; BDDEncoder encoder = new BDDEncoder(); encoder.model.AddGlobalVar(varX, 0, 10); encoder.model.AddGlobalVar(varY, 0, 10); SymbolicLTS lts = new SymbolicLTS(); State state1 = lts.AddState(); State state2 = lts.AddState(); State state3 = lts.AddState(); State state4 = lts.AddState(); lts.InitialState = state1; var primitiveApplication1 = new Assignment(varX, new PrimitiveApplication(PrimitiveApplication.PLUS, new Variable(varX), new IntConstant(1))); var primitiveApplication2 = new Assignment(varY, new PrimitiveApplication(PrimitiveApplication.PLUS, new Variable(varY), new IntConstant(4))); /* * * for (int i = 0; i < exps.Count; i++) * { * //Update eventParameterVariables[i] = exps[i] * //Don't need to update exps because later after synchronization, not updated variable keeps the same value * update = new Sequence(update, new Assignment(model.eventParameterVariables[i], exps[i])); * } */ var primitiveApplication = new Sequence(primitiveApplication1, primitiveApplication2); /*PrimitiveApplication.CombineProgramBlock( * primitiveApplication1, * primitiveApplication2);*/ logger.Info(primitiveApplication); Transition trans1 = new Transition(new Event("a"), null, primitiveApplication, state1, state2); Expression assignment = new Assignment(varX, new PrimitiveApplication(PrimitiveApplication.PLUS, new Variable(varX), new IntConstant(2))); logger.Info("Assignments: " + assignment); var secAssignment = new Assignment(varY, new PrimitiveApplication(PrimitiveApplication.PLUS, new Variable(varY), new WildConstant())); Transition trans2 = new Transition(new Event("b"), null, primitiveApplication, state2, state3); Transition trans3 = new Transition(new Event("c"), null, primitiveApplication, state3, state4); lts.AddTransition(trans1); lts.AddTransition(trans2); lts.AddTransition(trans3); AutomataBDD systemBDD = lts.Encode(encoder); //Variable x is initialised to 1 systemBDD.initExpression = new PrimitiveApplication(PrimitiveApplication.AND, systemBDD.initExpression, new PrimitiveApplication(PrimitiveApplication.EQUAL, new Variable(varX), new IntConstant(1))); systemBDD.initExpression = new PrimitiveApplication(PrimitiveApplication.AND, systemBDD.initExpression, new PrimitiveApplication(PrimitiveApplication.EQUAL, new Variable(varY), new IntConstant(1))); CUDDNode initDD = CUDD.Function.Or(systemBDD.initExpression.TranslateBoolExpToBDD(encoder.model).GuardDDs); logger.Info("init: " + systemBDD.initExpression); var u = 1; for (; u < 2; u++) { logger.Info($"U is {u}"); //Define 2 goals Expression goal1 = new PrimitiveApplication(PrimitiveApplication.EQUAL, new Variable(varX), new IntConstant(3)); goal1 = new PrimitiveApplication(PrimitiveApplication.AND, goal1, new PrimitiveApplication(PrimitiveApplication.EQUAL, new Variable(varY), new IntConstant(9))); //Encode 2 goals to BDD CUDDNode goal1DD = CUDD.Function.Or(goal1.TranslateBoolExpToBDD(encoder.model).GuardDDs); logger.Info("Goal: " + goal1); List <CUDDNode> path = new List <CUDDNode>(); bool reach1 = encoder.model.PathForward(initDD, goal1DD, new List <List <CUDDNode> >() { systemBDD.transitionBDD }, path, true); if (reach1) { sb.AppendLine("goal1 is reachable"); foreach (var cuddNode in path) { encoder.model.PrintAllVariableValue(cuddNode); logger.Info("after"); CUDD.Print.PrintMinterm(cuddNode); // CUDD.Print.PrintBDDTree(path); int valueOfX = encoder.model.GetRowVarValue(cuddNode, varX); sb.AppendLine(varX + " = " + valueOfX); int valueOfY = encoder.model.GetRowVarValue(cuddNode, varY); sb.AppendLine(varY + " = " + valueOfY); } } else { sb.AppendLine("goal1 is unreachable"); } path.Clear(); } /* * bool reach2 = encoder.model.PathForward(initDD, goal2DD, new List<List<CUDDNode>>() { systemBDD.transitionBDD }, path, true); * if (reach2) * { * sb.AppendLine("goal2 is reachable"); * foreach (var cuddNode in path) * { * int valueOfX = encoder.model.GetRowVarValue(cuddNode, varX); * sb.AppendLine(varX + " = " + valueOfX); * } * } * else * { * sb.AppendLine("goal2 is unreachable"); * } */ logger.Info(sb); encoder.model.Close(); }
public override void MakeDiscreteTransition(List <Expression> guards, List <Event> events, List <Expression> programBlocks, List <Process> processes, Model model, SymbolicLTS lts) { foreach (Process Process in Processes) { guards.Add(null); events.Add(new Event(Constants.TAU)); programBlocks.Add(null); processes.Add(Process); } }