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);
        }
Пример #2
0
 public LtmcTestBuilderWithStatesAsNumbers()
 {
     _transitionBuffer.Resize(TransitionCapacity * sizeof(LtmcTransition), zeroMemory: false);
     _transitions = (LtmcTransition *)_transitionBuffer.Pointer;
     Ltmc         = new LabeledTransitionMarkovChain(StateCapacity, TransitionCapacity);
     LtmcBuilder  = new LabeledTransitionMarkovChain.LtmcBuilder(Ltmc);
 }
 public LtmcTestBuilder()
 {
     _transitionBuffer.Resize(TransitionCapacity * sizeof(LtmcTransition), zeroMemory: false);
     _transitions = (LtmcTransition *)_transitionBuffer.Pointer;
     Ltmc         = new LabeledTransitionMarkovChain(StateCapacity, TransitionCapacity);
     LtmcBuilder  = new LabeledTransitionMarkovChain.LtmcBuilder <SimpleExecutableModel>(Ltmc);
 }
Пример #4
0
        public LtmcRetraverseTransitionSetBuilder(TemporaryStateStorage temporalStateStorage, long capacity)
        {
            Requires.That(capacity <= (1 << 30), nameof(capacity), $"Maximum supported capacity is {1 << 30}.");

            _capacity = capacity;

            _transitionBuffer.Resize(capacity * sizeof(LtmcTransition), zeroMemory: false);
            _transitions = (LtmcTransition *)_transitionBuffer.Pointer;

            _temporalStateStorage = temporalStateStorage;
        }
Пример #5
0
        /// <summary>
        ///   Initializes a new instance.
        /// </summary>
        /// <param name="temporalStateStorage">A storage where temporal states can be saved to.</param>
        /// <param name="capacity">The maximum number of successors that can be cached.</param>
        /// <param name="formulas">The formulas that should be checked for all successor states.</param>
        public LtmcTransitionSetBuilder(TemporaryStateStorage temporalStateStorage, long capacity, params Func <bool>[] formulas)
        {
            Requires.NotNull(temporalStateStorage, nameof(temporalStateStorage));
            Requires.NotNull(formulas, nameof(formulas));
            Requires.That(formulas.Length < 32, "At most 32 formulas are supported.");
            Requires.That(capacity <= (1 << 30), nameof(capacity), $"Maximum supported capacity is {1 << 30}.");

            _temporalStateStorage = temporalStateStorage;
            _formulas             = formulas;
            _capacity             = capacity;

            _transitionBuffer.Resize(capacity * sizeof(LtmcTransition), zeroMemory: false);
            _transitions = (LtmcTransition *)_transitionBuffer.Pointer;
        }
        /// <summary>
        ///   Initializes a new instance.
        /// </summary>
        /// <param name="model">The model the successors are computed for.</param>
        /// <param name="capacity">The maximum number of successors that can be cached.</param>
        /// <param name="formulas">The formulas that should be checked for all successor states.</param>
        public LtmcTransitionSetBuilder(ExecutableModel <TExecutableModel> model, long capacity, params Func <bool>[] formulas)
        {
            Requires.NotNull(model, nameof(model));
            Requires.NotNull(formulas, nameof(formulas));
            Requires.That(formulas.Length < 32, "At most 32 formulas are supported.");
            Requires.That(capacity <= (1 << 30), nameof(capacity), $"Maximum supported capacity is {1 << 30}.");

            _stateVectorSize = model.StateVectorSize;
            _formulas        = formulas;
            _capacity        = capacity;

            _transitionBuffer.Resize(capacity * sizeof(LtmcTransition), zeroMemory: false);
            _transitions = (LtmcTransition *)_transitionBuffer.Pointer;

            _targetStateBuffer.Resize(capacity * model.StateVectorSize, zeroMemory: true);
            _targetStateMemory = _targetStateBuffer.Pointer;
        }
 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);
     }
 }
        private void MergeCandidateWithAllApplicableTargets(LtmcTransition *mergeInCandidate, int mergeInCandidateIndex)
        {
            var mergeInCandidateHash  = GetCandidateHash(mergeInCandidateIndex);
            var toMergeCandidateIndex = mergeInCandidateIndex + 1;

            while (!CandidateIsOutOfIndexOrHasDifferentHash(mergeInCandidateHash, toMergeCandidateIndex))
            {
                var toMergeCandidate = GetCandidateTransition(toMergeCandidateIndex);
                if (TransitionFlags.IsValid(toMergeCandidate->Flags))
                {
                    if (CanTransitionsBeMerged(mergeInCandidate, toMergeCandidate))
                    {
                        MergeTransitions(mergeInCandidate, toMergeCandidate);
                    }
                }
                toMergeCandidateIndex++;
            }
        }
 private void MergeTransitions(LtmcTransition *mergeInCandidate, LtmcTransition *toMergeCandidate)
 {
     mergeInCandidate->Probability += toMergeCandidate->Probability;
     toMergeCandidate->Flags        = TransitionFlags.RemoveValid(toMergeCandidate->Flags);
 }
