Example #1
0
        /// <summary>
        /// Creates a relation matrix accordingly to given Petri Net.
        /// </summary>
        /// <param name="net">Petri Net to be analyzed.</param>
        /// <returns>RelationMatrix of given Petri Net.</returns>
        public static RelationMatrix MakeRelationMatrix(IPetriNet net)
        {
            List <string>    activities      = GetActivities(net.Transitions);
            HashSet <string> startActivities = GetStartActivities(net.Transitions, net.StartPlace);
            HashSet <string> endActivities   = GetEndActivities(net.Transitions, net.EndPlace);
            RelationMatrix   matrix          = new RelationMatrix(activities, startActivities, endActivities);

            foreach (ITransition t in net.GetStartTransitions())
            {
                FindSuccessions(ref matrix, t, net);
            }

            var analysisOverlay = new PetriNetTokenTraverseOverlay(net);

            FindParallelism(ref matrix, analysisOverlay);

            UpdatePredecessions(ref matrix);

            return(matrix);
        }
Example #2
0
 /// <summary>
 /// Finds parallelism in Petri Net overlay and updates given Relation Matrix accordingly.
 /// </summary>
 /// <param name="matrix">A relation matrix of analyzed Petri Net.</param>
 /// <param name="net">Petri Net overlay.</param>
 private static void FindParallelism(ref RelationMatrix matrix, PetriNetTokenTraverseOverlay net)
 {
     foreach (var fromTransition in net.TransitionsWithFootprints)
     {
         foreach (var toTransition in net.TransitionsWithFootprints)
         {
             if (fromTransition.Id != toTransition.Id)
             {
                 HashSet <string> fromTransitionGlobalIds = new HashSet <string>(
                     TokenManipulationUtils.GetActiveGlobalIds(fromTransition.TokenFootprint));
                 HashSet <string> toTransitionGlobalIds = new HashSet <string>(
                     TokenManipulationUtils.GetActiveGlobalIds(toTransition.TokenFootprint));
                 if (fromTransitionGlobalIds.Overlaps(toTransitionGlobalIds) && !IsFalseParallelism(fromTransition, toTransition))
                 {
                     int fromIndex = matrix.ActivityIndices[fromTransition.Activity];
                     int toIndex   = matrix.ActivityIndices[toTransition.Activity];
                     matrix.Footprint[fromIndex, toIndex] = Relation.Parallelism;
                     matrix.Footprint[toIndex, fromIndex] = Relation.Parallelism;
                 }
             }
         }
     }
 }