/// <summary> /// Returns a list of places between two transitions in a petrinet /// </summary> /// <param name="t1">Transitionname</param> /// <param name="t2">Transitionname</param> /// <param name="petriNet">Petrinet</param> /// <returns>Returns a list of places</returns> /// <autor>Andrej Albrecht</autor> private List<Place> GetListOfPlacesBetweenTwoTransitionsFromPetriNet(string t1, string t2, PetriNet petriNet) { Transition transition1 = petriNet.FindTransition(t1); Transition transition2 = petriNet.FindTransition(t2); HashSet<Place> placesInBetween = new HashSet<Place>(); foreach (Place outgoingPlace in transition1.OutgoingPlaces) if (transition2.IncomingPlaces.Contains(outgoingPlace)) placesInBetween.Add(outgoingPlace); return placesInBetween.ToList(); }
/// <summary> /// Adds a place and the transitions it leads to. /// </summary> /// <param name="startingTransition">>Contains the starting transition</param> /// <param name="followers">node.followers</param> /// <param name="petriNet">Contains the current petri net</param> /// <returns>The two transitions that are in an XOR-relation.</returns> /// <author>Jannik Arndt</author> public List<Transition> StartXOR(Transition startingTransition, List<EventNode> followers, PetriNet petriNet) { if (followers.Count > 1) for (var index = 0; index < followers.Count; index++) _openParallelismCount.Push(Parallelism.Xor); var newPlace = petriNet.AddPlace(); var listOfFollowingTransitions = new List<Transition>(); foreach (var eventNode in followers) { if (eventNode == null) break; /* _____________________ __________ ____________________________ * | startingTransition | ---> ( NewPlace ) ---> | NewFollowingTransition | * ''''''''''''''''''''' ********** '''''''''''''''''''''''''''' */ var newFollowingTransition = petriNet.FindTransition(eventNode.InnerEvent.Name); // The following transition already exists => close something if (newFollowingTransition != null) { if (_openParallelismCount.Count > 0) switch (_openParallelismCount.Peek()) { // Close XOR case Parallelism.Xor: newFollowingTransition.IncomingPlaces.Remove(newPlace); startingTransition.AddOutgoingPlace(newFollowingTransition.IncomingPlaces.First()); _openParallelismCount.Pop(); break; // Close AND case Parallelism.And: newFollowingTransition.AddIncomingPlace(newPlace); startingTransition.AddOutgoingPlace(newPlace); _openParallelismCount.Pop(); break; } } // Open XOR else { newFollowingTransition = petriNet.AddTransition(eventNode.InnerEvent.Name, incomingPlace: newPlace); if (newPlace.IncomingTransitions.Count == 0) startingTransition.AddOutgoingPlace(newPlace); } listOfFollowingTransitions.Add(newFollowingTransition); } if (newPlace.IncomingTransitions.Count == 0 && newPlace.OutgoingTransitions.Count == 0) petriNet.Places.Remove(newPlace); return listOfFollowingTransitions; }
/// <summary> /// Checks the parallelism of two transitions in a petrinet recursively /// In some petrinets with a high complexity /// </summary> /// <param name="transition1">Eventname of y-direction</param> /// <param name="transition2">Eventname of x-direction</param> /// <param name="petriNet">Petrinet</param> /// <returns>Return true if the two transitions are parallel</returns> /// <autor>Andrej Albrecht</autor> // ReSharper disable once UnusedMember.Local private static bool CheckTransitionIsParallel(string transition1, string transition2, PetriNet petriNet) { Transition transitionY = petriNet.FindTransition(transition1); Transition transitionX = petriNet.FindTransition(transition2); return CheckTransitionIsParallel(transitionY, transitionX, petriNet); }