示例#1
0
        private TransitionInformation ProcessTransitionForWorkUnit(WorkUnit unit, Transition transition)
        {
            SimulationContext activeContext = unit.Context.CloneCast();
            Violation         newViolation  = null;

            TransitionInformation transitionInfo = new TransitionInformation()
            {
                PreViolation = activeContext.CurrentViolation,
                Transition   = transition
            };

            try
            {
                activeContext.AddVisitedTransition(transitionInfo);

                activeContext.CurrentTransition = transition;

                transition.Evaluate(activeContext);

                newViolation = (Violation)transition.OnSuccess(activeContext);

                //
                // Associate the transitive violation that is enabled by the current violation.
                //

                if (newViolation != null)
                {
                    activeContext.CurrentViolation.AddTransitiveViolation(newViolation);

                    transitionInfo.PostViolation = newViolation;
                }
                else
                {
                    transitionInfo.PostViolation = transitionInfo.PreViolation;
                }
            }
            catch (ConstraintNotSatisfied ex)
            {
                activeContext.FailureReason  = String.Format("Constraint not satisfied on transition '{0}': {1}", transitionInfo.Transition, ex.Message);
                activeContext.Exploitability = 0;
            }

            if (activeContext.Exploitability == 0)
            {
                if (activeContext.Global.TrackImpossible)
                {
                    activeContext.Global.AddCompletedSimulationContext(activeContext);
                }

                return(null);
            }

            if (this.OnTransition != null)
            {
                this.OnTransition(transitionInfo);
            }

            if (Debug)
            {
                Console.WriteLine("Visited transitions with hash {0},{1},{2} = {3}:",
                                  unit.Context.AssumptionsEquivalenceClass,
                                  unit.Context.TransitionsEquivalenceClass,
                                  unit.Context.ViolationsEquivalenceClass,
                                  unit.Context.InvariantEquivalenceClass
                                  );
                foreach (TransitionInformation i in activeContext.VisitedTransitions)
                {
                    Console.WriteLine("\t{0} --> {1} --> {2}",
                                      i.PreViolation,
                                      i.Transition.Label,
                                      i.PostViolation);
                }
                Console.WriteLine("-------");
            }

            //
            // If the simulation has reached a completion state, log it as successful and return.
            //

            if (this.IsSimulationComplete != null && this.IsSimulationComplete(activeContext))
            {
                activeContext.Global.AddCompletedSimulationContext(activeContext);
                return(transitionInfo);
            }

            //
            // Add new work units based on the state that we have transitioned to.
            //

            AddWorkUnits(activeContext, newViolation);

            return(transitionInfo);
        }