コード例 #1
0
        public void FindFirstCommonSuccessorTest()
        {
            var eventLog = EventLogExample.ComplexEventLogVanDerAalst();
            var field    = new Field {
                EventLog = eventLog
            };
            var miner = new HeuristicMiner(field);

            var event1 = eventLog.Cases[0].EventList[0];
            var event2 = eventLog.Cases[0].EventList[1];
            var event3 = eventLog.Cases[0].EventList[2];

            var eventNode1 = new EventNode(event1, 0.8, new List <EventNode> {
                new EventNode(event2, 0.8, new List <EventNode> {
                    new EventNode(event3, 0.8)
                })
            });
            var eventNode2 = new EventNode(event1, 0.8, new List <EventNode> {
                new EventNode(event2, 0.8, new List <EventNode> {
                    new EventNode(event3, 0.8)
                })
            });

            var actual = miner.FindFirstCommonSuccessor(new List <EventNode> {
                eventNode1, eventNode2
            });

            Assert.AreEqual("C", actual);
        }
コード例 #2
0
        public void CreateDependencyGraphTest()
        {
            var field = new Field {
                EventLog = EventLogExample.ThreeCaseEventLog()
            };
            var miner     = new HeuristicMiner(field);
            var event1    = new Event("A");
            var event2    = new Event("B");
            var event3    = new Event("C");
            var eventList = new List <Event> {
                event1, event2, event3
            };
            var matrix = new[, ] {
                { 0.0, 0.8, 0.0 }, { 0.0, 0.0, 0.8 }, { 0.0, 0.0, 0.0 }
            };

            var actual = miner.CreateDependencyGraph(eventList, matrix, 0.5, 0.0, 0, 10);

            var expected = new EventNode(event1, 0.8, new List <EventNode> {
                new EventNode(event2, 0.8, new List <EventNode> {
                    new EventNode(event3, 0.8)
                })
            });

            Assert.AreEqual(expected.InnerEvent, actual.InnerEvent);
            Assert.AreEqual(expected.ListOfFollowers[0].InnerEvent, actual.ListOfFollowers[0].InnerEvent);
            Assert.AreEqual(expected.ListOfFollowers[0].ListOfFollowers[0].InnerEvent, actual.ListOfFollowers[0].ListOfFollowers[0].InnerEvent);
        }
コード例 #3
0
        public void GetAdjacencyTest()
        {
            var field = new Field {
                EventLog = EventLogExample.ThreeCaseEventLog()
            };
            var miner  = new HeuristicMiner(field);
            var event1 = new Event("A");
            var event2 = new Event("B");

            var actual = miner.GetAdjacency(event1, event2, field.EventLog);

            Assert.AreEqual(0.5, actual);
        }
コード例 #4
0
 public void MineTestFail1()
 {
     try
     {
         var miner = new HeuristicMiner(null);
         miner.Mine();
         Assert.Fail();
     }
     catch (Exception exception)
     {
         Assert.IsInstanceOfType(exception, typeof(Exception));
     }
 }
コード例 #5
0
        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);
        }
コード例 #6
0
        public void CalculateStandardDeviationTest()
        {
            var field = new Field {
                EventLog = EventLogExample.ThreeCaseEventLog()
            };
            var miner  = new HeuristicMiner(field);
            var values = new List <double> {
                0.2, 0.4, 0.6, 0.8
            };

            var actual = miner.CalculateStandardDeviation(values);

            Assert.AreEqual(0.258, actual);
        }
コード例 #7
0
        public void IsAndRelationTest()
        {
            var eventLog = EventLogExample.ComplexEventLogVanDerAalst();
            var field    = new Field {
                EventLog = eventLog
            };
            var miner  = new HeuristicMiner(field);
            var event1 = eventLog.Cases[0].EventList[0];
            var event2 = eventLog.Cases[0].EventList[1];
            var event3 = eventLog.Cases[0].EventList[2];

            var actual = miner.IsAndRelation(event1, event2, event3, eventLog);

            Assert.IsTrue(actual);
        }
コード例 #8
0
 public void MineTestFail3()
 {
     try
     {
         MinerSettings.AddOrUpdateKey("MaximumRecursionDepthSlider", 10);
         var field = new Field();
         var miner = new HeuristicMiner(field);
         miner.Mine();
         Assert.Fail();
     }
     catch (Exception exception)
     {
         Assert.IsInstanceOfType(exception, typeof(Exception));
     }
 }
