/// <summary> /// Compute optimal alignment based on a trace and a Petri net /// </summary> /// <param name="trace">Workflow trace</param> /// <param name="pNet">Petri net</param> /// <param name="traceMoveCost">Trace move cost</param> /// <param name="modelMoveCost">Model move cost</param> /// <returns>Alignment on trace</returns> public static List <STransition> OptimalAlignmentOnNets(PetriNet pNet1, PetriNet pNet2, int traceMoveCost = 1, int modelMoveCost = 1) { var syncNet = new SynchronousProductNet(pNet1, pNet2, traceMoveCost, modelMoveCost); return(FindOptimalAlignment(syncNet)); }
/// <summary> /// Compute optimal alignment based on a trace and a Petri net /// </summary> /// <param name="trace">Workflow trace</param> /// <param name="pNet">Petri net</param> /// <param name="traceMoveCost">Trace move cost</param> /// <param name="modelMoveCost">Model move cost</param> /// <returns>Alignment on trace</returns> public static List <STransition> OptimalAlignmentOnTrace(WorkflowTrace trace, PetriNet pNet, int traceMoveCost = 1, int modelMoveCost = 1) { var tracePNet = MakePNetFromTrace(trace); var syncNet = new SynchronousProductNet(tracePNet, pNet, traceMoveCost, modelMoveCost); return(FindOptimalAlignment(syncNet)); }
public void SyncNetHard() { // Arrange ImportedEventLog elog = CSVImport.MakeDataFrame(hardCsv); elog.SetActivity("act"); elog.SetCaseId("id"); WorkflowLog wlog = new WorkflowLog(elog); var tNet = AlignmentUtils.MakePNetFromTrace(wlog.WorkflowTraces[23]); var pNet = CNetUtils.ConvertCNetToPetriNet(HeuristicMiner.MineCNet(wlog)); // Act var syncNet = new SynchronousProductNet(tNet, pNet); // Assert Assert.AreEqual(syncNet.Places.Count, pNet.Places.Count + tNet.Places.Count); Assert.AreEqual(pNet.Transitions.Count + 2 * tNet.Transitions.Count, syncNet.Transitions.Count); Assert.IsTrue(syncNet.EndPlaces.SetEquals(new HashSet <IPlace> { tNet.EndPlace, pNet.EndPlace })); Assert.IsTrue(syncNet.StartPlaces.SetEquals(new HashSet <IPlace> { tNet.StartPlace, pNet.StartPlace })); }