/// <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); }
/// <summary> /// Finds parallelism in Petri Net overlay and updates given Relation DirectDependencyMatrix 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; } } } } }