diff --git a/.github/workflows/ant.yml b/.github/workflows/ant.yml index 5d772b2..8605ad3 100644 --- a/.github/workflows/ant.yml +++ b/.github/workflows/ant.yml @@ -6,8 +6,6 @@ name: Java CI on: push: branches: [ "main" ] - pull_request: - branches: [ "main" ] workflow_dispatch: jobs: diff --git a/ivy.xml b/ivy.xml index bd67222..49a0e92 100644 --- a/ivy.xml +++ b/ivy.xml @@ -37,6 +37,8 @@ + + diff --git a/src/org/processmining/placebasedlpmdiscovery/model/logs/XLogWrapper.java b/src/org/processmining/placebasedlpmdiscovery/model/logs/XLogWrapper.java index 29b5d78..4071000 100644 --- a/src/org/processmining/placebasedlpmdiscovery/model/logs/XLogWrapper.java +++ b/src/org/processmining/placebasedlpmdiscovery/model/logs/XLogWrapper.java @@ -1,10 +1,16 @@ package org.processmining.placebasedlpmdiscovery.model.logs; +import org.deckfour.xes.extension.std.XConceptExtension; +import org.deckfour.xes.factory.XFactory; +import org.deckfour.xes.factory.XFactoryRegistry; +import org.deckfour.xes.model.XEvent; import org.deckfour.xes.model.XLog; +import org.deckfour.xes.model.XTrace; import org.processmining.placebasedlpmdiscovery.model.logs.activities.Activity; import org.processmining.placebasedlpmdiscovery.model.logs.activities.ActivityCache; import org.processmining.placebasedlpmdiscovery.utils.LogUtils; +import java.util.List; import java.util.Set; import java.util.stream.Collectors; @@ -16,6 +22,22 @@ public XLogWrapper(XLog log) { this.log = log; } + public static XLogWrapper fromListOfTracesAsListStrings(List> traces) { + XFactory factory = XFactoryRegistry.instance().currentDefault(); + XLog log = factory.createLog(); + + for (List trace : traces) { + XTrace xTrace = factory.createTrace(); + for (String event : trace) { + XEvent xEvent = factory.createEvent(); + XConceptExtension.instance().assignName(xEvent, event); + xTrace.add(xEvent); + } + log.add(xTrace); + } + return new XLogWrapper(log); + } + @Override public Set getActivities() { return LogUtils.getActivitiesFromLog(this.log).stream().map(l -> ActivityCache.getInstance().getActivity(l)).collect(Collectors.toSet()); diff --git a/src/org/processmining/placebasedlpmdiscovery/prom/PlacesProvider.java b/src/org/processmining/placebasedlpmdiscovery/prom/PlacesProvider.java index 25503b5..0b844b9 100644 --- a/src/org/processmining/placebasedlpmdiscovery/prom/PlacesProvider.java +++ b/src/org/processmining/placebasedlpmdiscovery/prom/PlacesProvider.java @@ -26,5 +26,13 @@ static PlacesProvider specpp() { return new DiscoveryPlacesProvider(parameters.getAlgorithm(factory)); } + static PlacesProvider fromFile(String fileName) { + return new FromFilePlacesProvider(fileName); + } + + static PlacesProvider fromSet(Set places) { + return log -> places; + } + Set from(XLog log); } diff --git a/tests-integration/TestPlaceBasedLPMDiscoveryGivenLogAbcWithPlacesAbAc.java b/tests-integration/TestPlaceBasedLPMDiscoveryGivenLogAbcWithPlacesAbAc.java new file mode 100644 index 0000000..bd2f9e1 --- /dev/null +++ b/tests-integration/TestPlaceBasedLPMDiscoveryGivenLogAbcWithPlacesAbAc.java @@ -0,0 +1,63 @@ +import org.assertj.core.api.Assertions; +import org.deckfour.xes.model.XLog; +import org.junit.Assert; +import org.junit.BeforeClass; +import org.junit.Test; +import org.processmining.placebasedlpmdiscovery.lpmdiscovery.LPMDiscovery; +import org.processmining.placebasedlpmdiscovery.lpmdiscovery.PlaceBasedLPMDiscovery; +import org.processmining.placebasedlpmdiscovery.model.LocalProcessModel; +import org.processmining.placebasedlpmdiscovery.model.Place; +import org.processmining.placebasedlpmdiscovery.model.discovery.LPMDiscoveryResult; +import org.processmining.placebasedlpmdiscovery.model.logs.XLogWrapper; +import org.processmining.placebasedlpmdiscovery.prom.PlacesProvider; + +import java.util.Arrays; +import java.util.Collections; +import java.util.HashSet; +import java.util.Set; + +public class TestPlaceBasedLPMDiscoveryGivenLogAbcWithPlacesAbAc { + + private static PlacesProvider placesProvider; + private static XLog eventLog; + + @BeforeClass + public static void setup() { + Set places = new HashSet<>(); + places.add(Place.from("a | b")); + places.add(Place.from("a | c")); + placesProvider = PlacesProvider.fromSet(places); + + XLogWrapper logWrapper = XLogWrapper.fromListOfTracesAsListStrings(Collections.singletonList( + Arrays.asList("a", "b", "c") + )); + eventLog = logWrapper.getOriginalLog(); + } + + @Test + public void givenDefault_whenFrom_thenLPMsAbAc() { + // given + LPMDiscovery lpmDiscovery = new PlaceBasedLPMDiscovery(placesProvider); + + // when + LPMDiscoveryResult result = lpmDiscovery.from(eventLog); + + // then + Assert.assertEquals(1, result.getAllLPMs().size()); + Assertions.assertThat(result.getAllLPMs()) + .extracting(LocalProcessModel::getShortString) + .containsExactlyInAnyOrder("(a | b)(a | c)"); // LPMs need to contain at least two places + } + + @Test + public void givenDefaultWithPlaceLimit_whenFrom_thenLPMsEmpty() { + // given + LPMDiscovery lpmDiscovery = new PlaceBasedLPMDiscovery(placesProvider, 1); + + // when + LPMDiscoveryResult result = lpmDiscovery.from(eventLog); + + // then + Assert.assertTrue(result.getAllLPMs().isEmpty()); // LPMs need to contain at least two places + } +} diff --git a/tests/src/org/processmining/placebasedlpmdiscovery/replayer/ReplayerForReplayableLocalProcessModelTest.java b/tests/src/org/processmining/placebasedlpmdiscovery/replayer/ReplayerForReplayableLocalProcessModelTest.java index 6e1d686..88954f9 100644 --- a/tests/src/org/processmining/placebasedlpmdiscovery/replayer/ReplayerForReplayableLocalProcessModelTest.java +++ b/tests/src/org/processmining/placebasedlpmdiscovery/replayer/ReplayerForReplayableLocalProcessModelTest.java @@ -116,7 +116,7 @@ public void givenPredefinedLPMs2_whenFindAllPaths_thenSameWithPredefinedLanguage // act Map>> actualPaths = new HashMap<>(); for (String lpmKey : modelsWithPaths.keySet()) { - actualPaths.put(lpmKey, Replayer.findAllPaths(10, LocalProcessModel.from(lpmKey))); + actualPaths.put(lpmKey, ReplayableLocalProcessModelReplayer.findAllPaths(10, LocalProcessModel.from(lpmKey))); } // test