static void PrintRelationshipMatrix(RelationshipMatrix matrix, List <string> listActivities) { var sFollow = ""; var sNotFollow = ""; var sReciprocalFollow = ""; var sCause = ""; var sNone = ""; foreach (var actX in listActivities) { foreach (var actY in listActivities) { var relType = matrix[Tuple.Create(actX, actY)]; var relText = $"({actX},{actY})"; if (relType == RelationshipType.Follow) { sFollow += (sFollow.Length > 0 ? ", " : "") + relText; } else if (relType == RelationshipType.Cause) { sCause += (sCause.Length > 0 ? ", " : "") + relText; } else if (relType == RelationshipType.NotFollow) { sNotFollow += (sNotFollow.Length > 0 ? ", " : "") + relText; } else if (relType == RelationshipType.ReciprocalFollow) { sReciprocalFollow += (sReciprocalFollow.Length > 0 ? ", " : "") + relText; } else { sNone += (sNone.Length > 0 ? ", " : "") + relText; } } } //Console.WriteLine("Follow [> L1] = {" + sFollow + "}"); Console.WriteLine("Cause [-> L1] = {" + sCause + "}"); Console.WriteLine("NotFollow [# L1] = {" + sNotFollow + "}"); Console.WriteLine("ReciprocalFollow [|| L1] = {" + sReciprocalFollow + "}"); //Console.WriteLine("None = {" + sNone + "}"); }
private PetriNetPlace AddPlaceBetweenTransitions(PetriNetDefinition definition, RelationshipMatrix matrix, PetriNetTransition from, PetriNetTransition to) { PetriNetPlace result = null; foreach (var flowFrom in to.From) { var placeFrom = flowFrom.From; var flowOrigin = placeFrom.From[0]; var transOrigin = flowOrigin.From; var relTypeFrom = matrix[Tuple.Create(from.Name, transOrigin.Name)]; if (relTypeFrom == RelationshipType.NotFollow) //(c) XOR-Join pattern: a -> c, b -> c, and a#b { result = placeFrom as PetriNetPlace; definition.AddFlow(null, from, result); return(null); } } var relType = matrix[Tuple.Create(from.Name, to.Name)]; if (relType == RelationshipType.Cause) //(a) Sequence pattern: a -> b { result = definition.AddPlace(null, PetriNetPlaceType.Middle); definition.AddFlow(null, from, result); definition.AddFlow(null, result, to); } return(result); }