/// <summary> /// Token replay technique /// </summary> /// <param name="minedNet">Mined model</param> /// <param name="trace_frequencies">Dictionary holding the frequencies from the trance</param> /// <returns>Fitness E [0;1]</returns> public static double TokenReplayFitness(PetriNet minedNet, Dictionary <List <string>, int> trace_frequencies) { var result = new TokenReplayInfo(); foreach (KeyValuePair <List <string>, int> trace in trace_frequencies) { minedNet.InitializeTokens(); minedNet.AddMarking(1); var sequenceTokenInfo = new TokenReplayInfo(produced: 1); foreach (var step in trace.Key) { var transitionId = minedNet.TransitionNameToId(step); var isEnabled = minedNet.IsEnabled(transitionId); if (!isEnabled) { // produce the correct amount of missing tokens var placesBefore = minedNet.GetIdsOfParentPlaces(transitionId); foreach (var placeId in placesBefore) { if (0 == minedNet.GetTokens(placeId)) { minedNet.AddMarking(placeId); sequenceTokenInfo.missed++; } } } sequenceTokenInfo.consumed += minedNet.GetNumberOfParents(transitionId); sequenceTokenInfo.produced += minedNet.GetNumberOfChildren(transitionId); minedNet.FireTransition(transitionId); } var lastTransitionId = minedNet.TransitionNameToId(trace.Key[trace.Key.Count - 1]); if (1 != minedNet.GetNumberOfChildren(lastTransitionId)) { Console.WriteLine("Error, the last transition should have only one out place"); return(-1); } // consume the tokens from the out place sequenceTokenInfo.consumed += minedNet.GetTokens(minedNet.GetIdsOfChildPlaces(lastTransitionId)[0]); // check if there are any tokens left behind in the net foreach (var step in trace.Key) { var transitionId = minedNet.TransitionNameToId(step); sequenceTokenInfo.remained += minedNet.GetIdsOfParentPlaces(transitionId) .Select(x => minedNet.GetTokens(x)).ToList().Sum(); } sequenceTokenInfo.MultiplyBy(trace.Value); result.SumUp(sequenceTokenInfo); } return(result.ComputeFitness()); }
private static void check_enabled(PetriNet p) { List <string> transitionList = new List <string>() { "record issue", "inspection", "intervention authorization", "action not required", "work mandate", "no concession", "work completion", "issue completion" }; foreach (var t in transitionList) { Console.Write(p.IsEnabled(p.TransitionNameToId(t)).ToString() + " "); } Console.WriteLine(); }
public static PetriNet mine(Dictionary <List <string>, int> trace_frequencies) { var sets = getSets(trace_frequencies); var startSet = sets[0]; var transitionsSet = sets[1]; var endSet = sets[2]; var directSuccessions = GetDirectSuccessions(trace_frequencies); var causalities = GetCausalities(trace_frequencies, directSuccessions); // Check not_connected should return 48 var notConnected = GetNotConnected(transitionsSet, directSuccessions); var xl = MakeXLSet(transitionsSet, directSuccessions, causalities, notConnected); var yl = MakeYLSet(xl); // Fill the petri net var p = new PetriNet(); int placeId = 1; int transitionId = -1; Dictionary <Tuple <List <string>, List <string> >, int> placeDictionary = new Dictionary <Tuple <List <string>, List <string> >, int>(); p.AddPlace(placeId); placeId++; // adding all transitions foreach (var transition in transitionsSet) { p.AddTransition(transitionId, transition); transitionId--; } // adding all middle transitions foreach (var place in yl) { p.AddPlace(placeId); placeDictionary.Add(place, placeId); placeId++; } // adding the "out" place p.AddPlace(placeId); // Adding the connection between in place to all start transitions foreach (var start in startSet) { p.AddEdge(1, p.TransitionNameToId(start)); } // Adding the connection between all ending transitions to out place foreach (var end in endSet) { p.AddEdge(p.TransitionNameToId(end), placeId); } foreach (var place in yl) { placeId = placeDictionary[place]; foreach (var transition in place.Item1) { p.AddEdge(p.TransitionNameToId(transition), placeId); } foreach (var transition in place.Item2) { p.AddEdge(placeId, p.TransitionNameToId(transition)); } } // should I add the marking p.AddMarking(1); return(p); }