コード例 #9
0
        public void MineTest2()
        {
            MinerSettings.AddOrUpdateKey("AdjacencyThresholdSlider", 51);
            MinerSettings.AddOrUpdateKey("MaximumRecursionDepthSlider", 10);
            var field = new Field {
                EventLog = EventLogExample.ComplexEventLogVanDerAalst()
            };
            var      miner  = new HeuristicMiner(field);
            PetriNet actual = (PetriNet)miner.Mine();

            Assert.AreEqual(33, actual.Transitions.Count);
            Assert.AreEqual("D", actual.Transitions[2].Name);
            Assert.AreEqual(44, actual.Places.Count);
            //   Assert.AreEqual("End", actual.Places[].Name);
        }
コード例 #10
0
 public void MineTestFail2()
 {
     try
     {
         MinerSettings.AddOrUpdateKey("AdjacencyThresholdSlider", 51);
         var field = new Field();
         var miner = new HeuristicMiner(field);
         miner.Mine();
         Assert.Fail();
     }
     catch (Exception exception)
     {
         Assert.IsInstanceOfType(exception, typeof(Exception));
     }
 }
コード例 #11
0
        public void MineTest1()
        {
            MinerSettings.AddOrUpdateKey("AdjacencyThresholdSlider", 51);
            MinerSettings.AddOrUpdateKey("MaximumRecursionDepthSlider", 10);
            var field = new Field {
                EventLog = EventLogExample.ThreeCaseEventLog()
            };
            var      miner  = new HeuristicMiner(field);
            PetriNet actual = (PetriNet)miner.Mine();

            Assert.AreEqual(1, actual.Transitions.Count);
            Assert.AreEqual("A", actual.Transitions[0].Name);
            Assert.AreEqual(2, actual.Places.Count);
            Assert.AreEqual("End", actual.Places[1].Name);
        }
コード例 #12
0
        public void ComputeWorstAlignmentOnHardModel()
        {
            // Arrange
            ImportedEventLog elog = CSVImport.MakeDataFrame(hardCsv);

            elog.SetActivity("act");
            elog.SetCaseId("id");
            WorkflowLog wlog     = new WorkflowLog(elog);
            PetriNet    petriNet = CNetUtils.ConvertCNetToPetriNet(HeuristicMiner.MineCNet(wlog));

            // Act
            var cost = AlignmentUtils.ComputeWorstCostOfModel(petriNet, 1);

            // Assert
            Assert.AreEqual(7, cost);
        }
コード例 #13
0
        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);
        }
コード例 #14
0
        public void AlignmentOnLogEasy()
        {
            // Arrange
            ImportedEventLog elog = CSVImport.MakeDataFrame(heuristicCsv);

            elog.SetActivity("act");
            elog.SetCaseId("id");
            WorkflowLog wlog = new WorkflowLog(elog);
            var         pNet = CNetUtils.ConvertCNetToPetriNet(HeuristicMiner.MineCNet(wlog));

            // Act
            AlignmentOnLog alignment = new AlignmentOnLog(wlog, pNet);

            // Assert
            Assert.IsTrue(alignment.Fitness >= 0.96);
            Assert.AreEqual(wlog.GetTracesWithOccurrence().Count, alignment.AlignmentsOnLog.Count);
        }
コード例 #15
0
        public void AlignmentOnTraceHard()
        {
            // Arrange
            ImportedEventLog elog = CSVImport.MakeDataFrame(hardCsv);

            elog.SetActivity("act");
            elog.SetCaseId("id");
            WorkflowLog wlog = new WorkflowLog(elog);
            PetriNet    pNet = CNetUtils.ConvertCNetToPetriNet(HeuristicMiner.MineCNet(wlog));

            // Act (EACH TRACE FITS TO THE MODEL)
            foreach (var trace in wlog.WorkflowTraces)
            {
                var alignment = new AlignmentOnTrace(trace, pNet);
                //Assert
                Assert.AreEqual(1, alignment.Fitness);
                Assert.AreEqual(0, alignment.OptimalCost);
            }
        }
コード例 #16
0
        public void CreateAdjacencyMatrixTest()
        {
            var field = new Field {
                EventLog = EventLogExample.ThreeCaseEventLog()
            };
            var miner  = new HeuristicMiner(field);
            var actual = miner.CreateAdjacencyMatrix(field);

            var expected = new[, ] {
                { 0.0, 0.5, 0.5, 0.0, 0.5 }, { -0.5, 0.0, 0.0, 0.5, 0.0 }, { -0.5, 0.0, 0.0, 0.5, 0.0 }, { 0.0, -0.5, -0.5, 0.0, -0.5 }, { -0.5, 0.0, 0.0, 0.5, 0.0 }
            };

            for (var i = 0; i < 5; i++)
            {
                for (var j = 0; j < 5; j++)
                {
                    Assert.AreEqual(expected[i, j], actual[i, j]);
                }
            }
        }
