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