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); }