private MDPStat BuildMDP() { Stack <KeyValuePair <MDPConfiguration, MDPStateStat> > working = new Stack <KeyValuePair <MDPConfiguration, MDPStateStat> >(1024); string initID = InitialStep.GetID(); MDPStateStat init = new MDPStateStat(initID); working.Push(new KeyValuePair <MDPConfiguration, MDPStateStat>(InitialStep as MDPConfiguration, init)); MDPStat mdp = new MDPStat(init, Ultility.Ultility.DEFAULT_PRECISION, Ultility.Ultility.MAX_DIFFERENCE); do { if (CancelRequested) { VerificationOutput.NoOfStates = mdp.States.Count; return(mdp); } KeyValuePair <MDPConfiguration, MDPStateStat> current = working.Pop(); IEnumerable <MDPConfiguration> list = current.Key.MakeOneMoveLocal(); VerificationOutput.Transitions += list.Count(); int currentDistriIndex = -1; DistributionStat newDis = new DistributionStat(Constants.TAU); //for (int i = 0; i < list.Length; i++) foreach (MDPConfiguration step in list) { //MDPConfiguration step = list[i]; string stepID = step.GetID(); MDPStateStat nextState; if (!mdp.States.TryGetValue(stepID, out nextState)) { nextState = new MDPStateStat(stepID); mdp.AddState(nextState); ExpressionValue v = EvaluatorDenotational.Evaluate(ReachableStateCondition, step.GlobalEnv); if ((v as BoolConstant).Value) { mdp.AddTargetStates(nextState); } else { working.Push(new KeyValuePair <MDPConfiguration, MDPStateStat>(step, nextState)); } } if (step.DisIndex == -1) { if (currentDistriIndex >= 0) { current.Value.AddDistribution(newDis); newDis = new DistributionStat(Constants.TAU); } var newTrivialDis = new DistributionStat(step.Event); newTrivialDis.AddProbStatePair(1, nextState); current.Value.AddDistribution(newTrivialDis); } else if (currentDistriIndex != -1 && step.DisIndex != currentDistriIndex) { current.Value.AddDistribution(newDis); newDis = new DistributionStat(Constants.TAU); newDis.AddProbStatePair(step.Probability, nextState); } else { newDis.AddProbStatePair(step.Probability, nextState); } currentDistriIndex = step.DisIndex; } if (currentDistriIndex >= 0) { current.Value.AddDistribution(newDis); } } while (working.Count > 0); VerificationOutput.NoOfStates = mdp.States.Count; return(mdp); }
private MDPStat BuildMDP() { Stack<KeyValuePair<MDPConfiguration, MDPStateStat>> working = new Stack<KeyValuePair<MDPConfiguration, MDPStateStat>>(1024); string initID = InitialStep.GetID(); MDPStateStat init = new MDPStateStat(initID); working.Push(new KeyValuePair<MDPConfiguration, MDPStateStat>(InitialStep as MDPConfiguration, init)); MDPStat mdp = new MDPStat(init, Ultility.Ultility.DEFAULT_PRECISION, Ultility.Ultility.MAX_DIFFERENCE); do { if (CancelRequested) { VerificationOutput.NoOfStates = mdp.States.Count; return mdp; } KeyValuePair<MDPConfiguration, MDPStateStat> current = working.Pop(); IEnumerable<MDPConfiguration> list = current.Key.MakeOneMoveLocal(); VerificationOutput.Transitions += list.Count(); int currentDistriIndex = -1; DistributionStat newDis = new DistributionStat(Constants.TAU); //for (int i = 0; i < list.Length; i++) foreach (MDPConfiguration step in list) { //MDPConfiguration step = list[i]; string stepID = step.GetID(); MDPStateStat nextState; if (!mdp.States.TryGetValue(stepID, out nextState)) { nextState = new MDPStateStat(stepID); mdp.AddState(nextState); ExpressionValue v = EvaluatorDenotational.Evaluate(ReachableStateCondition, step.GlobalEnv); if ((v as BoolConstant).Value) { mdp.AddTargetStates(nextState); } else { working.Push(new KeyValuePair<MDPConfiguration, MDPStateStat>(step, nextState)); } } if (step.DisIndex == -1) { if (currentDistriIndex >= 0) { current.Value.AddDistribution(newDis); newDis = new DistributionStat(Constants.TAU); } var newTrivialDis = new DistributionStat(step.Event); newTrivialDis.AddProbStatePair(1, nextState); current.Value.AddDistribution(newTrivialDis); } else if (currentDistriIndex != -1 && step.DisIndex != currentDistriIndex) { current.Value.AddDistribution(newDis); newDis = new DistributionStat(Constants.TAU); newDis.AddProbStatePair(step.Probability, nextState); } else { newDis.AddProbStatePair(step.Probability, nextState); } currentDistriIndex = step.DisIndex; } if (currentDistriIndex >= 0) { current.Value.AddDistribution(newDis); } } while (working.Count > 0); VerificationOutput.NoOfStates = mdp.States.Count; return mdp; }