コード例 #17
0
        public void ConvertHardCNetToPetriNetTest()
        {
            // Arrange
            ImportedEventLog elog = CSVImport.MakeDataFrame(hardCsv);

            elog.SetActivity("act");
            elog.SetCaseId("id");
            WorkflowLog wlog      = new WorkflowLog(elog);
            CNet        causalNet = HeuristicMiner.MineCNet(wlog);

            // Act
            PetriNet petriNet = HeuristicMiner.MinePetriNet(wlog);

            // Assert
            Assert.AreEqual("p0", petriNet.StartPlace.Id);
            Assert.AreEqual("p" + (2 * causalNet.EndActivity.Id + 1), petriNet.EndPlace.Id);
            Assert.AreEqual(18, petriNet.Places.Count);
            Assert.AreEqual(21, petriNet.Transitions.Count);
            // 12 invisible transitions
            Assert.AreEqual(12, petriNet.Transitions.Count(t => t.Invisible));
        }
コード例 #18
0
        public void AlignmentOnLogHardCustomSettings()
        {
            // Arrange
            ImportedEventLog elog = CSVImport.MakeDataFrame(hardCsv);

            elog.SetActivity("act");
            elog.SetCaseId("id");
            WorkflowLog wlog = new WorkflowLog(elog);
            var         pNet = CNetUtils.ConvertCNetToPetriNet(HeuristicMiner.MineCNet(wlog, new HeuristicMinerSettings()
            {
                L2LThreshold = 1
            }));

            // Act
            AlignmentOnLog alignment = new AlignmentOnLog(wlog, pNet);

            // Assert
            // Now all traces doesn't fit, because L2L loop (B->C->B) is removed
            Assert.IsTrue(alignment.Fitness < 1);
            Assert.AreEqual(wlog.GetTracesWithOccurrence().Count, alignment.AlignmentsOnLog.Count);
        }
コード例 #19
0
        public void AlignmentOnTraceHardNoL2LLoop()
        {
            // Arrange
            ImportedEventLog elog = CSVImport.MakeDataFrame(hardCsv);

            elog.SetActivity("act");
            elog.SetCaseId("id");
            WorkflowLog wlog = new WorkflowLog(elog);
            PetriNet    pNet = CNetUtils.ConvertCNetToPetriNet(HeuristicMiner.MineCNet(wlog, new HeuristicMinerSettings()
            {
                L2LThreshold = 1
            }));

            // Act unfitting trace abcbcdfgi (deleted L2L loop B->C->B)
            var alignment = new AlignmentOnTrace(wlog.WorkflowTraces[61], pNet);

            // Assert
            Assert.AreEqual(0.875, alignment.Fitness);
            // two moves (model and trace) for B and one for C
            Assert.AreEqual(2, alignment.OptimalCost);
        }
コード例 #20
0
        public void MakeCNetEasyDefaultSettings()
        {
            // Arrange
            ImportedEventLog elog = CSVImport.MakeDataFrame(heuristicCsv);

            elog.SetActivity("act");
            elog.SetCaseId("id");
            WorkflowLog wlog            = new WorkflowLog(elog);
            var         successorMatrix = new SuccessorMatrix(wlog);

            // Act
            CNet causalNet = HeuristicMiner.MineCNet(wlog);

            // 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);
            Assert.AreEqual(4, causalNet.InputBindings[1].Count);
            Assert.AreEqual(1, causalNet.InputBindings[2].Count);
            Assert.AreEqual(1, causalNet.InputBindings[3].Count);
            Assert.AreEqual(1, causalNet.InputBindings[4].Count);
            Assert.AreEqual(4, 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);
            Assert.AreEqual(1, 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);
        }
コード例 #21
0
        public void AlignmentOnTraceEasy()
        {
            // Arrange
            ImportedEventLog elog = CSVImport.MakeDataFrame(heuristicCsv);

            elog.SetActivity("act");
            elog.SetCaseId("id");
            WorkflowLog wlog = new WorkflowLog(elog);
            PetriNet    pNet = CNetUtils.ConvertCNetToPetriNet(HeuristicMiner.MineCNet(wlog));

            // Act
            // trace "AE" -> Doesn't fit
            var traceAlignment1 = new AlignmentOnTrace(wlog.WorkflowTraces[0], pNet);
            // trace "ACBE" fits perfectly
            var traceAlignment2 = new AlignmentOnTrace(wlog.WorkflowTraces[10], pNet);

            // Assert
            Assert.AreEqual(0.8, traceAlignment1.Fitness);
            Assert.AreEqual(1, traceAlignment1.OptimalCost);
            Assert.AreEqual(1, traceAlignment2.Fitness);
            Assert.AreEqual(0, traceAlignment2.OptimalCost);
        }
コード例 #22
0
        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
            }));
        }