public Transition ClearConstant(List<State> newStates, Dictionary<string, Expression> constMapping, bool checkSelect) { ParallelDefinition[] newSelects = null; if (checkSelect && Selects != null) { newSelects = new ParallelDefinition[Selects.Length]; for (int i = 0; i < Selects.Length; i++) { newSelects[i] = newSelects[i].ClearConstant(constMapping); } } State newFrom = null, newTo = null; foreach (State state in newStates) { if (state.Name == FromState.Name) { newFrom = state; } if (state.Name == ToState.Name) { newTo = state; } } return new Transition(Event.ClearConstant(constMapping), newSelects, GuardCondition == null ? GuardCondition : GuardCondition.ClearConstant(constMapping), ProgramBlock == null ? ProgramBlock : ProgramBlock.ClearConstant(constMapping), newFrom, newTo); }
//string[] localvar, public PNTransition(Event e, ParallelDefinition[] selects, Expression guard, Expression assignment, PNPlace from, PNPlace to) { Event = e; Selects = selects; ProgramBlock = assignment; GuardCondition = guard; FromPNPlace = from; ToPNPlace = to; }
//string[] localvar, public Transition(Event e, ParallelDefinition[] selects, Expression Guard, Expression assignment, State from, State to) { Event = e; Selects = selects; ProgramBlock = assignment; //LocalVariables = localvar; GuardCondition = Guard; FromState = from; ToState = to; }
public PNTransition ClearConstant(List<PNPlace> newPNPlaces, Dictionary<string, Expression> constMapping, bool checkSelect) { ParallelDefinition[] newSelects = null; if (checkSelect && Selects != null) { newSelects = new ParallelDefinition[Selects.Length]; for (int i = 0; i < Selects.Length; i++) newSelects[i] = newSelects[i].ClearConstant(constMapping); } PNPlace newFrom = null, newTo = null; foreach (PNPlace PNPlace in newPNPlaces) { if (PNPlace.Name == FromPNPlace.Name) newFrom = PNPlace; if (PNPlace.Name == ToPNPlace.Name) newTo = PNPlace; } return new PNTransition(Event.ClearConstant(constMapping), newSelects, GuardCondition == null ? GuardCondition : GuardCondition.ClearConstant(constMapping), ProgramBlock == null ? ProgramBlock : ProgramBlock.ClearConstant(constMapping), newFrom, newTo); }
public List <ProcessBase> GetCountedProcess(SortedDictionary <string, Expression> environment) { Dictionary <string, Expression> constMapping; if (environment != null) { constMapping = new Dictionary <string, Expression>(environment); } else { constMapping = new Dictionary <string, Expression>(); } //ProcessBase process = this.Process.ClearConstant(constMapping); List <ParallelDefinition> newDefinitions = new List <ParallelDefinition>(); // bool hasVar = false; foreach (ParallelDefinition definition in Definitions) { ParallelDefinition newPD = definition.ClearConstant(constMapping); //if (newPD.HasVaraible) //{ // hasVar = true; //} newDefinitions.Add(newPD); } // System.Diagnostics.Debug.Assert(!hasVar); //if (hasVar) //{ // return new IndexInterleaveTemp(Process, newDefinitions); //} //else { List <ProcessBase> processes = new List <ProcessBase>(16); //List<string> avoidsVars = new List<string>(); foreach (ParallelDefinition pd in newDefinitions) { pd.DomainValues.Sort(); } List <List <Expression> > list = new List <List <Expression> >(); foreach (int v in newDefinitions[0].DomainValues) { List <Expression> l = new List <Expression>(newDefinitions.Count); l.Add(new IntConstant(v)); list.Add(l); } for (int i = 1; i < newDefinitions.Count; i++) { List <List <Expression> > newList = new List <List <Expression> >(); List <int> domain = newDefinitions[i].DomainValues; for (int j = 0; j < list.Count; j++) { foreach (int i1 in domain) { List <Expression> cList = new List <Expression>(list[j]); cList.Add(new IntConstant(i1)); newList.Add(cList); } } list = newList; } foreach (List <Expression> constants in list) { Dictionary <string, Expression> constMappingNew = new Dictionary <string, Expression>(); for (int i = 0; i < constants.Count; i++) { Expression constant = constants[i]; constant.BuildVars(); constMappingNew.Add(newDefinitions[i].Parameter, constant); } ProcessBase newProcess = Process.ClearConstant(constMappingNew); processes.Add(newProcess); } return(processes); } }
public ParallelDefinition ClearConstant(Dictionary <string, Expression> constMapping) { ParallelDefinition pd = new ParallelDefinition(Parameter, Token); try { if (LowerBound == null) { foreach (Expression expression in Domain) { Expression newExp = expression.ClearConstant(constMapping); if (!newExp.HasVar) { ExpressionValue val = EvaluatorDenotational.Evaluate(newExp, null); if (val is IntConstant) { pd.Domain.Add(val); pd.DomainValues.Add((val as IntConstant).Value); } else { throw new ParsingException("An integer value is expected, but not " + val, Token); } } else { pd.Domain.Add(newExp); } } } else { pd.LowerBound = LowerBound.ClearConstant(constMapping); pd.UpperBound = UpperBound.ClearConstant(constMapping); if (!pd.LowerBound.HasVar && !pd.UpperBound.HasVar) { ExpressionValue lower = EvaluatorDenotational.Evaluate(pd.LowerBound, null); ExpressionValue upper = EvaluatorDenotational.Evaluate(pd.UpperBound, null); if (lower is IntConstant && upper is IntConstant) { int low = (lower as IntConstant).Value; int up = (upper as IntConstant).Value; if (low > up) { throw new ParsingException("The variable range's starting value " + low + " should be smaller than ending value" + up + ".", Token); } else { pd = new ParallelDefinition(Parameter, Token); for (int i = low; i <= up; i++) { pd.Domain.Add(new IntConstant(i)); pd.DomainValues.Add(i); } } } else { throw new ParsingException("Integers value are expected, but not " + lower + " and " + upper, Token); } } } } catch (Exception ex) { throw new ParsingException(ex.Message, Token); } return(pd); }
public ParallelDefinition ClearConstant(Dictionary<string, Expression> constMapping) { ParallelDefinition pd = new ParallelDefinition(Parameter, Token); try { if (LowerBound == null) { foreach (Expression expression in Domain) { Expression newExp = expression.ClearConstant(constMapping); if (!newExp.HasVar) { ExpressionValue val = EvaluatorDenotational.Evaluate(newExp, null); if (val is IntConstant) { pd.Domain.Add(val); pd.DomainValues.Add((val as IntConstant).Value); } else { throw new ParsingException("An integer value is expected, but not " + val, Token); } } else { pd.Domain.Add(newExp); } } } else { pd.LowerBound = LowerBound.ClearConstant(constMapping); pd.UpperBound = UpperBound.ClearConstant(constMapping); if (!pd.LowerBound.HasVar && !pd.UpperBound.HasVar) { ExpressionValue lower = EvaluatorDenotational.Evaluate(pd.LowerBound, null); ExpressionValue upper = EvaluatorDenotational.Evaluate(pd.UpperBound, null); if (lower is IntConstant && upper is IntConstant) { int low = (lower as IntConstant).Value; int up = (upper as IntConstant).Value; if (low > up) { throw new ParsingException("The variable range's starting value " + low + " should be smaller than ending value" + up + ".", Token); } else { pd = new ParallelDefinition(Parameter, Token); for (int i = low; i <= up; i++) { pd.Domain.Add(new IntConstant(i)); pd.DomainValues.Add(i); } } } else { throw new ParsingException("Integers value are expected, but not " + lower + " and " + upper, Token); } } } } catch (Exception ex) { throw new ParsingException(ex.Message, Token); } return pd; }