public void SimpleDependencyGraphWithL1LLoop() { // Arrange ImportedEventLog elog = CSVImport.MakeDataFrame(heuristicCsv); elog.SetActivity("act"); elog.SetCaseId("id"); WorkflowLog wlog = new WorkflowLog(elog); var successorMatrix = new SuccessorMatrix(wlog); // Act HeuristicMinerSettings settings = new HeuristicMinerSettings { L1LThreshold = 0.7 }; DependencyGraph dependencyGraph = new DependencyGraph(successorMatrix, settings); // Assert Assert.AreEqual(successorMatrix.Activities.Count, dependencyGraph.Activities.Count); var start = successorMatrix.ActivityIndices[successorMatrix.StartActivities.First()]; var end = successorMatrix.ActivityIndices[successorMatrix.EndActivities.First()]; Assert.AreEqual(start, dependencyGraph.StartActivity); Assert.AreEqual(end, dependencyGraph.EndActivity); Assert.IsTrue(dependencyGraph.LongDependencies.Count == 0); //NO INPUT FOR START ACT Assert.IsTrue(dependencyGraph.InputActivities[start].Count == 0); //NO OUTPUT FOR END ACT Assert.IsTrue(dependencyGraph.OutputActivities[end].Count == 0); //ARCS CORRECT IN Assert.IsTrue(dependencyGraph.InputActivities[1].SetEquals(new HashSet <int> { 2, 3, 4 })); Assert.IsTrue(dependencyGraph.InputActivities[2].SetEquals(new HashSet <int> { 0 })); Assert.IsTrue(dependencyGraph.InputActivities[3].SetEquals(new HashSet <int> { 0 })); //SELF LOOP Assert.IsTrue(dependencyGraph.InputActivities[4].SetEquals(new HashSet <int> { 0, 4 })); //ARCS CORRECT OUT Assert.IsTrue(dependencyGraph.OutputActivities[0].SetEquals(new HashSet <int> { 2, 3, 4 })); Assert.IsTrue(dependencyGraph.OutputActivities[2].SetEquals(new HashSet <int> { 1 })); Assert.IsTrue(dependencyGraph.OutputActivities[3].SetEquals(new HashSet <int> { 1 })); //SELF LOOP Assert.IsTrue(dependencyGraph.OutputActivities[4].SetEquals(new HashSet <int> { 1, 4 })); }
/// <param name="workflowLog">Workflow log</param> /// <param name="heuristicsMinerSettings">Heuristic miner settings</param> public CNet(WorkflowLog workflowLog, HeuristicMinerSettings heuristicsMinerSettings) { var successorMatrix = new SuccessorMatrix(workflowLog); var dependencyGraph = new DependencyGraph(successorMatrix, heuristicsMinerSettings); IndexToActivity = dependencyGraph.Activities; ActivityIndices = dependencyGraph.ActivityIndices; FillActivities(successorMatrix); PrepareBindings(dependencyGraph); FindBindings(dependencyGraph, workflowLog); }
public void MakeCNetHardLongDistanceSettings() { // Arrange ImportedEventLog elog = CSVImport.MakeDataFrame(hardCsv); elog.SetActivity("act"); elog.SetCaseId("id"); WorkflowLog wlog = new WorkflowLog(elog); // Act HeuristicMinerSettings settings = new HeuristicMinerSettings { UseLongDistance = true }; CNet causalNet = HeuristicMiner.MineCNet(wlog, settings); // Assert Assert.AreEqual(2, causalNet.LongDependencies.Count); Assert.AreEqual(0, causalNet.StartActivity.Id); Assert.AreEqual(6, causalNet.EndActivity.Id); //ACTIVITY OCCURRENCE Assert.AreEqual(9, causalNet.Activities.Count); Assert.AreEqual(129, causalNet.Activities[0].Frequency); Assert.AreEqual(130, causalNet.Activities[1].Frequency); Assert.AreEqual(130, causalNet.Activities[2].Frequency); Assert.AreEqual(57, causalNet.Activities[3].Frequency); Assert.AreEqual(100, causalNet.Activities[4].Frequency); Assert.AreEqual(57, causalNet.Activities[5].Frequency); Assert.AreEqual(100, causalNet.Activities[6].Frequency); Assert.AreEqual(43, causalNet.Activities[7].Frequency); Assert.AreEqual(43, causalNet.Activities[8].Frequency); //BINDINGS Assert.AreEqual(1, causalNet.InputBindings[0].Count); Assert.AreEqual(2, causalNet.InputBindings[1].Count); Assert.AreEqual(1, causalNet.InputBindings[2].Count); Assert.AreEqual(1, causalNet.InputBindings[3].Count); Assert.AreEqual(2, causalNet.InputBindings[4].Count); Assert.AreEqual(1, causalNet.InputBindings[5].Count); Assert.AreEqual(2, causalNet.InputBindings[6].Count); Assert.AreEqual(1, causalNet.InputBindings[7].Count); Assert.AreEqual(1, causalNet.InputBindings[8].Count); Assert.AreEqual(2, causalNet.OutputBindings[0].Count); Assert.AreEqual(1, causalNet.OutputBindings[1].Count); Assert.AreEqual(3, causalNet.OutputBindings[2].Count); Assert.AreEqual(1, causalNet.OutputBindings[3].Count); Assert.AreEqual(2, causalNet.OutputBindings[4].Count); Assert.AreEqual(1, causalNet.OutputBindings[5].Count); Assert.AreEqual(0, causalNet.OutputBindings[6].Count); Assert.AreEqual(1, causalNet.OutputBindings[7].Count); Assert.AreEqual(1, causalNet.OutputBindings[8].Count); }
public void MakeCNetEasyCustomSettings() { // Arrange ImportedEventLog elog = CSVImport.MakeDataFrame(heuristicCsv); elog.SetActivity("act"); elog.SetCaseId("id"); WorkflowLog wlog = new WorkflowLog(elog); var successorMatrix = new SuccessorMatrix(wlog); // Act HeuristicMinerSettings settings = new HeuristicMinerSettings { DependencyThreshold = 0.7, RelativeToBestThreshold = 0.15, L1LThreshold = 0.7 }; CNet causalNet = HeuristicMiner.MineCNet(wlog, settings); // Assert Assert.AreEqual(0, causalNet.StartActivity.Id); Assert.AreEqual(1, causalNet.EndActivity.Id); //ACTIVITY OCCURRENCE Assert.AreEqual(5, causalNet.Activities.Count); Assert.AreEqual(40, causalNet.Activities[0].Frequency); Assert.AreEqual(40, causalNet.Activities[1].Frequency); Assert.AreEqual(21, causalNet.Activities[2].Frequency); Assert.AreEqual(21, causalNet.Activities[3].Frequency); Assert.AreEqual(17, causalNet.Activities[4].Frequency); //Number of bindings Assert.AreEqual(0, causalNet.InputBindings[0].Count); //NEW ARC A->C Assert.AreEqual(5, causalNet.InputBindings[1].Count); Assert.AreEqual(1, causalNet.InputBindings[2].Count); Assert.AreEqual(1, causalNet.InputBindings[3].Count); //NEW ARC D->D Assert.AreEqual(2, causalNet.InputBindings[4].Count); //NEW ARC A->C Assert.AreEqual(5, causalNet.OutputBindings[0].Count); Assert.AreEqual(0, causalNet.OutputBindings[1].Count); Assert.AreEqual(1, causalNet.OutputBindings[2].Count); Assert.AreEqual(1, causalNet.OutputBindings[3].Count); //NEW ARC D->D Assert.AreEqual(2, causalNet.OutputBindings[4].Count); //A&B BIND FREQUENCY Assert.AreEqual(20, causalNet.OutputBindings[0].First(u => u.Activities.Count == 2).Frequency); Assert.AreEqual(20, causalNet.InputBindings[1].First(b => b.Activities.Count == 2).Frequency); }
public void HardDependencyGraphNoL2LL1LWithoutAllTaskConnected() { // Arrange ImportedEventLog elog = CSVImport.MakeDataFrame(hardCsv); elog.SetActivity("act"); elog.SetCaseId("id"); WorkflowLog wlog = new WorkflowLog(elog); var successorMatrix = new SuccessorMatrix(wlog); // Act HeuristicMinerSettings settings = new HeuristicMinerSettings { L2LThreshold = 1, L1LThreshold = 1, AllTasksConnected = false }; DependencyGraph dependencyGraph = new DependencyGraph(successorMatrix, settings); // Assert Assert.AreEqual(successorMatrix.Activities.Count, dependencyGraph.Activities.Count); var start = successorMatrix.ActivityIndices[successorMatrix.StartActivities.First()]; var end = successorMatrix.ActivityIndices[successorMatrix.EndActivities.First()]; Assert.AreEqual(start, dependencyGraph.StartActivity); Assert.AreEqual(end, dependencyGraph.EndActivity); Assert.IsTrue(dependencyGraph.LongDependencies.Count == 0); //1 IN NO ARC A->A Assert.IsTrue(dependencyGraph.InputActivities[start].Count == 0); //NO OUTPUT FOR END ACT Assert.IsTrue(dependencyGraph.OutputActivities[end].Count == 0); //IN //NO BACK ARC FROM C->B and A->A Assert.IsTrue(dependencyGraph.InputActivities[1].SetEquals(new HashSet <int> { 0 })); //NO ARC FROM B->C Assert.IsTrue(dependencyGraph.InputActivities[2].SetEquals(new HashSet <int> { })); Assert.IsTrue(dependencyGraph.InputActivities[3].SetEquals(new HashSet <int> { 2 })); Assert.IsTrue(dependencyGraph.InputActivities[4].SetEquals(new HashSet <int> { 3, 7 })); Assert.IsTrue(dependencyGraph.InputActivities[5].SetEquals(new HashSet <int> { 4 })); Assert.IsTrue(dependencyGraph.InputActivities[6].SetEquals(new HashSet <int> { 5, 8 })); Assert.IsTrue(dependencyGraph.InputActivities[7].SetEquals(new HashSet <int> { 2 })); Assert.IsTrue(dependencyGraph.InputActivities[8].SetEquals(new HashSet <int> { 4 })); //OUT //NO ARC A->A Assert.IsTrue(dependencyGraph.OutputActivities[0].SetEquals(new HashSet <int> { 1 })); //NO ARC B->C Assert.IsTrue(dependencyGraph.OutputActivities[1].SetEquals(new HashSet <int> { })); //NO BACK ARC FROM C->B Assert.IsTrue(dependencyGraph.OutputActivities[2].SetEquals(new HashSet <int> { 7, 3 })); Assert.IsTrue(dependencyGraph.OutputActivities[3].SetEquals(new HashSet <int> { 4 })); Assert.IsTrue(dependencyGraph.OutputActivities[4].SetEquals(new HashSet <int> { 5, 8 })); Assert.IsTrue(dependencyGraph.OutputActivities[5].SetEquals(new HashSet <int> { 6 })); Assert.IsTrue(dependencyGraph.OutputActivities[7].SetEquals(new HashSet <int> { 4 })); Assert.IsTrue(dependencyGraph.OutputActivities[8].SetEquals(new HashSet <int> { 6 })); }
public void HardDependencyGraphNoL1L() { // Arrange ImportedEventLog elog = CSVImport.MakeDataFrame(hardCsv); elog.SetActivity("act"); elog.SetCaseId("id"); WorkflowLog wlog = new WorkflowLog(elog); var successorMatrix = new SuccessorMatrix(wlog); // Act HeuristicMinerSettings settings = new HeuristicMinerSettings { L1LThreshold = 1 }; DependencyGraph dependencyGraph = new DependencyGraph(successorMatrix, settings); // Assert Assert.AreEqual(successorMatrix.Activities.Count, dependencyGraph.Activities.Count); var start = successorMatrix.ActivityIndices[successorMatrix.StartActivities.First()]; var end = successorMatrix.ActivityIndices[successorMatrix.EndActivities.First()]; Assert.AreEqual(start, dependencyGraph.StartActivity); Assert.AreEqual(end, dependencyGraph.EndActivity); //1 NO SELF LOOP => 0 Assert.AreEqual(0, dependencyGraph.InputActivities[start].Count); //NO OUTPUT FOR END ACT Assert.AreEqual(0, dependencyGraph.OutputActivities[end].Count); //IN Assert.IsTrue(dependencyGraph.InputActivities[1].SetEquals(new HashSet <int> { 0, 2 })); Assert.IsTrue(dependencyGraph.InputActivities[2].SetEquals(new HashSet <int> { 1 })); Assert.IsTrue(dependencyGraph.InputActivities[3].SetEquals(new HashSet <int> { 2 })); Assert.IsTrue(dependencyGraph.InputActivities[4].SetEquals(new HashSet <int> { 3, 7 })); Assert.IsTrue(dependencyGraph.InputActivities[5].SetEquals(new HashSet <int> { 4 })); Assert.IsTrue(dependencyGraph.InputActivities[6].SetEquals(new HashSet <int> { 5, 8 })); Assert.IsTrue(dependencyGraph.InputActivities[7].SetEquals(new HashSet <int> { 2 })); Assert.IsTrue(dependencyGraph.InputActivities[8].SetEquals(new HashSet <int> { 4 })); //OUT Assert.IsTrue(dependencyGraph.OutputActivities[0].SetEquals(new HashSet <int> { 1 })); Assert.IsTrue(dependencyGraph.OutputActivities[1].SetEquals(new HashSet <int> { 2 })); Assert.IsTrue(dependencyGraph.OutputActivities[2].SetEquals(new HashSet <int> { 1, 7, 3 })); Assert.IsTrue(dependencyGraph.OutputActivities[3].SetEquals(new HashSet <int> { 4 })); Assert.IsTrue(dependencyGraph.OutputActivities[4].SetEquals(new HashSet <int> { 5, 8 })); Assert.IsTrue(dependencyGraph.OutputActivities[5].SetEquals(new HashSet <int> { 6 })); Assert.IsTrue(dependencyGraph.OutputActivities[7].SetEquals(new HashSet <int> { 4 })); Assert.IsTrue(dependencyGraph.OutputActivities[8].SetEquals(new HashSet <int> { 6 })); }