Пример #10
0
 public LtmcTestBuilderWithStatesAsByteVector()
 {
     _transitionBuffer.Resize(TransitionCapacity * sizeof(LtmcTransition), zeroMemory: false);
     _transitions          = (LtmcTransition *)_transitionBuffer.Pointer;
     TemporaryStateStorage = new TemporaryStateStorage(sizeof(int), StateCapacity);
 }
Пример #11
0
 private void CheckIfTransitionIsValid(LtmcTransition *transition)
 {
     Assert.That(TransitionFlags.IsValid(transition->Flags), "Attempted to add an invalid transition.");
 }
Пример #12
0
            private void CreateNewTransitionChainStartWithTransition(int sourceState, bool areInitialTransitions, LtmcTransition *transition)
            {
                var locationOfNewEntry = _markovChain.GetPlaceForNewTransitionChainElement();

                if (areInitialTransitions)
                {
                    _markovChain._indexOfFirstInitialTransition = locationOfNewEntry;
                }
                else
                {
                    _markovChain.SourceStates.Add(sourceState);
                    _markovChain._stateStorageStateToFirstTransitionChainElementMemory[sourceState] = locationOfNewEntry;
                }

                _markovChain._transitionChainElementsMemory[locationOfNewEntry] =
                    new TransitionChainElement
                {
                    Formulas         = transition->Formulas,
                    NextElementIndex = -1,
                    Probability      = transition->Probability,
                    TargetState      = transition->GetTargetStateIndex()
                };
            }
Пример #13
0
            private void AddTransitionToTransitionChain(int sourceState, bool areInitialTransitions, LtmcTransition *probTransition)
            {
                var startPositionOfTransitionChain = GetStartPositionOfTransitionChain(sourceState, areInitialTransitions);

                // startPositionOfTransitionChain == -1 indicates that no transition chain for state exists
                if (startPositionOfTransitionChain == -1)
                {
                    CreateNewTransitionChainStartWithTransition(sourceState, areInitialTransitions, probTransition);
                }
                else
                {
                    AddTransitionToExistingTransitionChain(startPositionOfTransitionChain, probTransition);
                }
            }
Пример #14
0
            private void AddTransitionToExistingTransitionChain(int startPositionOfTransitionChain, LtmcTransition *transition)
            {
                // Search for place to append is linear in number of existing transitions of state => O(n^2)
                var currentTransitionElementIndex = startPositionOfTransitionChain;

                // merge or append
                while (true)
                {
                    var currentElement = GetTransitionChainElement(currentTransitionElementIndex);
                    if (currentElement.TargetState == transition->GetTargetStateIndex() && currentElement.Formulas == transition->Formulas)
                    {
                        //Case 1: Merge
                        _markovChain._transitionChainElementsMemory[currentTransitionElementIndex].Probability =
                            transition->Probability + currentElement.Probability;
                        return;
                    }
                    if (currentElement.NextElementIndex == -1)
                    {
                        //Case 2: Append
                        var locationOfNewEntry = _markovChain.GetPlaceForNewTransitionChainElement();
                        _markovChain._transitionChainElementsMemory[currentTransitionElementIndex].NextElementIndex =
                            locationOfNewEntry;
                        _markovChain._transitionChainElementsMemory[locationOfNewEntry] =
                            new TransitionChainElement
                        {
                            Formulas         = transition->Formulas,
                            NextElementIndex = -1,
                            Probability      = transition->Probability,
                            TargetState      = transition->GetTargetStateIndex()
                        };
                        return;
                    }
                    //else continue iteration
                    currentTransitionElementIndex = currentElement.NextElementIndex;
                }
            }