/// <summary> /// Adds the <paramref name="sourceState" /> and all of its <see cref="transitions" /> to the state graph. /// </summary> /// <param name="sourceState">The state that should be added.</param> /// <param name="isInitial">Indicates whether the state is an initial state.</param> /// <param name="transitions">The transitions leaving the state.</param> /// <param name="transitionCount">The number of valid transitions leaving the state.</param> internal void AddStateInfo(int sourceState, bool isInitial, TransitionCollection transitions, int transitionCount) { Assert.That(transitionCount > 0, "Cannot add deadlock state."); Dictionary <EnrichedTargetState, double> container; if (isInitial) { container = _initialStates; } else { if (_transitions.ContainsKey(sourceState)) { container = _transitions[sourceState]; } else { container = new Dictionary <EnrichedTargetState, double>(); _transitions[sourceState] = container; } } // Search for place to append is linear in number of existing transitions of state linearly => O(n^2) foreach (var transition in transitions) { var probTransition = (LtmcTransition *)transition; Assert.That(TransitionFlags.IsValid(probTransition->Flags), "Attempted to add an invalid transition."); var enrichedTargetState = new EnrichedTargetState(transition->TargetStateIndex, transition->Formulas); if (container.ContainsKey(enrichedTargetState)) { //Case 1: Merge var currentProbability = container[enrichedTargetState]; container[enrichedTargetState] = currentProbability + probTransition->Probability; } else { //Case 2: Append container.Add(enrichedTargetState, probTransition->Probability); } } }
public bool Equals(EnrichedTargetState other) { return(TargetState == other.TargetState && Formulas.Equals(other.Formulas)); }