private bool CanTransitionsBeMerged(LtmcTransition *a, LtmcTransition *b)
        {
            var aToStuttering = TransitionFlags.IsToStutteringState(a->Flags);
            var bToStuttering = TransitionFlags.IsToStutteringState(b->Flags);

            if (aToStuttering != bToStuttering)
            {
                // Target states do not match
                return(false);
            }
            if (!aToStuttering)
            {
                // both target states are not the stuttering state. So check if the states match
                if (!MemoryBuffer.AreEqual(a->TargetStatePointer, b->TargetStatePointer, RelevantStateVectorSize))
                {
                    return(false);
                }
            }
            if (a->Flags != b->Flags)
            {
                return(false);
            }
            if (a->Formulas != b->Formulas)
            {
                return(false);
            }
            return(true);
        }
 private uint HashTransition(LtmcTransition *transition)
 {
     // hashing see FNV hash at http://eternallyconfuzzled.com/tuts/algorithms/jsw_tut_hashing.aspx
     if (!TransitionFlags.IsValid(transition->Flags))
     {
         return(0);
     }
     unchecked
     {
         uint hash = 0;
         if (!TransitionFlags.IsToStutteringState(transition->Flags))
         {
             hash = MemoryBuffer.Hash(transition->TargetStatePointer, RelevantStateVectorSize, 0);
         }
         hash = hash * 397 ^ (uint)transition->Formulas.GetHashCode();
         return(hash);
     }
 }
Ejemplo n.º 3
0
        /// <summary>
        ///   Handles the <paramref name="transitions" />, adding newly discovered states so that they are not visited again.
        /// </summary>
        private void HandleTransitions(TransitionCollection transitions, int sourceState, bool isInitial)
        {
            try
            {
                var transitionCount = 0;
                var stateCount      = 0;

                foreach (var modifier in _transitionModifiers)
                {
                    modifier.ModifyTransitions(_context, this, transitions, _context.States[sourceState], sourceState, isInitial);
                }

                _stateStack.PushFrame();

                foreach (var transition in transitions)
                {
                    int  targetState;
                    bool isNewState;

                    if (TransitionFlags.IsToStutteringState(((CandidateTransition *)transition)->Flags))
                    {
                        isNewState  = false;
                        targetState = _context.StutteringStateIndex;
                    }
                    else
                    {
                        isNewState = _context.States.AddState(((CandidateTransition *)transition)->TargetStatePointer, out targetState);
                    }

                    // Replace the CandidateTransition.TargetState pointer with the unique indexes of the transition's source and target states
                    transition->TargetStateIndex = targetState;
                    transition->SourceStateIndex = sourceState;
                    transition->Flags            = TransitionFlags.SetIsStateTransformedToIndexFlag(transition->Flags);

                    if (isNewState)
                    {
                        ++stateCount;
                        _stateStack.PushState(targetState);

                        foreach (var action in _stateActions)
                        {
                            action.ProcessState(_context, this, _context.States[targetState], targetState, isInitial);
                        }
                    }

                    foreach (var action in _transitionActions)
                    {
                        action.ProcessTransition(_context, this, transition, isInitial);
                    }

                    ++transitionCount;
                }

                Interlocked.Add(ref _context.StateCount, stateCount);
                Interlocked.Add(ref _context.TransitionCount, transitionCount);
                Interlocked.Add(ref _context.ComputedTransitionCount, transitions.TotalCount);

                foreach (var action in _batchedTransitionActions)
                {
                    action.ProcessTransitions(_context, this, sourceState, transitions, transitionCount, isInitial);
                }
            }
            catch (Exception e)
            {
                _context.LoadBalancer.Terminate();
                _context.Exception = e;

                if (!(e is OutOfMemoryException))
                {
                    CreateCounterExample(endsWithException: true, addAdditionalState: false);
                }
            }
        }