aboutsummaryrefslogtreecommitdiffstats
path: root/subprojects/store-dse/src/main
diff options
context:
space:
mode:
authorLibravatar Kristóf Marussy <kristof@marussy.com>2023-09-07 20:44:48 +0200
committerLibravatar Kristóf Marussy <kristof@marussy.com>2023-09-07 20:44:48 +0200
commitdf8ebe6dae2203513240a3b001fabc2b8b34d505 (patch)
tree5f642cda936c190f2f5525992f17a05be2491920 /subprojects/store-dse/src/main
parentfeat: declarative DSE rules and model refinement (diff)
parentAdd missing copyright headers (diff)
downloadrefinery-df8ebe6dae2203513240a3b001fabc2b8b34d505.tar.gz
refinery-df8ebe6dae2203513240a3b001fabc2b8b34d505.tar.zst
refinery-df8ebe6dae2203513240a3b001fabc2b8b34d505.zip
Merge remote-tracking branch 'nagilooh/datastructure' into partial-interpretation
Diffstat (limited to 'subprojects/store-dse/src/main')
-rw-r--r--subprojects/store-dse/src/main/java/tools/refinery/store/dse/modification/internal/ModificationStoreAdapterImpl.java2
-rw-r--r--subprojects/store-dse/src/main/java/tools/refinery/store/dse/strategy/BestFirstExplorer.java18
-rw-r--r--subprojects/store-dse/src/main/java/tools/refinery/store/dse/strategy/BestFirstStoreManager.java24
-rw-r--r--subprojects/store-dse/src/main/java/tools/refinery/store/dse/strategy/BestFirstWorker.java61
-rw-r--r--subprojects/store-dse/src/main/java/tools/refinery/store/dse/transition/statespace/EquivalenceClassStore.java1
-rw-r--r--subprojects/store-dse/src/main/java/tools/refinery/store/dse/transition/statespace/internal/AbstractEquivalenceClassStore.java7
-rw-r--r--subprojects/store-dse/src/main/java/tools/refinery/store/dse/transition/statespace/internal/ActivationStoreImpl.java15
-rw-r--r--subprojects/store-dse/src/main/java/tools/refinery/store/dse/transition/statespace/internal/ActivationStoreWorker.java1
-rw-r--r--subprojects/store-dse/src/main/java/tools/refinery/store/dse/transition/statespace/internal/FastEquivalenceClassStore.java9
-rw-r--r--subprojects/store-dse/src/main/java/tools/refinery/store/dse/transition/statespace/internal/ObjectivePriorityQueueImpl.java18
-rw-r--r--subprojects/store-dse/src/main/java/tools/refinery/store/dse/transition/statespace/internal/SolutionStoreImpl.java11
11 files changed, 113 insertions, 54 deletions
diff --git a/subprojects/store-dse/src/main/java/tools/refinery/store/dse/modification/internal/ModificationStoreAdapterImpl.java b/subprojects/store-dse/src/main/java/tools/refinery/store/dse/modification/internal/ModificationStoreAdapterImpl.java
index 913cb33f..62e4227b 100644
--- a/subprojects/store-dse/src/main/java/tools/refinery/store/dse/modification/internal/ModificationStoreAdapterImpl.java
+++ b/subprojects/store-dse/src/main/java/tools/refinery/store/dse/modification/internal/ModificationStoreAdapterImpl.java
@@ -24,6 +24,6 @@ public class ModificationStoreAdapterImpl implements ModificationStoreAdapter {
24 24
25 @Override 25 @Override
26 public ModelAdapter createModelAdapter(Model model) { 26 public ModelAdapter createModelAdapter(Model model) {
27 return null; 27 return new ModificationAdapterImpl(this, model);
28 } 28 }
29} 29}
diff --git a/subprojects/store-dse/src/main/java/tools/refinery/store/dse/strategy/BestFirstExplorer.java b/subprojects/store-dse/src/main/java/tools/refinery/store/dse/strategy/BestFirstExplorer.java
index 72bbbc55..a2b6268f 100644
--- a/subprojects/store-dse/src/main/java/tools/refinery/store/dse/strategy/BestFirstExplorer.java
+++ b/subprojects/store-dse/src/main/java/tools/refinery/store/dse/strategy/BestFirstExplorer.java
@@ -5,7 +5,6 @@
5 */ 5 */
6package tools.refinery.store.dse.strategy; 6package tools.refinery.store.dse.strategy;
7 7
8import tools.refinery.store.dse.transition.ObjectiveValue;
9import tools.refinery.store.dse.transition.VersionWithObjectiveValue; 8import tools.refinery.store.dse.transition.VersionWithObjectiveValue;
10import tools.refinery.store.model.Model; 9import tools.refinery.store.model.Model;
11 10
@@ -32,13 +31,11 @@ public class BestFirstExplorer extends BestFirstWorker {
32 public void explore() { 31 public void explore() {
33 VersionWithObjectiveValue lastVisited = submit().newVersion(); 32 VersionWithObjectiveValue lastVisited = submit().newVersion();
34 33
35 mainLoop: while (shouldRun()) { 34 while (shouldRun()) {
36 35
37 if (lastVisited == null) { 36 if (lastVisited == null) {
38 var restored = this.restoreToBest(); 37 lastVisited = this.restoreToBest();
39 if(restored != null) { 38 if(lastVisited == null) {
40 lastVisited = restored;
41 } else {
42 return; 39 return;
43 } 40 }
44 } 41 }
@@ -47,7 +44,7 @@ public class BestFirstExplorer extends BestFirstWorker {
47 while(tryActivation && shouldRun()) { 44 while(tryActivation && shouldRun()) {
48 RandomVisitResult randomVisitResult = this.visitRandomUnvisited(random); 45 RandomVisitResult randomVisitResult = this.visitRandomUnvisited(random);
49 46
50 tryActivation &= randomVisitResult.shouldRetry(); 47 tryActivation = randomVisitResult.shouldRetry();
51 var newSubmit = randomVisitResult.submitResult(); 48 var newSubmit = randomVisitResult.submitResult();
52 if(newSubmit != null) { 49 if(newSubmit != null) {
53 if(!newSubmit.include()) { 50 if(!newSubmit.include()) {
@@ -57,10 +54,14 @@ public class BestFirstExplorer extends BestFirstWorker {
57 int compareResult = compare(lastVisited,newVisit); 54 int compareResult = compare(lastVisited,newVisit);
58 if(compareResult >= 0) { 55 if(compareResult >= 0) {
59 lastVisited = newVisit; 56 lastVisited = newVisit;
60 continue mainLoop; 57 break;
61 } 58 }
62 } 59 }
63 } 60 }
61 else {
62 lastVisited = null;
63 break;
64 }
64 } 65 }
65 66
66 //final ObjectiveComparatorHelper objectiveComparatorHelper = dseAdapter.getObjectiveComparatorHelper(); 67 //final ObjectiveComparatorHelper objectiveComparatorHelper = dseAdapter.getObjectiveComparatorHelper();
@@ -160,5 +161,6 @@ public class BestFirstExplorer extends BestFirstWorker {
160*/ 161*/
161 } 162 }
162 // Interrupted. 163 // Interrupted.
164
163 } 165 }
164} 166}
diff --git a/subprojects/store-dse/src/main/java/tools/refinery/store/dse/strategy/BestFirstStoreManager.java b/subprojects/store-dse/src/main/java/tools/refinery/store/dse/strategy/BestFirstStoreManager.java
index 693b0903..4ccba6f7 100644
--- a/subprojects/store-dse/src/main/java/tools/refinery/store/dse/strategy/BestFirstStoreManager.java
+++ b/subprojects/store-dse/src/main/java/tools/refinery/store/dse/strategy/BestFirstStoreManager.java
@@ -17,16 +17,22 @@ import tools.refinery.store.dse.transition.statespace.internal.ObjectivePriority
17import tools.refinery.store.dse.transition.statespace.internal.SolutionStoreImpl; 17import tools.refinery.store.dse.transition.statespace.internal.SolutionStoreImpl;
18import tools.refinery.store.map.Version; 18import tools.refinery.store.map.Version;
19import tools.refinery.store.model.ModelStore; 19import tools.refinery.store.model.ModelStore;
20import tools.refinery.store.statecoding.StateCoderResult;
20import tools.refinery.store.statecoding.StateCoderStoreAdapter; 21import tools.refinery.store.statecoding.StateCoderStoreAdapter;
22import tools.refinery.visualization.ModelVisualizerStoreAdapter;
23import tools.refinery.visualization.statespace.VisualizationStore;
24import tools.refinery.visualization.statespace.internal.VisualizationStoreImpl;
21 25
22import java.util.function.Consumer; 26import java.util.function.Consumer;
23 27
24public class BestFirstStoreManager { 28public class BestFirstStoreManager {
29
25 ModelStore modelStore; 30 ModelStore modelStore;
26 ObjectivePriorityQueue objectiveStore; 31 ObjectivePriorityQueue objectiveStore;
27 ActivationStore activationStore; 32 ActivationStore activationStore;
28 SolutionStore solutionStore; 33 SolutionStore solutionStore;
29 EquivalenceClassStore equivalenceClassStore; 34 EquivalenceClassStore equivalenceClassStore;
35 VisualizationStore visualizationStore;
30 36
31 public BestFirstStoreManager(ModelStore modelStore) { 37 public BestFirstStoreManager(ModelStore modelStore) {
32 this.modelStore = modelStore; 38 this.modelStore = modelStore;
@@ -36,17 +42,17 @@ public class BestFirstStoreManager {
36 objectiveStore = new ObjectivePriorityQueueImpl(storeAdapter.getObjectives()); 42 objectiveStore = new ObjectivePriorityQueueImpl(storeAdapter.getObjectives());
37 Consumer<VersionWithObjectiveValue> whenAllActivationsVisited = x -> objectiveStore.remove(x); 43 Consumer<VersionWithObjectiveValue> whenAllActivationsVisited = x -> objectiveStore.remove(x);
38 activationStore = new ActivationStoreImpl(storeAdapter.getTransformations().size(), whenAllActivationsVisited); 44 activationStore = new ActivationStoreImpl(storeAdapter.getTransformations().size(), whenAllActivationsVisited);
39 solutionStore = new SolutionStoreImpl(1); 45 solutionStore = new SolutionStoreImpl(50);
40 equivalenceClassStore = new FastEquivalenceClassStore(modelStore.getAdapter(StateCoderStoreAdapter.class)) { 46 equivalenceClassStore = new FastEquivalenceClassStore(modelStore.getAdapter(StateCoderStoreAdapter.class)) {
41 @Override 47 @Override
42 protected void delegate(VersionWithObjectiveValue version, int[] emptyActivations, boolean accept) { 48 protected void delegate(VersionWithObjectiveValue version, int[] emptyActivations, boolean accept) {
43 objectiveStore.submit(version); 49 throw new UnsupportedOperationException("This equivalence storage is not prepared to resolve symmetries!");
44 activationStore.markNewAsVisited(version, emptyActivations);
45 if(accept) {
46 solutionStore.submit(version);
47 }
48 } 50 }
49 }; 51 };
52 visualizationStore = new VisualizationStoreImpl();
53 }
54 public ModelStore getModelStore() {
55 return modelStore;
50 } 56 }
51 57
52 ObjectivePriorityQueue getObjectiveStore() { 58 ObjectivePriorityQueue getObjectiveStore() {
@@ -57,7 +63,7 @@ public class BestFirstStoreManager {
57 return activationStore; 63 return activationStore;
58 } 64 }
59 65
60 SolutionStore getSolutionStore() { 66 public SolutionStore getSolutionStore() {
61 return solutionStore; 67 return solutionStore;
62 } 68 }
63 69
@@ -65,6 +71,10 @@ public class BestFirstStoreManager {
65 return equivalenceClassStore; 71 return equivalenceClassStore;
66 } 72 }
67 73
74 public VisualizationStore getVisualizationStore() {
75 return visualizationStore;
76 }
77
68 public void startExploration(Version initial) { 78 public void startExploration(Version initial) {
69 BestFirstExplorer bestFirstExplorer = new BestFirstExplorer(this, modelStore.createModelForState(initial), 1); 79 BestFirstExplorer bestFirstExplorer = new BestFirstExplorer(this, modelStore.createModelForState(initial), 1);
70 bestFirstExplorer.explore(); 80 bestFirstExplorer.explore();
diff --git a/subprojects/store-dse/src/main/java/tools/refinery/store/dse/strategy/BestFirstWorker.java b/subprojects/store-dse/src/main/java/tools/refinery/store/dse/strategy/BestFirstWorker.java
index ea7fe43f..f1bec14f 100644
--- a/subprojects/store-dse/src/main/java/tools/refinery/store/dse/strategy/BestFirstWorker.java
+++ b/subprojects/store-dse/src/main/java/tools/refinery/store/dse/strategy/BestFirstWorker.java
@@ -11,8 +11,9 @@ import tools.refinery.store.dse.transition.VersionWithObjectiveValue;
11import tools.refinery.store.dse.transition.statespace.internal.ActivationStoreWorker; 11import tools.refinery.store.dse.transition.statespace.internal.ActivationStoreWorker;
12import tools.refinery.store.map.Version; 12import tools.refinery.store.map.Version;
13import tools.refinery.store.model.Model; 13import tools.refinery.store.model.Model;
14import tools.refinery.store.query.ModelQueryAdapter;
14import tools.refinery.store.statecoding.StateCoderAdapter; 15import tools.refinery.store.statecoding.StateCoderAdapter;
15 16import tools.refinery.visualization.statespace.VisualizationStore;
16 17
17import java.util.Random; 18import java.util.Random;
18 19
@@ -22,6 +23,9 @@ public class BestFirstWorker {
22 final ActivationStoreWorker activationStoreWorker; 23 final ActivationStoreWorker activationStoreWorker;
23 final StateCoderAdapter stateCoderAdapter; 24 final StateCoderAdapter stateCoderAdapter;
24 final DesignSpaceExplorationAdapter explorationAdapter; 25 final DesignSpaceExplorationAdapter explorationAdapter;
26 final ModelQueryAdapter queryAdapter;
27 final VisualizationStore visualizationStore;
28 final boolean isVisualizationEnabled;
25 29
26 public BestFirstWorker(BestFirstStoreManager storeManager, Model model) { 30 public BestFirstWorker(BestFirstStoreManager storeManager, Model model) {
27 this.storeManager = storeManager; 31 this.storeManager = storeManager;
@@ -29,8 +33,11 @@ public class BestFirstWorker {
29 33
30 explorationAdapter = model.getAdapter(DesignSpaceExplorationAdapter.class); 34 explorationAdapter = model.getAdapter(DesignSpaceExplorationAdapter.class);
31 stateCoderAdapter = model.getAdapter(StateCoderAdapter.class); 35 stateCoderAdapter = model.getAdapter(StateCoderAdapter.class);
36 queryAdapter = model.getAdapter(ModelQueryAdapter.class);
32 activationStoreWorker = new ActivationStoreWorker(storeManager.getActivationStore(), 37 activationStoreWorker = new ActivationStoreWorker(storeManager.getActivationStore(),
33 explorationAdapter.getTransformations()); 38 explorationAdapter.getTransformations());
39 visualizationStore = storeManager.getVisualizationStore();
40 isVisualizationEnabled = visualizationStore != null;
34 } 41 }
35 42
36 private VersionWithObjectiveValue last = null; 43 private VersionWithObjectiveValue last = null;
@@ -39,21 +46,36 @@ public class BestFirstWorker {
39 46
40 public SubmitResult submit() { 47 public SubmitResult submit() {
41 if (explorationAdapter.checkExclude()) { 48 if (explorationAdapter.checkExclude()) {
42 last = null;
43 return new SubmitResult(false, false, null, null); 49 return new SubmitResult(false, false, null, null);
44 } 50 }
45 51
46 Version version = model.commit();
47 ObjectiveValue objectiveValue = explorationAdapter.getObjectiveValue();
48 var res = new VersionWithObjectiveValue(version, objectiveValue);
49 var code = stateCoderAdapter.calculateStateCode(); 52 var code = stateCoderAdapter.calculateStateCode();
50 var accepted = explorationAdapter.checkAccept();
51 53
52 boolean isNew = storeManager.getEquivalenceClassStore().submit(res, code, 54 boolean isNew = storeManager.getEquivalenceClassStore().submit(code);
53 activationStoreWorker.calculateEmptyActivationSize(), accepted); 55 if (isNew) {
56 Version version = model.commit();
57 ObjectiveValue objectiveValue = explorationAdapter.getObjectiveValue();
58 var versionWithObjectiveValue = new VersionWithObjectiveValue(version, objectiveValue);
59 last = versionWithObjectiveValue;
60 var accepted = explorationAdapter.checkAccept();
61
62 storeManager.getObjectiveStore().submit(versionWithObjectiveValue);
63 storeManager.getActivationStore().markNewAsVisited(versionWithObjectiveValue, activationStoreWorker.calculateEmptyActivationSize());
64 if(accepted) {
65 storeManager.solutionStore.submit(versionWithObjectiveValue);
66 }
67
68 if (isVisualizationEnabled) {
69 visualizationStore.addState(last.version(), last.objectiveValue().toString());
70 if (accepted) {
71 visualizationStore.addSolution(last.version());
72 }
73 }
74
75 return new SubmitResult(true, accepted, objectiveValue, last);
76 }
54 77
55 last = new VersionWithObjectiveValue(version, objectiveValue); 78 return new SubmitResult(false, false, null, null);
56 return new SubmitResult(isNew, accepted, objectiveValue, last);
57 } 79 }
58 80
59 public void restoreToLast() { 81 public void restoreToLast() {
@@ -65,7 +87,11 @@ public class BestFirstWorker {
65 public VersionWithObjectiveValue restoreToBest() { 87 public VersionWithObjectiveValue restoreToBest() {
66 var bestVersion = storeManager.getObjectiveStore().getBest(); 88 var bestVersion = storeManager.getObjectiveStore().getBest();
67 if (bestVersion != null) { 89 if (bestVersion != null) {
90 var oldVersion = model.getState();
68 this.model.restore(bestVersion.version()); 91 this.model.restore(bestVersion.version());
92 if (isVisualizationEnabled) {
93 visualizationStore.addTransition(oldVersion, last.version(), "");
94 }
69 } 95 }
70 return bestVersion; 96 return bestVersion;
71 } 97 }
@@ -91,14 +117,25 @@ public class BestFirstWorker {
91 } 117 }
92 } 118 }
93 119
94 record RandomVisitResult(SubmitResult submitResult, boolean shouldRetry) { 120 public record RandomVisitResult(SubmitResult submitResult, boolean shouldRetry) {
95 } 121 }
96 122
97 public RandomVisitResult visitRandomUnvisited(Random random) { 123 public RandomVisitResult visitRandomUnvisited(Random random) {
98 if (!model.hasUncommittedChanges()) { 124 if (!model.hasUncommittedChanges()) {
125 queryAdapter.flushChanges();
99 var visitResult = activationStoreWorker.fireRandomActivation(this.last, random); 126 var visitResult = activationStoreWorker.fireRandomActivation(this.last, random);
127
100 if (visitResult.successfulVisit()) { 128 if (visitResult.successfulVisit()) {
101 return new RandomVisitResult(submit(), visitResult.mayHaveMore()); 129 Version oldVersion = null;
130 if (isVisualizationEnabled) {
131 oldVersion = last.version();
132 }
133 var submitResult = submit();
134 if (isVisualizationEnabled && submitResult.newVersion() != null) {
135 var newVersion = submitResult.newVersion().version();
136 visualizationStore.addTransition(oldVersion, newVersion, "");
137 }
138 return new RandomVisitResult(submitResult, visitResult.mayHaveMore());
102 } else { 139 } else {
103 return new RandomVisitResult(null, visitResult.mayHaveMore()); 140 return new RandomVisitResult(null, visitResult.mayHaveMore());
104 } 141 }
diff --git a/subprojects/store-dse/src/main/java/tools/refinery/store/dse/transition/statespace/EquivalenceClassStore.java b/subprojects/store-dse/src/main/java/tools/refinery/store/dse/transition/statespace/EquivalenceClassStore.java
index bbe26fe5..28d1488b 100644
--- a/subprojects/store-dse/src/main/java/tools/refinery/store/dse/transition/statespace/EquivalenceClassStore.java
+++ b/subprojects/store-dse/src/main/java/tools/refinery/store/dse/transition/statespace/EquivalenceClassStore.java
@@ -10,6 +10,7 @@ import tools.refinery.store.statecoding.StateCoderResult;
10 10
11public interface EquivalenceClassStore { 11public interface EquivalenceClassStore {
12 boolean submit(VersionWithObjectiveValue version, StateCoderResult stateCoderResult, int[] emptyActivations, boolean accept); 12 boolean submit(VersionWithObjectiveValue version, StateCoderResult stateCoderResult, int[] emptyActivations, boolean accept);
13 boolean submit(StateCoderResult stateCoderResult);
13 boolean hasUnresolvedSymmetry(); 14 boolean hasUnresolvedSymmetry();
14 void resolveOneSymmetry(); 15 void resolveOneSymmetry();
15 int getNumberOfUnresolvedSymmetries(); 16 int getNumberOfUnresolvedSymmetries();
diff --git a/subprojects/store-dse/src/main/java/tools/refinery/store/dse/transition/statespace/internal/AbstractEquivalenceClassStore.java b/subprojects/store-dse/src/main/java/tools/refinery/store/dse/transition/statespace/internal/AbstractEquivalenceClassStore.java
index 8466a0f3..b5087e86 100644
--- a/subprojects/store-dse/src/main/java/tools/refinery/store/dse/transition/statespace/internal/AbstractEquivalenceClassStore.java
+++ b/subprojects/store-dse/src/main/java/tools/refinery/store/dse/transition/statespace/internal/AbstractEquivalenceClassStore.java
@@ -22,6 +22,13 @@ public abstract class AbstractEquivalenceClassStore implements EquivalenceClassS
22 protected abstract boolean tryToAdd(StateCoderResult stateCoderResult, VersionWithObjectiveValue newVersion, 22 protected abstract boolean tryToAdd(StateCoderResult stateCoderResult, VersionWithObjectiveValue newVersion,
23 int[] emptyActivations, boolean accept); 23 int[] emptyActivations, boolean accept);
24 24
25 public abstract boolean tryToAdd(StateCoderResult stateCoderResult);
26
27 @Override
28 public boolean submit(StateCoderResult stateCoderResult) {
29 return tryToAdd(stateCoderResult);
30 }
31
25 @Override 32 @Override
26 public synchronized boolean submit(VersionWithObjectiveValue version, StateCoderResult stateCoderResult, 33 public synchronized boolean submit(VersionWithObjectiveValue version, StateCoderResult stateCoderResult,
27 int[] emptyActivations, boolean accept) { 34 int[] emptyActivations, boolean accept) {
diff --git a/subprojects/store-dse/src/main/java/tools/refinery/store/dse/transition/statespace/internal/ActivationStoreImpl.java b/subprojects/store-dse/src/main/java/tools/refinery/store/dse/transition/statespace/internal/ActivationStoreImpl.java
index 3e59b21a..4d775b5a 100644
--- a/subprojects/store-dse/src/main/java/tools/refinery/store/dse/transition/statespace/internal/ActivationStoreImpl.java
+++ b/subprojects/store-dse/src/main/java/tools/refinery/store/dse/transition/statespace/internal/ActivationStoreImpl.java
@@ -29,7 +29,7 @@ public class ActivationStoreImpl implements ActivationStore {
29 successful[0] = true; 29 successful[0] = true;
30 List<ActivationStoreEntry> result = new ArrayList<>(emptyEntrySizes.length); 30 List<ActivationStoreEntry> result = new ArrayList<>(emptyEntrySizes.length);
31 for(int emptyEntrySize : emptyEntrySizes) { 31 for(int emptyEntrySize : emptyEntrySizes) {
32 result.add(ActivationStoreListEntry.create(emptyEntrySize)); 32 result.add(ActivationStoreEntry.create(emptyEntrySize));
33 } 33 }
34 return result; 34 return result;
35 }); 35 });
@@ -66,10 +66,10 @@ public class ActivationStoreImpl implements ActivationStore {
66 activation = -1; 66 activation = -1;
67 } 67 }
68 68
69 if(hasMoreInActivation) { 69 if(!hasMoreInActivation) {
70 boolean hasMoreInOtherTransformation = false; 70 boolean hasMoreInOtherTransformation = false;
71 for (var e : entries) { 71 for (var e : entries) {
72 if (e != entry && e.getNumberOfVisitedActivations() > 0) { 72 if (e != entry && e.getNumberOfUnvisitedActivations() > 0) {
73 hasMoreInOtherTransformation = true; 73 hasMoreInOtherTransformation = true;
74 break; 74 break;
75 } 75 }
@@ -83,7 +83,7 @@ public class ActivationStoreImpl implements ActivationStore {
83 actionWhenAllActivationVisited.accept(from); 83 actionWhenAllActivationVisited.accept(from);
84 } 84 }
85 85
86 return new VisitResult(false, hasMore, transformation, activation); 86 return new VisitResult(successfulVisit, hasMore, transformation, activation);
87 } 87 }
88 88
89 @Override 89 @Override
@@ -108,6 +108,11 @@ public class ActivationStoreImpl implements ActivationStore {
108 sum1 += entry.getNumberOfUnvisitedActivations(); 108 sum1 += entry.getNumberOfUnvisitedActivations();
109 } 109 }
110 110
111 if(sum1 == 0) {
112 this.actionWhenAllActivationVisited.accept(version);
113 return new VisitResult(false, false, -1, -1);
114 }
115
111 int selected = random.nextInt(sum1); 116 int selected = random.nextInt(sum1);
112 int sum2 = 0; 117 int sum2 = 0;
113 int transformation = 0; 118 int transformation = 0;
@@ -116,7 +121,7 @@ public class ActivationStoreImpl implements ActivationStore {
116 var entry = entries.get(transformation); 121 var entry = entries.get(transformation);
117 int unvisited = entry.getNumberOfUnvisitedActivations(); 122 int unvisited = entry.getNumberOfUnvisitedActivations();
118 if (selected < sum2 + unvisited) { 123 if (selected < sum2 + unvisited) {
119 activation = sum2 + unvisited - selected; 124 activation = sum2 + unvisited - selected - 1;
120 break; 125 break;
121 } else { 126 } else {
122 sum2 += unvisited; 127 sum2 += unvisited;
diff --git a/subprojects/store-dse/src/main/java/tools/refinery/store/dse/transition/statespace/internal/ActivationStoreWorker.java b/subprojects/store-dse/src/main/java/tools/refinery/store/dse/transition/statespace/internal/ActivationStoreWorker.java
index e05f5122..881b133c 100644
--- a/subprojects/store-dse/src/main/java/tools/refinery/store/dse/transition/statespace/internal/ActivationStoreWorker.java
+++ b/subprojects/store-dse/src/main/java/tools/refinery/store/dse/transition/statespace/internal/ActivationStoreWorker.java
@@ -8,7 +8,6 @@ package tools.refinery.store.dse.transition.statespace.internal;
8import tools.refinery.store.dse.transition.Transformation; 8import tools.refinery.store.dse.transition.Transformation;
9import tools.refinery.store.dse.transition.VersionWithObjectiveValue; 9import tools.refinery.store.dse.transition.VersionWithObjectiveValue;
10import tools.refinery.store.dse.transition.statespace.ActivationStore; 10import tools.refinery.store.dse.transition.statespace.ActivationStore;
11import tools.refinery.store.map.Version;
12 11
13import java.util.List; 12import java.util.List;
14import java.util.Random; 13import java.util.Random;
diff --git a/subprojects/store-dse/src/main/java/tools/refinery/store/dse/transition/statespace/internal/FastEquivalenceClassStore.java b/subprojects/store-dse/src/main/java/tools/refinery/store/dse/transition/statespace/internal/FastEquivalenceClassStore.java
index 6ee8e196..6d028124 100644
--- a/subprojects/store-dse/src/main/java/tools/refinery/store/dse/transition/statespace/internal/FastEquivalenceClassStore.java
+++ b/subprojects/store-dse/src/main/java/tools/refinery/store/dse/transition/statespace/internal/FastEquivalenceClassStore.java
@@ -16,12 +16,17 @@ public abstract class FastEquivalenceClassStore extends AbstractEquivalenceClass
16 16
17 private final MutableIntSet codes = IntSets.mutable.empty(); 17 private final MutableIntSet codes = IntSets.mutable.empty();
18 18
19 public FastEquivalenceClassStore(StateCoderStoreAdapter stateCoderStoreAdapter) { 19 protected FastEquivalenceClassStore(StateCoderStoreAdapter stateCoderStoreAdapter) {
20 super(stateCoderStoreAdapter); 20 super(stateCoderStoreAdapter);
21 } 21 }
22 22
23 @Override 23 @Override
24 protected boolean tryToAdd(StateCoderResult stateCoderResult, VersionWithObjectiveValue newVersion, int[] emptyActivations, boolean accept) { 24 protected synchronized boolean tryToAdd(StateCoderResult stateCoderResult, VersionWithObjectiveValue newVersion,
25 int[] emptyActivations, boolean accept) {
26 return this.codes.add(stateCoderResult.modelCode());
27 }
28
29 public synchronized boolean tryToAdd(StateCoderResult stateCoderResult) {
25 return this.codes.add(stateCoderResult.modelCode()); 30 return this.codes.add(stateCoderResult.modelCode());
26 } 31 }
27 32
diff --git a/subprojects/store-dse/src/main/java/tools/refinery/store/dse/transition/statespace/internal/ObjectivePriorityQueueImpl.java b/subprojects/store-dse/src/main/java/tools/refinery/store/dse/transition/statespace/internal/ObjectivePriorityQueueImpl.java
index 249b22da..2f3e142a 100644
--- a/subprojects/store-dse/src/main/java/tools/refinery/store/dse/transition/statespace/internal/ObjectivePriorityQueueImpl.java
+++ b/subprojects/store-dse/src/main/java/tools/refinery/store/dse/transition/statespace/internal/ObjectivePriorityQueueImpl.java
@@ -9,7 +9,6 @@ import tools.refinery.store.dse.transition.ObjectiveValues;
9import tools.refinery.store.dse.transition.VersionWithObjectiveValue; 9import tools.refinery.store.dse.transition.VersionWithObjectiveValue;
10import tools.refinery.store.dse.transition.objectives.Objective; 10import tools.refinery.store.dse.transition.objectives.Objective;
11import tools.refinery.store.dse.transition.statespace.ObjectivePriorityQueue; 11import tools.refinery.store.dse.transition.statespace.ObjectivePriorityQueue;
12import tools.refinery.store.map.Version;
13 12
14import java.util.Comparator; 13import java.util.Comparator;
15import java.util.List; 14import java.util.List;
@@ -37,32 +36,27 @@ public class ObjectivePriorityQueueImpl implements ObjectivePriorityQueue {
37 } 36 }
38 37
39 @Override 38 @Override
40 public void submit(VersionWithObjectiveValue versionWithObjectiveValue) { 39 public synchronized void submit(VersionWithObjectiveValue versionWithObjectiveValue) {
41 priorityQueue.add(versionWithObjectiveValue); 40 priorityQueue.add(versionWithObjectiveValue);
42 } 41 }
43 42
44 @Override 43 @Override
45 public void remove(VersionWithObjectiveValue versionWithObjectiveValue) { 44 public synchronized void remove(VersionWithObjectiveValue versionWithObjectiveValue) {
46 priorityQueue.remove(versionWithObjectiveValue); 45 priorityQueue.remove(versionWithObjectiveValue);
47 } 46 }
48 47
49 @Override 48 @Override
50 public int getSize() { 49 public synchronized int getSize() {
51 return priorityQueue.size(); 50 return priorityQueue.size();
52 } 51 }
53 52
54 @Override 53 @Override
55 public VersionWithObjectiveValue getBest() { 54 public synchronized VersionWithObjectiveValue getBest() {
56 var best = priorityQueue.peek(); 55 return priorityQueue.peek();
57 if (best != null) {
58 return best;
59 } else {
60 throw new IllegalArgumentException("The objective store is empty!");
61 }
62 } 56 }
63 57
64 @Override 58 @Override
65 public VersionWithObjectiveValue getRandom(Random random) { 59 public synchronized VersionWithObjectiveValue getRandom(Random random) {
66 int randomPosition = random.nextInt(getSize()); 60 int randomPosition = random.nextInt(getSize());
67 for (VersionWithObjectiveValue entry : this.priorityQueue) { 61 for (VersionWithObjectiveValue entry : this.priorityQueue) {
68 if (randomPosition-- == 0) { 62 if (randomPosition-- == 0) {
diff --git a/subprojects/store-dse/src/main/java/tools/refinery/store/dse/transition/statespace/internal/SolutionStoreImpl.java b/subprojects/store-dse/src/main/java/tools/refinery/store/dse/transition/statespace/internal/SolutionStoreImpl.java
index cc48864f..43548eaa 100644
--- a/subprojects/store-dse/src/main/java/tools/refinery/store/dse/transition/statespace/internal/SolutionStoreImpl.java
+++ b/subprojects/store-dse/src/main/java/tools/refinery/store/dse/transition/statespace/internal/SolutionStoreImpl.java
@@ -10,17 +10,17 @@ import tools.refinery.store.dse.transition.statespace.SolutionStore;
10 10
11import java.util.ArrayList; 11import java.util.ArrayList;
12import java.util.List; 12import java.util.List;
13import java.util.SortedSet; 13import java.util.PriorityQueue;
14import java.util.TreeSet; 14
15 15
16public class SolutionStoreImpl implements SolutionStore { 16public class SolutionStoreImpl implements SolutionStore {
17 final int maxNumberSolutions; 17 final int maxNumberSolutions;
18 public static final int UNLIMITED = -1; 18 public static final int UNLIMITED = -1;
19 final SortedSet<VersionWithObjectiveValue> solutions; 19 final PriorityQueue<VersionWithObjectiveValue> solutions;
20 20
21 public SolutionStoreImpl(int maxNumberSolutions) { 21 public SolutionStoreImpl(int maxNumberSolutions) {
22 this.maxNumberSolutions = maxNumberSolutions; 22 this.maxNumberSolutions = maxNumberSolutions;
23 solutions = new TreeSet<>(ObjectivePriorityQueueImpl.c1); 23 solutions = new PriorityQueue<>(ObjectivePriorityQueueImpl.c1.reversed());
24 } 24 }
25 25
26 26
@@ -29,8 +29,7 @@ public class SolutionStoreImpl implements SolutionStore {
29 boolean removeLast = hasEnoughSolution(); 29 boolean removeLast = hasEnoughSolution();
30 solutions.add(version); 30 solutions.add(version);
31 if(removeLast) { 31 if(removeLast) {
32 var last = solutions.last(); 32 var last = solutions.poll();
33 solutions.remove(last);
34 return last != version; 33 return last != version;
35 } else { 34 } else {
36 return true; 35 return true;